给定一个三角形和一个线段,找到第三个点,它将创建一个类似的三角形

时间:2011-05-19 01:12:09

标签: c++ algorithm math geometry

我见过类似的问题,但我发现解释仍然有些困难。

我有一个三角形,它的3个顶点在(x,y)中给出。我也得到了两分。我想在段周围放置第三个点,以便它完成一个形状与原始三角形相似的三角形。这个新三角形的大小可能不同,但所有角度都是相同的。我怎么能找到第三点?

我已经找到每个段的长度和三角形的角度,但我有点卡住了。

我看到了以下文章并尝试实现所讨论的代码,但没有获得正确的坐标。 Calculating the coordinates of the third point of a triangle

编辑:对不起,我忘了说明我知道我想把第三个点放在段的一端附近。示例:我有顶点A,B和C的三角形。我有一个段DE(由点D和E创建),其中DE类似于AB。我想将F点放在一个位置,这样AD与EF类似,AC类似于DF。

1 个答案:

答案 0 :(得分:3)

为了具体起见,假设您的原始三角形具有顶点A,B和C.线段具有端点D和E.此外,您希望DE对应于AB。问题是找到点F使得三角形DEF类似于三角形ABC。我希望这就是你要解决的问题,因为这就是我要给你的解决方案。解释解决方案比编码解决方案要长很多。 :)

我认为你可以使用矢量算法完成所有这些操作,而不使用角度和触发函数。让所有点在一些共享坐标系中用它们的x和y坐标表示。 (如果您不知道矢量算术,请参阅下面的附录。)

首先,我们将设想一个局部坐标系u-v,其中A为原点,AB为与u轴平行; v轴垂直于u;我们将在一秒钟内确定哪个方向是正面的。现在,即使AB是三角形的一侧,从现在开始我们将它视为从A到B的向量。它可以在x-y系统中计算为AB = (B[x] - A[x], B[y] - A[y])。所有其他点对也是如此。各个点也将是x-y系统中的向量。沿着u轴的x-y系统中的单位矢量由下式给出:

u = (u_x, u_y) = AB / ‖AB‖

沿v轴的单位向量只是:

v = (-u_y, u_x)

(我们也可以使用(u_y, -u_x)。)我们现在将在u-v系统中计算AC的矢量分量:

AC_u = (AC_x * u_x, AC_y * u_y) // = (AC ∙ u)
AC_v = ‖AC - AC_u * u‖

现在我们想象另一个局部坐标系r-s,其原点在D和r轴上。 x-y系统中沿r和s的单位向量是:

r = (r_x, r_y) = DE / ‖DE‖
s = (-r_y, r_x)

我们可以用比率‖DE‖ / ‖AB‖来缩放AC的u-v分量,得到DF的r-s分量:

DF_r = AC_u * ‖DE‖ / ‖AB‖
DF_s = AC_v * ‖DE‖ / ‖AB‖

最后,我们只需要将所有内容添加到一起:

F = D + DF_r * r + DF_s * s

(回想一下Drs是向量。)就是这样。虽然帖子很长,但只有十几行代码(每个向量计算步骤为每个组件需要一行),另外还有一些用于计算向量范数的函数。


附录:矢量算术

x-y坐标系中的向量是有序的数字对:(x,y)。可以通过添加或减去其组件来添加或减去两个向量A和B:A ± B = (A_x ± B_x, A_y ± B_y)。通过将每个向量分量乘以标量:q*A = (q*A_x, q*A_y),可以将向量乘以数字(也称为标量)。由标量划分只是乘以标量的倒数。向量A的范数(也称为长度)写成“A”;它可以使用毕达哥拉斯定理计算:‖A‖ = sqrt(A_x * A_x + A_y * A_y)单位向量是norm = 1的向量。两个向量的点积是相应成分的乘积之和(简单数):{{1} }。请注意,矢量与其自身的点积是其范数的平方。关于点积的一个重要身份是:A ∙ B = A_x*B_x + A_y*B_y其中A ∙ B = ‖A‖ * ‖B‖ * cos(α)是A和B之间的角度。推论是两个非零向量的点积恰好是向量垂直于彼此。