检测多边形内的CGPoint

我有一组构成多边形的CGPoint,我怎么能检测到一个CGPoint是在多边形的内部还是外部?

说,形状是一个三angular形,CGPoint是hoizontally移动,我怎么能检测当它越过三angular线?

我可以使用CGRectContainsPoint当形状是一个常规的四面形状,但我不明白我将如何做一个奇怪的形状。

你可以从你的点创build一个CG(Mutable)PathRef (或一个包装CGPathRef ),并使用CGPathContainsPoint函数来检查一个点是否在这个path中。 如果您使用UIBezierPath ,您也可以使用containsPoint:方法。

为此,您需要编写一个在多边形algorithm中实现点的方法。

这个方法将以N个点(多边形)作为参数和一个特定点。 如果点在多边形内,则返回true,否则返回false。

看到这个伟大的答案

这里是Swift的实现:

 extension CGPoint { func isInsidePolygon(vertices:[CGPoint]) -> Bool { var i = 0, j = 0, c = false, vi:CGPoint, vj:CGPoint for (i = 0, j = vertices.count-1; i < vertices.count; j = i++) { vi = vertices[i] vj = vertices[j] if ( ((vi.y > y) != (vj.y > y)) && (x < (vj.x - vi.x) * (y - vi.y) / (vj.y - vi.y) + vi.x) ) { c = !c; } } return c } } 

Swift 3

使用Swift 3更简单的方法是使用UIBezierPath contains方法。

创buildCAShapeLayer的实例时,请确保设置accessibilityPath

 shapeLayer.path = bazierPath.cgPath shapeLayer.accessibilityPath = bazierPath 

检查path是否包含触摸位置。

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard let point = touches.first?.location(in: self) else { return } for shape in layer.sublayers ?? [] where shape is CAShapeLayer { guard let layer = shape as? CAShapeLayer, let bazier = layer.accessibilityPath else { continue } // Handle touch print(bazier.contains(point)) } }