Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 给定一个三角形和一个线段,找到第三个点,这将创建一个类似的三角形_C++_Algorithm_Math_Geometry - Fatal编程技术网

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

C++ 给定一个三角形和一个线段,找到第三个点,这将创建一个类似的三角形,c++,algorithm,math,geometry,C++,Algorithm,Math,Geometry,我见过类似的问题,但我觉得解释起来还是有点困难 我有一个三角形,它的3个顶点在(x,y)中给出。我还得到了两点中的一部分。我想在线段周围放置第三个点,使其形成一个形状与原始三角形相似的三角形。这个新三角形可能大小不同,但所有角度都相同。我如何找到第三点 我已经找到了每个线段的长度和三角形的角度,但我有点卡住了 我看到了下面的帖子,并试图实现所讨论的代码,但没有获得正确的坐标。。 编辑:很抱歉,我忘记指定我知道要将第三个点靠近线段的一端。示例:我有一个带有垂直A、B和C的三角形。我有一个线段DE

我见过类似的问题,但我觉得解释起来还是有点困难

我有一个三角形,它的3个顶点在(x,y)中给出。我还得到了两点中的一部分。我想在线段周围放置第三个点,使其形成一个形状与原始三角形相似的三角形。这个新三角形可能大小不同,但所有角度都相同。我如何找到第三点

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

我看到了下面的帖子,并试图实现所讨论的代码,但没有获得正确的坐标。。


编辑:很抱歉,我忘记指定我知道要将第三个点靠近线段的一端。示例:我有一个带有垂直A、B和C的三角形。我有一个线段DE(由点D和E创建),其中DE类似于AB。我想将点F放置在一个位置,以便AD类似于EF,AC类似于DF。

为了具体起见,假设原始三角形有顶点A、B,线段有端点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)
我们可以按比例缩放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
(回想一下,
D
r
s
都是向量。)就是这样。虽然文章很长,但只有十几行左右的代码(每个向量计算步骤需要一行代码来表示每个组件)加上另外几行代码来计算向量的范数


附录:向量算法


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之间的角度。一个推论是,当两个非零向量相互垂直时,两个非零向量的点积正好为零。

这个问题没有明确说明。给定的线段可以构成三条边中的任意一条,因此必须有三个不同的点可以用来构成类似的三角形。这是离题的-应该在math.stackexchange上。com@Drew-实际上,通常有六种解决方案,因为该段可以在两个方向上相对于每一侧定向。那又怎样?OP只是想要一个类似于原始三角形的三角形,该三角形的一条边是线段。@Ted,只有三个方向会产生一个类似的三角形。@Ted:当然,你是对的(在这两个方面)。我只是想让OP多想想这个问题。