计算几何线段类

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)))
原文地址:https://www.cnblogs.com/caoke/p/10530949.html