3

简洁版本:

基本上,我正在尝试使用( )Point C的终点来计算未知数的 X 和 Y 值。Line ABPoint B

我尝试使用atan2( B.y, B.x),但它给了我相对于X-Axis导致错误坐标的角度。我想我需要得到由( ) 构成的角度Line BC和假想的水平轴。有没有办法获得那个角度?如果获得那个角度不会做我想做的事,那会怎样?Point BAngle P

长版:

我正在尝试使用 C++ 进行一些数学运算,但我遇到了这个特定问题。

我有两个向量,Vector AVector B(由Point Aand说明Point B,它们形成line AB)。现在,我想得到Vector C( Point C),它是L距离Vector B( 用Line BC) 表示的单位。

案例 1:如果 By > Ay 则获取点

我四处搜索,阅读了一些书,并得到了这个公式来得到我需要的观点。

/* Let:
 * L = length from B to C
 * ( B.x, B.y ) = start point
 * ( C.x, C.y ) = end point 
 * theta = angle respective to X-Axis ( using atan2( B.y, B.x ) )
 */

// To get C.x use formula cos( theta ) = ( C.x - B.x ) / L then derive
C.x = ( L * cos( theta ) ) + B.x;

// To get C.y use formula sin( theta ) = ( C.y - B.y ) / L then derive
C.y = ( L * sin( theta ) ) + B.y;

但是,这不会导致Point C如上所示,因为结果C将与X-Axis. 在阅读了更多之后,我发现我需要得到(淡红色线)和假想的水平轴(蓝绿色线)Angle P之间的角度(用紫色表示) 。Line BCPoint B

另一个例子:

案例 2:如果 By < Ay,则获取点

在这种情况下,使用上面的公式会导致C在错误的地方(上面( X , 5 )

我不确定gettingAngle P是否会做我想做的事,如果您知道更合适的答案,请这样做。

4

3 回答 3

4

你不需要为此触发。这是简单的比例。我发现的方便规则是,如果您发现自己使用了 sin、cosatan2,那么您可能做错了。

这是没有触发的方法

dx = B.x - A.x;
dy = B.y - A.y;
dist = sqrt(dx*dx + dy*dy);
C.x = B.x + L*(dx/dist);
C.y = B.y + L*(dy/dist);
于 2012-09-15T06:44:35.393 回答
3

首先要做的是创建一个 tempB,就好像 A 是原点一样(这样你就可以找到 B 到 A 的角度等等)。

从 B 中减去 A 的值。

tempB.x = B.x - A.x
tempB.y = B.y - A.y

然后你可以使用 atan2 和 sin/cos (你的公式)来获得 Cx 和 Cy

theta = atan2(tempB.y, tempB.x)
C.x = ( L * cos( theta ) ) + B.x;
C.y = ( L * sin( theta ) ) + B.y;

另一种选择是获得 tempB 的单位向量。

magnitude = sqrt( pow(tempB.x,2) + pow(tempB.y,2))
unit.x = tempB.x/magnitude
unit.y = tempB.y/magnitude

将此单位向量乘以 L 可以得到与 B 的偏移量。

C.x = B.x + unit.x * L
C.y = B.y + unit.y * L
于 2012-09-15T05:51:24.087 回答
1

您需要的(以向量形式)是C = B + L*normalize(B-A). 如果您要进行更多此类计算,则值得使用向量库,以便您可以完全像这样编写代码。否则,您应该使用约翰的答案,它将相同的计算分解为其基本步骤。

编辑:这是一个你可以很容易使用的库(它只是头文件):GLM

于 2012-09-15T07:33:22.940 回答