簡體   English   中英

如何調整一個3D點距另一個3D點的距離給定距離

[英]How to adjust the distance of one 3D point from another 3D point by a given distance

我正在使用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.

我想調整點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點如下圖所示:

在此輸入圖像描述

我正在使用自己定義的Point3D類和Vector3D類。

讓我們假設您的點數給定參數,並創建第3個,我們稱之為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)
                                    }

在這里,我們看到原始點:

原始繪圖點

假設這個值, 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 };

然后newCoordinate位置將是X = -2.5,Y = 3,Z = 2。

在此輸入圖像描述

現在,相同點,但使用distanceToAdjust = 1.2

在此輸入圖像描述

記住這兩件事:

  • 距離的變化總是需要一個參考點。 在我的樣本中,我假設A; 這就是為什么它作為每個newCoordinate參數初始化的第一部分出現的原因。
  • distanceToAdjust被視為乘數因子

附錄:我可以在這里找到用於幫助可視化的漂亮工具。

假設您實現了向量操作:

如果A點總是[0,0,0]

Point3D new = B.Normalize() * distance;

任何兩點

Point3D newCoord = A + ((B - A).Normalize() * distance); //move to origin, normalize, scale and move back

但不是快速解決方案。

“兩點A和B之間的距離是距離= 1”

不,距離是三的平方根,約為1.732。

從(0,0,0)到(0,0,1)的距離是1.從(0,0,0)到(0,1,1)的距離是2的平方根。 (想想二維的三角形和Pythagoas定理。)從(0,0,0)到(1,1,1)的距離是三的平方根。 (想想一個二維的三角形,其中該尺寸位於沿前一個三角形的低位線的平面上.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
};

在偽代碼中,這是我最終實現的方式

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

我不確定這是否是您需要的但是可以在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 });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM