在三维空间中与某条给定直线在同一平面上的垂直线上找距离为t的点



点A (x1,y1,z1)是一行的"起点"。点B (x2,y2,z2)是一行的"终点"。

只知道三维空间中的直线AB,我需要求出点-tt沿着与直线AB相交的两条垂直线分别在点A和点B处与直线AB在同一平面上的距离。

我的java代码目前可以在3d中沿着一条线得到一个点,但我不知道如何找到垂直线的方向矢量,只有一条给定的线,这是我唯一的信息。

提前感谢。

编辑:在直线上得到点是很好的,但是我不认为我知道如何从一条直线上找到平面法向量,或者如何用它来得到一条垂线。

public class ParameterizedLine {
   private Vector3f originVector;
   private Vector3f directionVector;
   public ParameterizedLine(Line line) {
      originVector = new Vector3f(line.getOrigin());
      directionVector = line.getDirection().subtract(originVector);
   }
   public ParameterizedLine(Vector3f originVector, Vector3f directionVector) {
      this.originVector = originVector;
      this.directionVector = directionVector;
   }
   public Vector3f getPointAtDistance(float distance) {
      Vector3f point = new Vector3f();
      float distanceRatio = getDistanceRatio(distance);
      point.x = originVector.x + (directionVector.x * distanceRatio);
      point.y = originVector.y + (directionVector.y * distanceRatio);
      point.z = originVector.z + (directionVector.z * distanceRatio);
      return point;
   }
   public ParameterizedLine getPerpendicularLineAtDistance(float distance) {
      Vector3f perpindicularOriginVector = getPointAtDistance(distance);
      Vector3f planeNormalVector = originVector.cross(originVector.add(directionVector));
      Vector3f perpindicularDirectionVector = directionVector.cross(planeNormalVector);
      ParameterizedLine perpindicularLine = new ParameterizedLine(perpindicularOriginVector,
                                                                  perpindicularDirectionVector);
      return perpindicularLine;
   }
   private float getDistanceRatio(float distance) {
      return distance / (originVector.distance(originVector.add(directionVector)));
   }
   public Vector3f getOrigin() {
      return originVector;
   }
   public Vector3f getDirection() {
      return directionVector;
   }
   @Override
   public String toString() {
      return "ParameterizedLine{" + "originVector=" + originVector + ", directionVector=" + directionVector + '}';
   }

}

编辑2:求任意距离垂直点的明显解法,欢迎校对。

public Vector3f getPerpendicularPoint(float parametricDistance, float perpendicularDistance) {
      Vector3f parametricPoint = getPointAtDistance(parametricDistance);
      Vector3f perpendicularVector = new Vector3f();
      if(directionVector.x <= directionVector.y && directionVector.x <= directionVector.z){
         perpendicularVector.set(0, -directionVector.z, directionVector.y);
      } else if (directionVector.y <= directionVector.x && directionVector.y <= directionVector.z){
         perpendicularVector.set(-directionVector.z, 0, directionVector.x);
      } else if (directionVector.z <= directionVector.x && directionVector.z <= directionVector.y){
         perpendicularVector.set(-directionVector.y, directionVector.x, 0);
      }
      Vector3f normalizedPerpendicularVector = perpendicularVector.normalize();
      Vector3f perpendicularPoint = parametricPoint.add(normalizedPerpendicularVector.mult(perpendicularDistance));
      return perpendicularPoint;
   }

单行不能定义唯一的平面-因为它属于空间中无限数量的平面。所以你必须提供关于飞机的额外信息。

如果没有关于该平面的附加信息,您可以选择该线所属的任意平面:

设(dx, dy, dz)是你的方向向量。找到两个更大的元素,交换它们,并否定其中一个。将第三个元素(最小值)设置为零。这个向量垂直于directionVector

的例子:

if (dx <= dy) and (dx <= dz) then PV = (0, -dz, dy)

然后对这个向量进行归一化 = PV /| PV |和你的目标点

Ta = + - t *

(2分)结核病

= B + - t *

(2分)

注意AB线和所有点A, B, Ta1, Ta2, Tb1, Tb2位于同一平面(任意选择)

最新更新