【发布时间】:2019-07-10 10:34:40
【问题描述】:
我需要测试一个点是否撞击带有孔和岛的多边形。我想了解我应该如何做到这一点。这没有记录在案,我找不到任何解释或示例。
我所做的是为每个外部多边形命中计数+1,为每个内部多边形命中计数-1。结果总和是:
- > 0:命中;
HitData 类根据缠绕数分隔 路径,以避免不必要地重新计算 orientation。将Clipper.PointInPolygon() 应用于每个路径,总和很容易计算。
但有两个主要缺点:
- 我必须将
Clipper.PointInPolygon()应用于EVERY 路径; - 我无法利用
PolyTree的层次结构。
有过 Clipper 实践经验的人 (@angus-johnson?) 能解决这个困惑吗?
再次,我的问题是:我应该如何实现这一点?我是否在重新发明轮子,而 Clipper 库中有现成的实际解决方案?
旁注:
PolyTree仍然需要测试 EVERY path 以确定该点在哪个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;
}
【问题讨论】:
标签: clipperlib