Draw a polygon in C
我需要画一个"n"边的多边形,给出2个点(中心和顶点的1),这就是我在数学上的理解。我读了很多书,所有这些都是我能理解的(我不知道它是否正确):
好,我用毕达哥拉斯定理计算两点(半径)之间的距离:
这两个点与atan2之间的夹角,如下所示:
其中xc,yc是中心点,x,y是唯一知道的顶点。
有了这些数据,我可以:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | void polygon(int xc, int yc, int radius, double angle, int sides) { int i; double ang = 360/sides; //Every vertex is about"ang" degrees from each other radian = 180/M_PI; int points_x[7]; //Here i store the calculated vertexs int points_y[7]; //Here i store the calculated vertexs /*Here i calculate the vertexs of the polygon*/ for(i=0; i<sides; i++) { points_x[i] = xc + ceil(radius * cos(angle/radian)); points_y[i] = yc + ceil(radius * sin(angle/radian)); angle = angle+ang; } /*Here i draw the polygon with the know vertexs just calculated*/ for(i=0; i<sides-1; i++) line(points_x[i], points_y[i], points_x[i+1], points_y[i+1]); line(points_y[i], points_x[i], points_x[0], points_y[0]); } |
问题是程序不能正常工作,因为它画的线不像多边形。
有人对数学有足够的了解吗?我使用C和Turbo C在这个图形原语中工作。
编辑:我不想填充多边形,只需要画出来。
如果
完全不需要使用度数-使用
也可以通过使用模函数(模块n侧面)省略最后一行。
如果你有超过7个边,你将无法存储所有的点。你不需要存储所有的点,如果你只是画多边形,而不是存储它-只是最后一个点和当前的一个。
你应该在所有的计算中使用弧度。下面是一个完整的程序,说明了如何最好地做到这一点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <stdio.h> #define PI 3.141592653589 static void line (int x1, int y1, int x2, int y2) { printf ("Line from (%3d,%3d) - (%3d,%3d) ", x1, y1, x2, y2); } static void polygon (int xc, int yc, int x, int y, int n) { int lastx, lasty; double r = sqrt ((x - xc) * (x - xc) + (y - yc) * (y - yc)); double a = atan2 (y - yc, x - xc); int i; for (i = 1; i <= n; i++) { lastx = x; lasty = y; a = a + PI * 2 / n; x = round ((double)xc + (double)r * cos(a)); y = round ((double)yc + (double)r * sin(a)); line (lastx, lasty, x, y); } } int main(int argc, char* argv[]) { polygon (0,0,0,10,4); // A diamond. polygon (0,0,10,10,4); // A square. polygon (0,0,0,10,8); // An octagon. return 0; } |
哪些输出(这里没有花哨的图形,但您应该了解这个想法):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | === Line from ( 0, 10) - (-10, 0) Line from (-10, 0) - ( 0,-10) Line from ( 0,-10) - ( 10, 0) Line from ( 10, 0) - ( 0, 10) === Line from ( 10, 10) - (-10, 10) Line from (-10, 10) - (-10,-10) Line from (-10,-10) - ( 10,-10) Line from ( 10,-10) - ( 10, 10) === Line from ( 0, 10) - ( -7, 7) Line from ( -7, 7) - (-10, 0) Line from (-10, 0) - ( -7, -7) Line from ( -7, -7) - ( 0,-10) Line from ( 0,-10) - ( 7, -7) Line from ( 7, -7) - ( 10, 0) Line from ( 10, 0) - ( 7, 7) Line from ( 7, 7) - ( 0, 10) |
我已经按照您的原始规范编写了
- 它们对于半径是无用的(因为
-n 2 =n 2 对于所有n 来说。 - 它们不利于角度,因为这会迫使你进入一个特定的象限(错误的起点)。
1 2 3 4 5 6 7 8 9 10 |
或者,您可以将这些点保存在数组中,并在有DrawPoly例程的情况下调用它。
如果你想要一个填充的多边形,如果你有一个的话就叫FillPoly。
我认为主要的问题是:
你想画一个填充多边形,我猜?
如果你试图用线原语来画多边形,你会很痛苦。迪克罗克在这方面给了你一些很好的建议。
您最好的办法是找到一个为您填充的原语,并提供一个坐标列表。由你来决定坐标。
我不会只给你答案,但我有一些建议。首先,学习如何画线内外。当你把这个写下来时,试着写一个填充的三角形渲染器。通常,填充多边形一次绘制一条水平扫描线,从上到下。你的工作是确定每一条扫描线的起始和终止X坐标。请注意,多边形的边缘沿着直线(提示,提示)。:)