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
今日推荐
周排行