我想在d由P1(x1,y1)和定義的線的右側找到距離處的點P2(x2,y2)(距離是從線的中間計算的)。我想出了以下代碼,效果很好,但我認為我做了不必要的計算,而且可以更快地完成。
#define PI 3.141592653589793238462643383279502884197169399375105820974944592308
double x2, x1, y1, y2, px, py, p1x, p1y, p2x, p2y, d, ax, ay, b, dx, dy;
d = 2.0; // given distance
ax = (x1 x2) / 2; // middle point
ay = (y1 y2) / 2; // middle point
b = tan(atan2(y2 - y1, x2 - x1) PI / 2); // slope of the perpendicular line
dx = (d / sqrt(1 (b * b)));
dy = b * dx;
p1x = ax dx;
p1y = ay dy;
p2x = ax - dx;
p2y = ay - dy;
// cross product
if (((x2 - x1) * (p1y - y1) - (y2 - y1) * (p1x - x1)) > 0)
{
px = p1x;
py = p1y;
}
else
{
px = p2x;
py = p2y;
}
uj5u.com熱心網友回復:
您不需要atan, bvalue, cross product 來檢查方向(此外,b可能為零并導致除法錯誤)。
而是計算歸一化(單位長度)方向向量并使其垂直于它:
d = 2.0; // given distance
ax = (x1 x2) / 2; // middle point
ay = (y1 y2) / 2; // middle point
dx = x2 - x1;
dy = y2 - y1;
scale = d / sqrt(dx*dx dy*dy); //distance/vector length
px = ax dy * scale; // add normal vector to the right side of p1-p2 direction
py = ay - dx * scale; //note minus sign
uj5u.com熱心網友回復:
為了生成與另一個垂直的 2D 矢量,點積的一種特殊情況會產生一個結果,即您可以交換矢量的兩個分量并取反其中的一個。
例如,假設您有一個d指向p1to的向量p2:
dx = p2x - p1x;
dy = p2y - p1y;
現在你想生成right哪個是垂直的,它很簡單:
rightx = dy;
righty = -dx;
現在,讓我們對“在右邊”的定義做一個快速的視覺檢查,以防我們真的想要否定這兩個值......
o p2 = [2, 3]
/
o p1 = [0, 0]
以上,d很簡單:[2, 3]。直觀地,我們會想到(從上面看)從p1到p2向右走,然后向右看,這意味著在正 X 方向和負 Y 方向上的向量。所以是的,這看起來不錯。
注意:如果您的坐標系是基于螢屏的(即正 Y 方向向下),則反之亦然(并且您將在right矢量計算中否定這兩個項)。這是由于霸道的坐標系統被留下,而不是權利。
現在,您可以將中點計算mid為(p1 p2) / 2或p1 d / 2。
midx = (p1x p2x) / 2;
midy = (p1y p2y) / 2;
最后,要生成p3從mid向量開始并向下擴展right一定量的向量height,您需要通過除以向量的長度和縮放比例來歸一化向量height。正式地,最后一點是mid right * height / length(right)。
這是計算中唯一特別昂貴的部分,因為它需要平方根。
rdist = height / sqrt(rightx * rightx righty * righty);
p3x = midx rightx * rdist;
p3y = midy righty * rdist;
恭喜!你現在有一個等腰三角形!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/374616.html
