用c++找到直线上的第三个点

Find 3rd point in a line using c++

本文关键字:三个 c++      更新时间:2023-10-16

我在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

数学太多了

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

除非你使用的是"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线条,您只需要将z坐标添加到上述公式中,就像使用xy一样…

如果你把第一个方程"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