c# - 如何将一个 3D 点与另一个 3D 点的距离调整给定距离

标签 c# math vector point

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

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

enter image description here

代码:

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.

我想调整 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!

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

enter image description here

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

最佳答案

让我们为您的点假设您给定的参数,并创建第三个点,我们将其称为 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)
                                    }

这里我们看到了原始点:

Original plotted points

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

enter image description here

就在那里,就在两个原始点之间。

作为模拟,如果您更改 A 和 B 并改为假定此值:

Point3D A = new Point3D { X = -8, Y = 4, Z = 3 };
Point3D B = new Point3D { X = 3, Y = 2, Z = 1 };

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

enter image description here

现在,相同点,但使用 distanceToAdjust = 1.2:

enter image description here

记住这两点:

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

附录:我用来帮助可视化的漂亮工具 can be found here .

关于c# - 如何将一个 3D 点与另一个 3D 点的距离调整给定距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21001728/

相关文章:

java - 如何在 Java 中将 byte[] 转换为 POSITIVE BigInteger?

c++ - 将 cv::Mat vector 复制到 float vector 的最佳方法是什么?

c# - SPQuery : Joining lists and where in the foreign list

c# - 在 View 中创建 HiddenFor IEnumerable<String>

c# - 如何从另一个子窗体关闭子窗体而不关闭主窗体c#

c++ - 调整大小std::vector <std::unique_ptr <T >>的性能

c++ - 累积没有给出我的 vector 的正确总和

c# - ASP.net Identity 自定义用户模型未被角色、声明和登录表使用

python - SageMath 中的联立方程

有效地将十进制移位应用于所有数字的算法