[英]How to adjust the distance of one 3D point from another 3D point by a given distance
我正在使用point3D和vector3D類,我需要一些幫助調整給定距離的點。
碼:
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
:
記住這兩件事:
newCoordinate
參數初始化的第一部分出現的原因。 附錄:我可以在這里找到用於幫助可視化的漂亮工具。
假設您實現了向量操作:
如果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.