S02E08:判断多边形是否是凸多边形

1,533 阅读1分钟

说明

简单多边形又分凸多边形和凹多边形。有时我们需要区分它们。

凸多边形(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
}