【问题标题】:Three.js distance between point and line segment三.js点线段距离
【发布时间】:2021-01-25 10:13:59
【问题描述】:

在 Three.js 中,我有一个简单的方法可以找到一个点(即我的相机的位置)和无限延伸的线之间的距离。但是,我真正需要的是找到一个点和由两点组成的一条线段之间的距离。注意:我使用的是 Three.js,它有 3 个空间维度:x、y 和 z。

这是我在 Three.js 中使用的点到线段公式:

var A = lineVertex1.clone()
var B = lineVertex2.clone()

var D = B.clone().sub( A ).normalize();
var d = camera.position.clone().sub( A ).dot( D );
var X = A.clone().add( D.clone().multiplyScalar( d ) );

var distance = camera.position.distanceTo( X );  

【问题讨论】:

  • Line3 有 .closestPointToPoint() 方法。
  • 谢谢,我看到这也有指定线段的选项。

标签: javascript three.js 3d distance line-segment


【解决方案1】:

我写代码不是很熟练,但我想我至少可以给你提供算法。

一条线段可以延伸为无限长的直线,现在可以计算相机点到直线的距离;问题是您不知道从相机通过的线的​​垂直线是在该线段的内部还是外部。所以你可以计算三个距离:相机点到线段的两个点的距离和相机到线的距离,三者中较低的应该是你要找的距离。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    使用TRHEE js的方法1

    要找到点 (A) 和由两点 (B 和 C) 组成的单个线段之间的距离,我们可以使用 THREE.Vector3,它不是网格,它只是一条几何线。

    Vector3 有一个方法叫做closestPointToPoint()。取最接近点到点()方法提供的距离,我们将找到点 A 到线段或线 BC 之间的距离。

    const A=new Vector3(0,0,0);
    
    const B=new Vector3(5,2,5); // line base point 1
    const C=new Vector3(5,-2,5); // line base point 2
    
    const line=new Line3(B,C);
    const d=line.closestPointToPoint(A).distanceTo(A);
    
    console.log(d.toFixed(3));// 7.071  this is 5 × √2 ! 
    

    代数方法2


    有了 A、B 和 C 点的坐标,我们可以用这里给出的公式写出 A 和 BC 线之间的距离:[Math StackExchange][1]

    【讨论】:

      猜你喜欢
      • 2018-01-17
      • 2010-10-25
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多