欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

THREE.js开荒小记(一):在空间直角坐标系画劣弧的思路

程序员文章站 2022-04-04 16:03:46
...

最近从开发后端的工作往前端转移,主要是用three.js作图的一些难点攻关。有个比较有意思的问题:

在空间直角坐标系中(x,y,z)中,两条有一个相同顶点的线段,要标注他们的角度在靠近交点的地方画劣弧,众所周知,在编程中使用数学问题可以有效的简化代码,所以这个问题就被引申为2个数学问题:

1、在空间直角坐标系中,已知线段AB求一点C,距离A的长度为参数l,其中C必定在线段AB或AB的延长线上,求出C点坐标;

2、已知在空间直角坐标系内有3个不在同一直线上的点OAB,B、O距离A、B的距离相等,以O点为圆心,以B、C为2个端点画劣弧,单位弦长为l下点的坐标集合。

在THREE中,空间里划线需要到LINE3这个类,根据文档找到atdistance方法介绍:

 

.distance () : Float

Returns the Euclidean distance (straight-line distance) between the line's start and end points.

 

.at ( t : Float, target : Vector3 ) : Vector3

t - 使用值0-1返回沿线段的位置。
target — 计算结果会被拷贝到target。

 

at方法直接就解决了第一个问题,已知AB两点坐标可知线段长度,有AC长度可换算成比值,带入at方法即可计算在此不做赘述;

第二个问题的思路请教了博主的一位朋友指点给出了数学模型, 思路如下:

 

    1)   连接AB,求出AB中点C,连接OC过C点做延长线相交弧AB于点P;

    2) 根据余弦定理,可以求出AB长度,根据勾股定理,可求出OC长度,本身已知OP长度;

    3) 根据问题一的解(定比分点坐标公式),可以求出P点坐标,连接AP,如果AP长度大于单位弦长l则继续分,直到AP'长度不大于 l 为止;

 

下面列出代码:


//显示角度的弧线在空间坐标系下绘制数据工具



//空间直角坐标系中,有3点OAB,OA=OB,找到弧AB的中点C1

//点O,点A,点B

//返回C1坐标

function GetMPointOnRound(PointsO,PointsA,PointsB)

{

    let lineOA=new Line3(PointsO,PointsA)

    let lineAB=new Line3(PointsA,PointsB);

    let PointsC=new Vector3();

    lineAB.getCenter(PointsC);

    let lineOC=new Line3(PointsO,PointsC);

    //AC1/CC1

    let proportion=lineOA.distance()/lineOC.distance();

    let PointsC1=new Line3(PointsO,PointsC).at(proportion);



    return PointsC1;

}



let geometry = new THREE.Geometry();



//空间直角坐标系中,有3点OAB,OA=OB,以O为圆心过AB做圆求劣弧点的集合。(其中点与点之间间距为Unitlength)

//点O,点A,点B,集合中点与点之间的距离

//点的集合(有序)

function  GetPointByMinorArc(PointsO,PointsA,PointsB,Unitlength)

{

    let PointsC=GetMPointOnRound(PointsO,PointsA,PointsB);//劣弧上中点

    let lineAC=new Line3(PointsA,PointsC);

    if (lineAC.distance()>Unitlength)    {

        GetPointByMinorArc(PointsO,PointsA,PointsC,Unitlength);

        GetPointByMinorArc(PointsO,PointsC,PointsB,Unitlength);

    }

    else {

        geometry.vertices.push(PointsA,PointsC);

    }

}

 

 

three.js文档引用自:http://www.webgl3d.cn/threejs/docs/#api/zh/math/Line3

 

 


作者:sunnysnow0527 出处:https://mp.csdn.net/console/article 欢迎转载,也请保留这段声明。谢谢!