用c++找到直线上的第三个点
Find 3rd point in a line using c++
我在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 ;
我想用Slope
和dis
找到新的坐标x3,y3。
谁能帮我解决这个问题?
我可以用数学部分
来计算x3 x3 = slope * y3 -------------------1
dis = sqrt(pow(x3-x1) + pow(y3-y1)) ------------2
使用在运行时生成的这两个方程,我想计算x3
和y3
。
数学太多了
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 - x1
和dy = y2 - y1
与从P1到P2的方向单位向量的分量成正比,用来代替m
和q
来定义直线(避免任何垂直或几乎垂直的直线问题)。
如果你需要一个特定距离上的点那么你只需要用
找到实际的单位矢量分量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
坐标添加到上述公式中,就像使用x
和y
一样…
如果你把第一个方程"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
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- 如何知道n!是否可以表示为三个连续数字的乘法?
- 我有三个 getline,但是一旦编译,输入就太多了
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- 有没有更好的方法对C++中的三个整数进行排序?
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- 为什么 getch 在按下函数或箭头键时返回三个值?
- 使用三个数字比较器进行排序
- 我想在C++代码中比较这三个术语
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 我该如何编码,使计算机知道两个名称条目和三个名称条目之间的区别
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 如何通过通用引用或std::forward将这三个c++模板函数合并为一个
- 首先处理第二个和第三个堆与第一个和第二个堆之间的逻辑差异
- 异常处理:如果用户输入不是三个特定字符之一
- 为什么将三个变量与 == 一起比较会计算为 false?
- 重载运算符 new 和运算符 delete 带有三个参数
- 有没有更简单的方法可以从用户那里获取三个数字并按升序打印它们?