【问题标题】:Find 3rd point in a line using c++使用c ++查找一行中的第三个点
【发布时间】:2018-12-22 16:15:03
【问题描述】:

我正在使用 c++ 应用程序。它对我来说是新的。在这里,我编写了一个函数,它获得一条线的两个坐标。我必须处理这些坐标并找到同一行中的另一个点。 我将获得A(x1,y1) and B(x2,y2) 坐标。 需要找到 C(x3,y3) 坐标。 因此我计算给定线的斜率。

Double slope = (x1-x2)/(y1-y2);

而且我知道第三点到 A 点的距离。

Double dis = sqrt(pow(x2-x1) + pow(y2-y1)) * 1.35 ;

我想使用 Slopedis 找到新的坐标 x3 ,y3。

谁能帮我解决这个问题。

要计算 x3,我可以使用数学部分,

x3 = slope * y3 -------------------1

dis = sqrt(pow(x3-x1) + pow(y3-y1)) ------------2

使用这两个在运行时生成的方程,我想计算x3y3

【问题讨论】:

  • 线的斜率不是(x1-x2)/(y1-y2)而是(y1-y2)/(x1-x2)
  • 您不需要在pow 函数中指定哪个 幂吗?

标签: c++ algorithm math


【解决方案1】:

数学太多了。

x3 = (x1 - x2) * 1.35 + x2
y3 = (y1 - y2) * 1.35 + y2

【讨论】:

  • 这解决了具体问题,因为所需的距离与两点之间的距离成正比。然而,IMO 有点太具体了(并且反对一个好的答案应该很长和解释的想法)。
  • @6502:一些很棒的答案非常短……足以激起“啊哈!” “尤里卡”“yappari”时刻 - 考虑禅宗/禅宗佛教......;-P
  • @Tony:我同意。但 IMO 这不是其中一种情况。
  • @6502:嗯,我赞成你的答案而不是这个,所以我想我也必须赞成,尽管我想我现在会赞成这个。上面缺少分号让我很困扰;-)。
  • @Tony:我也赞成这个答案,但我认为有点过于简洁和过于具体的一面。顺便说一句,我的回答中也缺少一些分号:-) ...我的想法实际上是对这两行使用乳胶表示法,但对于不使用乳胶的人(以及使用乳胶的另一方可能已经知道为什么参数方程更适合二维问题)。
【解决方案2】:

除非您使用的是“1.5d”图表y=y(x),否则您永远不应使用基于y=m*x+q 的公式,因为这不适用于垂直线(并且对于接近垂直的线效果不佳)。

在您的情况下,最好的方法是使用直线的参数方程

x = x1 + t * dx
y = y1 + t * dy

其中dx = x2 - x1dy = y2 - y1 与从P1 到P2 定向的方向单位矢量的分量成正比,用于代替mq 来定义线(避免任何垂直或几乎垂直线)。

如果你需要一个特定距离上的点,那么你只需要找到实际的单位向量分量

double dx = x2 - x1;
double dy = y2 - y1;
double dist = sqrt(dx*dx + dy*dy);
dx /= dist;
dy /= dist;

然后你需要的点的坐标就是

double x3 = x1 + prescribed_distance * dx;
double y3 = y1 + prescribed_distance * dy;

或使用-prescribed_distance 代替,这取决于您想要指向哪一侧:朝向 P2 还是远离它?

但是,如果规定的距离与两点之间的当前距离成比例,则不需要归一化,结果可能更简单:

double x3 = x1 + (x2 - x1) * k;
double y3 = y1 + (y2 - y1) * k;

其中k 是规定距离与两点之间的距离之间的比率(再次使用正号或负号,取决于您对哪一侧感兴趣)。

通过使用参数方程 x=x(t), y=y(t) 而不是显式方程 y=y(x) 除了不存在依赖于坐标系的人工奇点问题之外,您还可以获得在更高维度上扩展的简单公式。例如,对于 3d 线,您基本上只需要以与使用 xy 相同的方式将 z 坐标添加到上述公式中......

【讨论】:

  • 这完全不值得,但由于某种原因,“效果不佳”引发了我的内在语法$DANGEROUSLY_RADICAL_POLITICAL_PARTY。当然,正确的说法是“效果不佳”。
  • @Chris Lutz:感谢您的更正。我是意大利人,我的英语很烂;-)
  • 我其实说不出来。我以为这只是脑残。所以显然它并没有你想象的那么糟糕。
  • 这一行有错别字吗,double y3 = y3 + specified_distance * dy;是 y3 还是别的什么?
  • @SyaifulNizamYahya:这是一个错字;固定
【解决方案3】:

如果将第一个方程 "y3 = slope * x3" 代入第二个方程 "dis = sqrt(pow(x3-x1) + pow(y3-y1))",并将两边取平方,则得到一个二次方程,您可以使用二次方程求解。

替换后得到:

dis^2 = (x3-x1)^2 + (slope*x3 - y1)^2

两边取平方:

(slope^2+1)*x3^2 + (-2*slope*y1-2*x1) + 2*y1^2 = dis^2

使用二次公式求解 x3:

x3 = (2*slope*y1+2*x1) +/- sqrt((2*slope*y1+2*x1)^b - 4*(slope^2+1)*(2*y1^2-dis^2))/(2*(slope^2+1))

将x3代入第一个方程得到y3:

y3 = slope * x3

【讨论】:

  • 对于这个问题(经常发生)使用y = m * x + q 是错误的方法。参数方程更适合...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多