给定一个三角形和一个线段,找到第三个点,它会创建一个相似的三角形[关闭]

Posted

技术标签:

【中文标题】给定一个三角形和一个线段,找到第三个点,它会创建一个相似的三角形[关闭]【英文标题】:given a triangle and a segment, find third point which would create a similar triangle [closed] 【发布时间】:2011-05-19 01:12:08 【问题描述】:

我看到有人问过类似的问题,但我觉得解释起来还是有些困难。

我有一个三角形,它的 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。

【问题讨论】:

此问题未充分说明。给定的线段可以构成三个边中的任何一个,因此必须有三个不同的点可以用来构成相似的三角形。 这是题外话 - 应该在 math.stackexchange.com 上 @Drew - 通常实际上有六种解决方案,因为该段可以相对于每一侧在两个方向上定向。但那又怎样? OP 只想要一些与原始三角形相似的三角形,该三角形将线段作为边之一。 @Ted,只有三个方向会产生一个相似的三角形。 @Ted:你是对的,当然(在这两个方面)。我只是想让 OP 多考虑一下这个问题。 【参考方案1】:

为了具体起见,假设你的原始三角形有顶点 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 系统中的向量。 x-y 系统中沿 u 轴的单位向量由下式给出:

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 轴沿 DE。 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)单位向量是一个范数=1的向量。两个向量的点积是对应分量的乘积之和(一个简单的数字):A ∙ B = A_x*B_x + A_y*B_y。请注意,向量与自身的点积是其范数的平方。关于点积的一个重要恒等式是:A ∙ B = ‖A‖ * ‖B‖ * cos(α) 其中α 是 A 和 B 之间的角度。推论是两个非零向量的点积恰好在向量相互垂直时为零。

【讨论】:

以上是关于给定一个三角形和一个线段,找到第三个点,它会创建一个相似的三角形[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在给定三个边的坐标平面中绘制三角形

判断点是否在三角形内转

java 给定三个点由三个点求三角形周长和面积

将细线段转换为Arc

题解 LA5846

确定一个点是不是在由具有给定纬度/经度的 3 个点组成的三角形内