zoukankan      html  css  js  c++  java
  • 计算几何线段类

    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)))
  • 相关阅读:
    操作系统概述
    18 文本处理
    17 正则表达式(重点)
    16 归档和备份
    15 查找文件
    博客园图片折叠
    EF6学习笔记十五:调试EF框架源码
    EF6学习笔记十四:上下文管理
    Sqlserver和LocalDB创建数据库时默认字符集不一样
    EF6学习笔记十三:基础知识完结,零碎问题补缺
  • 原文地址:https://www.cnblogs.com/caoke/p/10530949.html
Copyright © 2011-2022 走看看