如何调整一个3D点距另一个3D点的距离给定距离

Rob*_*abe 5 c# math point vector

我正在使用point3D和vector3D类,我需要一些帮助调整给定距离的点.

  • A点 - 位于坐标0,0,0处的点.
  • B点 - 位于坐标1,1,1处的点.
  • 向量AB - 向量AB告诉我两点A和B之间的长度是距离= 1.73205078.

在此输入图像描述

码:

Point3D A = new Point3D { X = 0, Y = 0, Z = 0 };
Point3D B = new Point3D { X = 1, Y = 1, Z = 1 };
Vector3D AtoB = A - B;
Double distanceBetweenAandB = AtoB.Length; // the distance will be 1.73205078 here.
Run Code Online (Sandbox Code Playgroud)

我想调整点B.我想将点A和点B之间的距离减小到0.5而不是1(调整到位置C,如图所示).我想弄清楚如何做到这一点.

点A(0,0,0)是已知的,点B(1,1,1)是已知的并且调整的距离是已知的(0.5).我该如何计算?

伪代码:

Point3D A = new Point3D { X = 0, Y = 0, Z = 0 };
Point3D B = new Point3D { X = 1, Y = 1, Z = 1 };
Double distanceToAdjust = 0.5;

Point3D newCoordinate = B - distanceToAdjust; // this doesnt work!
Run Code Online (Sandbox Code Playgroud)

调整后的B点如下图所示:

在此输入图像描述

我正在使用自己定义的Point3D类和Vector3D类.

Ono*_*dai 5

让我们假设您的点的给定参数,并创建第三个,我们称之为newCoordinate,该点将A作为您的参考:

Point3D A = new Point3D { X = 0, Y = 0, Z = 0 };
Point3D B = new Point3D { X = 1, Y = 1, Z = 1 };

Double distanceToAdjust = 0.5;

Point3D newCoordinate = new Point3D { 
                                        A.X + ((B.X - A.X) * distanceToAdjust),
                                        A.Y + ((B.Y - A.Y) * distanceToAdjust),
                                        A.Z + ((B.Z - A.Z) * distanceToAdjust)
                                    }
Run Code Online (Sandbox Code Playgroud)

这里我们看到原点:

原始绘制点

假设此值,newCoordinate将位于 X=0.5、Y=0.5、Z=0.5。漂亮的图表如下:

在此处输入图片说明

就在那里,正好位于两个原始点之间。

作为模拟,如果您更改 A 和 B 并采用以下值:

Point3D A = new Point3D { X = -8, Y = 4, Z = 3 };
Point3D B = new Point3D { X = 3, Y = 2, Z = 1 };
Run Code Online (Sandbox Code Playgroud)

那么newCoordinate位置将是 X=-2.5, Y=3, Z=2。

在此处输入图片说明

现在,同样的观点,但使用distanceToAdjust = 1.2

在此处输入图片说明

请记住以下两点:

  • 距离的变化总是需要一个参考点。在我的样本中,我假设 A;这就是为什么它出现在每个newCoordinate参数初始化的第一部分。
  • distanceToAdjust 被视为乘数因子

附录:我用来帮助可视化的漂亮工具可以在这里找到


Rob*_*abe 1

在伪代码中,这是我最终实现的方式

\n\n
pointA = \xe2\x80\xa6\npointB = \xe2\x80\xa6\nvectorAB = B-A\ndesiredDistance = 0.5;  // where 0.5 is vectorAB.Length/desiredDistance\nvectorAC = vectorAB * desiredDistance ; \n\npointC = A+vectorAC;\n
Run Code Online (Sandbox Code Playgroud)\n\n

实际代码:

\n\n
Vector3D pointC = (Vector3D)(A + (float)desiredDistance  * (B - A)); \n
Run Code Online (Sandbox Code Playgroud)\n