1

我正在努力寻找一个好的 Sutherland–Hodgman 算法的有效实现,用于通过另一个多边形的边缘裁剪一个多边形。输入多边形始终是由四个点组成的四边形。

我能找到的最好的C 实现是这个看起来完美且速度极快的实现,但不幸的是,它在某些输入上崩溃,而且我不够聪明,无法确定算法中究竟出了什么问题(它适用于一些输入值和中断和其他人)。这是使其崩溃的四边形的一些值的示例:

vec_t c[] = {{400,400}, {200,200}, {400,200}, {200,400}};
vec_t s[] = {{300,300}, {100,100}, {300,100}, {100,300}};

poly_t clipper = {4, 0, c};
poly_t subject = {4, 0, s};

poly res = poly_clip(&subject, &clipper);

任何人都可以提出该算法的问题或建议可以使用相同样式的输入(轮廓点)的更好的实现吗?C 是首选,但只要实现了所有步骤,我就可以使用任何实现(我将不得不用 C 重写它)。在渲染二维四边形时,我需要它来执行数学裁剪。

在上面的例子中,输入四边形都是矩形,但实际上它们可以是任何凸四边形。输出可以是 3 到 8 点之间的任何值(上面的示例应该发出 4 点多边形)。

4

2 回答 2

4

裁剪点必须定义一个凸多边形。您的观点似乎按照他们定义的数字 8 的顺序排列。尝试: vec_t c[] = {{400,400}, {400,200}, {200,200}, {200,400}};

见算法描述:http ://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman

于 2013-03-27T21:07:02.920 回答
0

您的积分必须按逆时针顺序排列...

于 2016-01-29T16:54:00.283 回答