说明
简单多边形又分凸多边形和凹多边形。有时我们需要区分它们。
凸多边形(Convex Polygon)指如果把一个多边形的所有边中,任意一条边向两方无限延长成为一直线时,其他各边都在此直线的同旁,那么这个多边形就叫做凸多边形,其内角应该全不是优角,任意两个顶点间的线段位于多边形的内部或边上。
几何
判断方法有很多种,这里我们用顶点凹凸性法来判断,简单地说:判断每个顶点处的法线,如果方向一致(都大于 0,或者都小于 0),则说明是凸多边形。
可以形象地把多边形的边想象成一条不断转弯的公路,当我们沿着固定方向前进时,要么只有左转(逆时针方向开车),要么只有右转(顺时针方向开车)。
代码
///是否是凸多边形
static func isConvex(polygon:Polygon) -> Bool {
if !isPolygon(points: polygon.points) {
return false
}
var preview = polygon.points[polygon.count-2]
var middle = polygon.points.last!
var vector1 = middle - preview
var lastCrossValue = simd_float3.zero
for point in polygon.points {
let vector2 = point - middle
let crossValue = cross(vector1, vector2)
let sameDirection = dot(lastCrossValue, crossValue)
if sameDirection < 0 {
return false
}
preview = middle
middle = point
vector1 = vector2
if !crossValue.tooLittleToBeNormalized() {
lastCrossValue = crossValue
}
}
return true
}