我需要使用凹多边形。基本上我需要知道它们的宽度和高度,一种方法来知道一个点是否在多边形内,以及可能是包围它的矩形的 x,y 坐标(这样我就可以轻松实现拖放功能)。我可以使用什么?
我可以定义一个自定义的多边形类型,但是考虑到多边形是凹的,我在实现“包含”经典方法时会遇到问题。
建议?
您可以使用Shape
Class ,尤其是与这些对象交互特别简单,但如果您要处理数千条边,我建议使用Polygon
Class,这是一个可用于在屏幕上渲染矢量图形的可视对象,DrawingVisual
并且它的RenderOpen
方法。
DrawingVisual
不提供事件处理,所以如果Shape
你可以使用事件与边缘交互,DrawingVisual
你需要实现Hit-Testing。
Polygon
了解Height
并简单地使用Width
元素属性。
如果要检查 aPoint
是否在多边形内,可以使用InputHitTest
Method或 esle VisualTreeHelper.HitTest
Method:
let res = yourPolygon.InputHitTest(new Point(x, y))
let res = VisualTreeHelper.HitTest(yourPolygon, new Point(x, y))
总之:如果您寻求一种优雅的方法来检查一个点是否在多边形内,请查看此答案。
您可以使用System.Drawing.Drawing2D.GraphicsPath
:
GraphicsPath path = new GraphicsPath();
path.AddPolygon(new[] {new Point(0,1), new Point(5,8), new Point(2,4)});
bool isPointInPolygon = path.IsVisible(4, 1);
有一些很好的例程可以确定一个点是否在多边形内。查看http://www.softsurfer.com/Archive/algorithm_0103/algorithm_0103.htm