c - 在C中绘制多边形

标签 c graphics polygon primitive atan2

我需要在给定 2 个点(中心点和顶点的 1 个点)的情况下绘制一个“n”条边的多边形,只是我的数学很烂。我已经阅读了很多书,所有这些都是我能够理解的(我不知道它是否正确):

好的,我用毕达哥拉斯定理计算两点之间的距离(半径):

sqrt(pow(abs(x - xc), 2) + pow(abs(y - yc), 2));

以及这 2 个点与 atan2 之间的角度,如下所示:

atan2(abs(y - yc), abs(x - xc));

其中 xc, yc 是中心点,x, y 是唯一知道的顶点。

使用这些数据我可以:

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 处理这个图形原语。


编辑:我不想填充多边形,只是绘制它。

最佳答案

如果 sides 不是 360 的因数,请考虑 360/sides 实际返回的内容(这是整数除法 - 查看 360/7 实际返回的内容)。

根本不需要使用度数 - 使用 2*Math_PI/(double)nsides 并始终以弧度表示。

您也可以使用取模函数(module nsides)省略最后一行。

如果您有超过 7 个面,您将无法存储所有点。如果您只是绘制多边形而不是存储多边形,则不需要存储所有点 - 只需最后一个点和当前点。

关于c - 在C中绘制多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1794489/

相关文章:

python - 使用 Voronoi 图查找多边形的中线

将指针转换为 float 或指向带有指针参数的函数

c - 命令中命令行选项的不同顺序影响我的输出

opengl - 从深度缓冲区获取真实的 z 值

java - 旋转 java2d 形状而不丢失其原点

algorithm - 如何找到包含一组点的最复杂的凸多边形?

可以使用 strcpy 但不能使用 strcat 的情况

c++ - 当相应字符不在同一位置时字符串的所有排列

c - 如何在用 C 编写的 GLUT 程序上设置关闭操作? (如左上角红色按钮工作)

c++ - 测试严格简单的多边形(允许有孔)?