const Point=require('./Point')
//计算几何线段类
function Line(a,b) {
if(this instanceof Line){
this.a=a;
this.b=b;
}else{
if(a instanceof Point&&b instanceof Point){
return new Line(a,b)
}else{
throw 'Line 参数错误'
}
}
}
//点p到线段s、t的距离
Line.dis_point_segment=function(p,s,t){
if(Math.cmp(Point.dot(Point.sub(p,s),Point.sub(t,s)))<0){
return Point.sub(p,s).norm()
}
if(Math.cmp(Point.dot(Point.sub(p,t),Point.sub(s,t)))<0){
return Point.sub(p,t).norm()
}
return Math.abs(Point.det(Point.sub(s,p),Point.sub(t,p))/Point.dist(s,t))
}
//点到线段的垂足
Line.pointProjLine=function(p,s,t){
const r=Point.dot(Point.sub(t,s),Point.sub(p,s))/Point.dot(Point.sub(t,s),Point.sub(t,s))
return Point.add(s,Point.multiply(r,Point.sub(t,s)))
}
//点是否在线段上
Line.pointOnSegment=function(p,s,t){
return Math.cmp(Point.det(Point.sub(p,s),Point.sub(t,s)))===0&&Math.cmp(Point.det(Point.sub(p,s),Point.sub(p,t)))<=0
}
//判断线段a、b是否平行,a、b 为line
Line.parallel=function (a,b) {
return !Math.cmp(Point.det(Point.sub(a.a,a.b),Point.sub(b.a,b.b)))
}
//判断线段a、b是否相交,返回交点
Line.lineMakePoint=function (a,b) {
if(Line.parallel(a,b)){
return false;
}
const s1=Point.det(Point.sub(a.a,b.a),Point.sub(b.b,b.a));
const s2=Point.det(Point.sub(a.b,b.a),Point.sub(b.b,b.a));
return Point.divide(Point.sub(Point.multiply(s1,a.b),Point.multiply(s2,a.a)),s1-s2);
}
// 将直线a沿法向量方向平移距离len得到的直线
Line.moveD=function (a,len) {
let d=Point.sub(a.b,a.a)
d=Point.divide(d,d.norm());
d=Point.rotate(d,Math.PI/2);
return Line(Point.add(a.a,Point.multiply(d,len)),Point.add(a.b,Point.multiply(d,len)))
}
//demo
const p=Point(0,0);
const s=Point(4,4);
const t1=Point(2,0);
const t=Point(3,1);
// console.log(Line.dis_point_segment(p,s,t))
// console.log(Line.pointProjLine(p,s,t))
const line1=Line(p,s)
const line2=Line(t1,t)
// console.log(Line.parallel(line1,line2))
// console.log(Line.lineMakePoint(line1,line2))
console.log(Line.moveD(line1,3*Math.sqrt(2)))