是否有一种有效的算法可以找到一般椭圆中像素的指示?
本质上,我想做的是在二维数组中找到索引,该数组对应于跨越可能数组索引的“二维表面”的参数化椭圆。就像我上面的第一个问题一样,这个问题可以与椭圆的光栅化进行比较。
我找到了一些扫描线算法,它们可以对轴对齐的椭圆执行我想要的操作,但现在我想知道对于倾斜和旋转的椭圆是否有类似的算法。必须有,因为那里的矢量图形软件设法填充倾斜和/或旋转的椭圆。
为了澄清我的意思,我最近在这里解决了一个类似的问题:二维数组中的特殊多边形for循环
/缺口
是否有一种有效的算法可以找到一般椭圆中像素的指示?
本质上,我想做的是在二维数组中找到索引,该数组对应于跨越可能数组索引的“二维表面”的参数化椭圆。就像我上面的第一个问题一样,这个问题可以与椭圆的光栅化进行比较。
我找到了一些扫描线算法,它们可以对轴对齐的椭圆执行我想要的操作,但现在我想知道对于倾斜和旋转的椭圆是否有类似的算法。必须有,因为那里的矢量图形软件设法填充倾斜和/或旋转的椭圆。
为了澄清我的意思,我最近在这里解决了一个类似的问题:二维数组中的特殊多边形for循环
/缺口
您可以使用您找到的用于栅格化椭圆的算法,并在测试它们是在椭圆内部还是外部之前简单地对坐标应用旋转或倾斜变换。例如,如果你想测试一个旋转 45 度的椭圆,你可以这样做:
for (x = 0; x < maxX; x++)
{
for (y = 0; y < maxY; y++)
{
double newX, newY;
Transform (x, y, rotationMatrix, &newX, &newY);
if (PointInEllipse (newX, newY, ellipse))
{
...do whatever here....
}
}
}
其中,Transform 只是将 2x2 旋转矩阵应用于 x 和 y,并将结果放入 newX,newY。
我建议对椭圆进行三角测量并使用标准的三角形填充例程,大多数图形 API 都是这样完成的,因为 OpenGL 和 DirectX 往往只能在一天结束时绘制三角形。
椭圆的简单三角剖分看起来像比萨饼,只是向外缩放。如果您需要更高的质量,您只需增加比萨饼的切片数。