gpt4 book ai didi

c - 填充多边形

转载 作者:太空宇宙 更新时间:2023-11-04 03:36:59 25 4
gpt4 key购买 nike

我创建了这个函数来绘制一个具有 n 个顶点的简单多边形:

void polygon (int n)
{
double pI = 3.141592653589;
double area = min(width / 2, height / 2);
int X = 0, Y = area - 1;
double offset = Y;
int lastx, lasty;

double radius = sqrt(X * X + Y * Y);
double quadrant = atan2(Y, X);

int i;

for (i = 1; i <= n; i++)
{
lastx = X; lasty = Y;
quadrant = quadrant + pI * 2.0 / n;

X = round((double)radius * cos(quadrant));
Y = round((double)radius * sin(quadrant));

setpen((i * 255) / n, 0, 0, 0.0, 1); // r(interval) g b, a, size

moveto(offset + lastx, offset + lasty); // Moves line offset
lineto(offset + X, offset + Y); // Draws a line from offset
}
}

如何用纯色填充它?我不知道如何修改我的代码才能绘制它。

最佳答案

填充形状的常用方法是找到多边形的边缘与每个 x 或每个 y 坐标相交的位置。通常,使用 y 坐标,以便可以使用水平线完成填充。 (在像 VGA 这样的帧缓冲设备上,水平线比垂直线快,因为它们使用连续的内存/帧缓冲地址。)

在这种情况下,

void fill_regular_polygon(int center_x, int center_y, int vertices, int radius)
{
const double a = 2.0 * 3.14159265358979323846 / (double)vertices;
int i = 1;
int y, px, py, nx, ny;

if (vertices < 3 || radius < 1)
return;

px = 0;
py = -radius;
nx = (int)(0.5 + radius * sin(a));
ny = (int)(0.5 - radius * cos(a));
y = -radius;

while (y <= ny || ny > py) {
const int x = px + (nx - px) * (y - py) / (ny - py);
if (center_y + y >= 0 && center_y + y < height) {
if (center_x - x >= 0)
moveto(center_x - x, center_y + y);
else
moveto(0, center_y + y);
if (center_x + x < width)
lineto(center_x + x, center_y + y);
else
lineto(width - 1, center_y + y);
}
y++;
while (y > ny) {
if (nx < 0)
return;
i++;
px = nx;
py = ny;
nx = (int)(0.5 + radius * sin(a * (double)i));
ny = (int)(0.5 - radius * cos(a * (double)i));
}
}
}

请注意,我仅使用简单的 SVG 生成器测试了上述内容,并将绘制的线条与多边形进行了比较。似乎工作正常,但使用风险自负;没有保证。

对于一般形状,使用您最喜欢的搜索引擎查找“多边形填充”算法。例如,this , this , this , 和 this .

关于c - 填充多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31799038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com