3

我使用了以下代码: http ://www.amphibian.com/blogstuff/collision.html 。在 html 测试文件中,我将第一个三角形更改为

triangle1.addPoint({"x":-20, "y":-20});
triangle1.addPoint({"x":-20, "y":20});
triangle1.addPoint({"x":20, "y":20});
triangle1.addPoint({"x":20, "y":10});
triangle1.addPoint({"x":10, "y":10});
triangle1.addPoint({"x":10, "y":-20});

现在,当我在交叉之前将另一个三角形移动到这个形状内时,它会给我错误的交叉点。知道问题出在哪里吗?

4

2 回答 2

9

好吧,我为其他想玩这个的人设置了一个小提琴。结果如下:

问题交叉口的演示

该脚本使用分离轴定理或(如维基百科所说)超平面分离定理,如以下来源中所述polygon.js

/*
 *  To detect intersection with another Polygon object, this
 *  function uses the Separating Axis Theorem. It returns false
 *  if there is no intersection, or an object if there is. The object
 *  contains 2 fields, overlap and axis. Moving the polygon by overlap
 *  on axis will get the polygons out of intersection.
 */
Polygon.prototype.intersectsWith = function(other) {

该定理仅适用于凸多边形。你的形状不是凸的,因为它有一个“凹痕”。这就是脚本错误地报告形状相交的原因。如果您需要使其适用于凹形,则必须首先将凹形拆分为单独的凸形部分,然后将该定理应用于所有单独的部分。显然,这使脚本更加复杂,因为您需要遍历两个形状的凹面部分的叉积。

于 2012-05-31T18:03:19.677 回答
0

这是我找到两个多边形的交叉多边形的不太复杂的实现。

它适用于凸多边形和凹多边形,但不适用于复杂(自相交)多边形。算法与Margalit & Knott中提出的算法非常相似。

它的复杂度约为 4*n1*n2,其中 n1 和 n2 是多边形中正在计算其交点的顶点数。

它是一个独立的 .js 文件。“多边形”被视为任何 2D 点的 javascript 数组。“点”是具有 x 和 y 数字属性的任何 javascript 对象。

在现有功能之上实现联合功能应该不是问题,我可能很快就会这样做。

二维多边形的交集

于 2014-04-14T14:07:37.120 回答