多边形类

const Point=require('./Point')
const Line=require('./Line')
//多边形类
function Polygon(a) {
    if(this instanceof Polygon){
        this.n=a.length;
        this.a=a;
    }else{
        if(a.every(function (item) {
            return item instanceof Point
        })){
            return new Polygon(a)
        }else{
            throw 'Polygon 参数错误'
        }
    }
}
//计算多边形周长
Polygon.prototype.perimeter=function(){
    let sum=0;
    for (let i=0;i<this.n;i++){
        sum=sum+Point.sub(this.a[(i+1)%this.n],this.a[i]).norm();
    }
    return sum;
}
//计算多边形面积
Polygon.prototype.area=function () {
    let sum=0;
    for(let i=0;i<this.n;i++){
        sum=sum+Point.det(this.a[((i+1)%this.n)],this.a[i])
    }
    return sum/2
}
//判断点是否在多边形内部
Polygon.prototype.pointIn=function (t) {
    let num=0;
    const a=this.a;
    const n=this.n;
    for(let i=0;i<n;i++){
        if(Line.pointOnSegment(t,a[i],a[(i+1)%n])){
            return 2;
        }
        const k=Math.cmp(Point.det(Point.sub(a[(i+1)%n],a[i]),Point.sub(t,a[i])))
        const d1=Math.cmp(a[i].y-t.y);
        const d2=Math.cmp(a[(i+1)%n].y-t.y);
        if(k>0&&d1<=0&&d2>0){
            num++
        }
        if(k<0&&d2<=0&&d1>0){
            num++
        }
    }
    return num!==0;
}
module.exports=Polygon;

//demo
const poly=Polygon([Point(-1,0),Point(0,1),Point(1,0),Point(0,-1),])
console.log(poly.area())
console.log(poly.pointIn(Point(0,0)))

猜你喜欢

转载自www.cnblogs.com/caoke/p/10531355.html