我需要测试一个点是否击中带有孔和岛的多边形。我想了解我应该如何做到这一点。这没有记录,我找不到任何解释或示例。
我所做的是计算+1
每个外部多边形命中和-1
每个内部多边形命中。结果总和为:
- > 0:命中;
- <= 0:未命中(在洞外或洞内)。
该类根据绕组数HitData
分隔路径orientation
,以避免不必要的重新计算. Clipper.PointInPolygon()
应用于每条路径,总和很容易计算。
但有两个主要缺点:
- 我必须
Clipper.PointInPolygon()
申请每条 路径; - 我无法利用
PolyTree
.
有使用 Clipper ( @angus-johnson ?)亲身体验的人可以解决这个困惑吗?
同样,我的问题是:我应该如何实现这个?我是否在重新发明轮子,而 Clipper 库中有现成的实际解决方案?
旁注:
PolyTree
仍然需要测试每条 路径以确定PolyNode
点所在的位置。没有Clipper.PointInPolyTree()
方法,因此,AFAIKPolyTree
没有帮助。
分隔外多边形和内多边形的结构:
public class HitData
{
public List<List<IntPoint>> Outer, Inner;
public HitData(List<List<IntPoint>> paths)
{
Outer = new List<List<IntPoint>>();
Inner = new List<List<IntPoint>>();
foreach (List<IntPoint> path in paths)
{
if (Clipper.Orientation(path))
{
Outer.Add(path);
} else {
Inner.Add(path);
}
}
}
}
这是测试点的算法:
public static bool IsHit(HitData data, IntPoint point)
{
int hits;
hits = 0;
foreach (List<IntPoint> path in data.Outer)
{
if (Clipper.PointInPolygon(point, path) != 0)
{
hits++;
}
}
foreach (List<IntPoint> path in data.Inner)
{
if (Clipper.PointInPolygon(point, path) != 0)
{
hits--;
}
}
return hits > 0;
}