计算有一条垂直线的交点
Evaluating the intersection point with a vertical line involved
函数返回由点p0, p1
和p2, p3
定义的两条直线之间的交点:
#include "std_lib_facilities.h"
#include <iostream>
struct Point{
Point(int xx, int yy): x(xx), y(yy) { }
int x;
int y;
};
// find the intersection of two lines
Point intersectPoint(Point& p0, Point& p1, Point& p2, Point& p3){
// line formed by p0p1
double dx1 = p1.x - p0.x;
double dy1 = p1.y - p0.y;
double m1 = dy1 / dx1;
double c1 = p1.y - m1 * p1.x;
cout <<"m1: "<< m1 <<'n';
// line formed by p2p3
double dx2 = p3.x - p2.x;
double dy2 = p3.y - p2.y;
double m2 = dy2 / dx2;
double c2 = p3.y - m1 * p3.x;
cout <<"m2: "<< m2 <<'n';
// find intersection point
double epsilon = 1e-6;
// (-1,-1) represents no intersection
if (abs(m1 - m2) < epsilon) return Point(-1,-1);
else{
double interX = (c2 - c1) / (m1 - m2);
double interY = m1 * interX + c1;
cout <<"(interX, interY): "<< interX <<", "<< interY <<'n';
return Point(interX, interY);
}
}
//------------------------------------------------------------------------------------------------
int main(){
Point verticalStart(100, 100);
Point verticalEnd(100,300);
Point horizontalStart(50,200);
Point horizontalEnd(150,200);
Point intersection = intersectPoint(horizontalStart ,horizontalEnd, verticalStart, verticalEnd);
cout <<"returned value: n";
cout << "( "<< intersection.x <<", "<< intersection.y <<" )n";
getchar();
return 0;
}
在垂直和水平相交的情况下,我得到一个输出:
m1: 0
m2: 1.#inf
(interX, interY): -0, 200
returned value:
( 0, 200 )
问题:
如何处理这种情况,使函数返回有效的交点?
注意:代码是在MVS2010上编译的
我建议不要使用斜截表示,即:y = a*x + b
,而是矢量参数表示:
Pa = (P1-P0)*t + P0
Pb = (P3-P2)*u + P2
这样,行x = k
确实有一个表示。
对变量t
和u
(两个变量,两个方程,对于两个坐标x
和y
)求解方程组,其中Pa = Pb
(交点),并在其中一个方程中反代得到交点。
相关文章:
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 如何在 Win32 中用一条线连接 2 个文本框?
- C++ 如何在同一行中和在一条线上?
- 如何在SDL2窗口上使用Cairo绘制一条白色直线
- 在Opengl中绘制一条不显示C++的线
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- x86 - 为什么编译器在下一条指令中插入看似毫无意义的JMP?
- CMake似乎忽略了一条线
- 在C 中使用Legacy OpenGL(即时模式)绘制一条厚线
- 在图像标签上画一条线并计算距离
- switch 语句结束和下一条语句之间的时间是否具有确定性(与路径无关)
- 如何在OMNET++中收到来自前一个模块的所有消息后将一条消息发送到下一个模块
- 一条线和两行声明之间的差异
- C++ OpenCV:检测两条线而不是一条线(Canny & findContours)
- 如何在C++中将边列表转换为邻接矩阵,其中包含连接到顶点的边数而不是一条边?
- 为什么 fstream 打印出文件的最后一条记录
- 如何在另一条消息(M1)之前调用带有消息(M2)的lambda函数,但输出要"M2 M1"?
- 如何在子小部件而不是父窗口小部件上绘制一条线
- 在C++中,文件中的下一条记录被非法更新
- 计算有一条垂直线的交点