【问题标题】:A working implementation of the Sutherland–Hodgman algorithm in C?Sutherland–Hodgman 算法在 C 中的工作实现?
【发布时间】:2012-08-27 14:30:15
【问题描述】:

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

我能找到的最好的 C 实现是this one,它看起来完美且速度极快,但不幸的是,它在某些输入上崩溃,而且我不够聪明,无法确定算法中的确切内容出错(它适用于某些输入值并与其他值中断)。这是导致它崩溃的四边形的一些值的示例:

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 点多边形)。

【问题讨论】:

  • 崩溃到底是什么意思?我假设这是一个分段错误?您可以使用调试器吗?

标签: algorithm geometry 2d


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-03-07
      • 2011-12-04
      • 2015-04-23
      • 2015-07-20
      • 2015-10-01
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多