如何通过给定的距离调整一个3D点与另一个3D点之间的距离?

5

我正在使用Point3D和Vector3D类,需要帮助通过给定的距离调整点。

  • 点A - 坐标为0,0,0的点。
  • 点B - 坐标为1,1,1的点。
  • 向量AB - 向量AB告诉我点A和点B之间的距离是distance = 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类。


1
向量 [1 1 1] 的长度不是1,而是 SQRT(3) = 1.732(...) - J...
5个回答

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)
                                    }

在这里,我们看到原始点:

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 被视为一个乘数因子。

附加说明:我用来帮助可视化的好工具可以在这里找到


4
假设您已经实现了向量运算:
如果点A始终为[0,0,0]
Point3D new = B.Normalize() * distance;

对于任意两点
Point3D newCoord = A + ((B - A).Normalize() * distance); //move to origin, normalize, scale and move back

虽然不是快速解决方案。


3

"点A和点B之间的距离为distance=1"

不,距离是根号3,约为1.732。

从(0,0,0)到(0,0,1)的距离为1。从(0,0,0)到(0,1,1)的距离是根号2。(想象一个二维三角形,应用勾股定理。)从(0,0,0)到(1,1,1)的距离是根号3。(想象一个二维三角形,在前一个三角形的斜边所在的平面上。AB = √(1² + (√2)²).)


我假设你不想从任何值中减去0.5,而是实际上将距离乘以0.5,即从A到B的一半。您可以通过在每个维度上获取点A和点B之间距离的那部分来计算点C:

Point3D C = new Point3D {
  A.X + (B.X - A.X) * distanceToAdjust,
  A.Y + (B.Y - A.Y) * distanceToAdjust,
  A.Z + (B.Z - A.Z) * distanceToAdjust
};

2
嗯...它不是2,而是3的平方根。|V| = sqrt(x^2 + y^2 + z^2) - J...
正如OnoSendai的回答中所评论的那样,您必须为所有计算定义一个公共参考点;否则,您的输出将是随机的。例如,似乎OP想要依赖最小坐标,因此您应该执行这个预检查;否则,您的算法将根据输入点的顺序输出不同的结果。我希望您能理解这个想法(太累了,无法再解释更多)。 - varocarbas
@varocarbas:我看不到那个命令,也不太明白你的意思。该代码创建了一个点,该点位于从A到B的某条直线上,具体位置取决于“distanceToAdjust”值。如果您不知道是从A到B还是从B到A,则输出结果真的是随机的。此外,如果您想要从最小坐标开始,则必须首先定义您所说的“最小”是什么意思。 - Guffa
进一步澄清:最小值是指每个坐标轴上的最小值(我的答案与你的类似,但是:minX + (...),minY + (...),minZ + (...);其中minX是Ax和Bx中的最小值,minY是Ay和By中的最小值,等等);或者也可以是maxX、maxY等,但是你的代码忽略了这一点,随机地取最小/最大值(即随意的方法)。第二个澄清:我不能继续这个讨论,因为一段时间前我向管理员承诺停止这种事情(评论):) 我希望我的想法已经足够清晰了(否则请参考我上面的评论)。 - varocarbas
2
如果您更改输入的顺序(B而不是A,反之亦然),则会得到1.5,1.5,1.5。不,您错了。 0 +(1-0)* 0.5 的结果与 1 +(0-1)* 0.5 相同。无论输入的顺序如何,都不可能在(0,0,0)和(1,1,1)之间插值得到(1.5,1.5,1.5)。无论如何,无论输入的顺序如何,获得相同的值都没有任何意义。此外,如果您开始在坐标之间混合最小值和最大值,则会得到随机结果,因为您可能最终得到的点甚至不在从A到B的线上。 - Guffa
显示剩余5条评论

1
在伪代码中,这是我最终实现的方式。
pointA = …
pointB = …
vectorAB = B-A
desiredDistance = 0.5;  // where 0.5 is vectorAB.Length/desiredDistance
vectorAC = vectorAB * desiredDistance ; 

pointC = A+vectorAC;

实际代码:

Vector3D pointC = (Vector3D)(A + (float)desiredDistance  * (B - A)); 

0

我不确定这是否是您需要的,但是否可以在您的Point3D类中创建一个方法以允许减法/加法?

(只是猜测Point3D类可能非常简单)像这样的东西

   public class Point3D
   {

       public double X,Y,Z

       public void ChangeCord(Point3D point)
       {
           X =- point.X;
           Y =- point.Y;
           Z =- point.Z;
       }
   }

这可能只是:

    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.ChangeCord(new Point3d{ X = 0.5, Y = 0.5, Z = 0.5 });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接