二分法快速判断点是不是在凸多边形内

    public func isInside(point:CGPoint, con:[CGPoint]) -> Bool{
        if con.count < 3 {
            return false
        }
        
        if multiply(sp: point, ep: con[1], op: con[0]) < 0{
            return false
        }
        
        if multiply(sp: point, ep: con[con.count-1], op: con[0]) < 0{
            return false
        }
        
        var i = 2
        var j = con.count - 1
        var line = -1
        while i <= j {
            let mid = (i+j)>>1
            if multiply(sp: point, ep: con[mid], op: con[0]) > 0{
                line = mid
                j = mid - 1
            }else{
                i = mid + 1
            }
        }
        return multiply(sp: point, ep: con[line], op: con[line-1]) < 0
    }
/*
 r=multiply(sp,ep,op),得到(sp-op)和(ep-op)的叉积
 r>0:ep在矢量opsp的逆时针方向;
 r=0:opspep三点共线;
 r<0:ep在矢量opsp的顺时针方向
 */
public func multiply(sp:CGPoint,ep:CGPoint,op:CGPoint) -> CGFloat{
    return (sp.x - op.x)*(ep.y - op.y) - (ep.x - op.x)*(sp.y - op.y)
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容