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;
},
//计算多边形面积
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
},
//判断点是否在多边形内部
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;
}
}
// 多边形的重心
Polygon.prototype.massCenter=function () {
let n=this.n;
let a=this.a;
let ans=Point(0,0);
if(Math.cmp(this.area())===0){
return ans;
}
for(let i=0;i<n;i++){
ans=Point.add(ans,Point.multiply(Point.add(a[i],a[(i+1)%n]),Point.det(a[(i+1)%n],a[i])));
}
return Point.divide(ans,this.area()*6)
}
module.exports=Polygon;
//demo
// const poly=Polygon([Point(-2,-1),Point(0,0),Point(1,-1),Point(0,-2),])
// console.log(poly.area())
// console.log(poly.pointIn(Point(0,0)))
// console.log(poly.massCenter());