你可以试试我的代码,我使用的是boost::geometry
,我在主函数中放了一个小测试用例。
我定义了一个具有两个点作为属性的类。
交叉产品是知道两条线是否相交的非常简单的方法。在2D中,您可以计算perp dot产品(参见perp
函数),该产品是2D乘法平面法向量上叉积的投影。要计算它,你需要得到每一行的方向矢量(见getVector
方法)。
在2D中,可以使用perp点积和线的参数方程得到两条线的交点。我找到了一个解释here。
intersect
函数返回一个布尔值来检查两条线是否相交。如果它们相交,则通过参考计算交点。
#include <cmath>
#include <iostream>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
namespace bg = boost::geometry;
// Define two types Point and Vector for a better understanding
// (even if they derive from the same class)
typedef bg::model::d2::point_xy<double> Point;
typedef bg::model::d2::point_xy<double> Vector;
// Class to define a line with two points
class Line
{
public:
Line(const Point& point1,const Point& point2): p1(point1), p2(point2) {}
~Line() {}
// Extract a direction vector
Vector getVector() const
{
Vector v(p2);
bg::subtract_point(v,p1);
return v;
}
Point p1;
Point p2;
};
// Compute the perp dot product of vectors v1 and v2
double perp(const Vector& v1, const Vector& v2)
{
return bg::get<0>(v1)*bg::get<1>(v2)-bg::get<1>(v1)*bg::get<0>(v2);
}
// Check if lines l1 and l2 intersect
// Provide intersection point by reference if true
bool intersect(const Line& l1, const Line& l2, Point& inter)
{
Vector v1 = l1.getVector();
Vector v2 = l2.getVector();
if(std::abs(perp(v1,v2))>0.)
{
// Use parametric equation of lines to find intersection point
Line l(l1.p1,l2.p1);
Vector v = l.getVector();
double t = perp(v,v2)/perp(v1,v2);
inter = v1;
bg::multiply_value(inter,t);
bg::add_point(inter,l.p1);
return true;
}
else return false;
}
int main(int argc, char** argv)
{
Point p1(0.,0.);
Point p2(1.,0.);
Point p3(0.,1.);
Point p4(0.,2.);
Line l1(p1,p2);
Line l2(p3,p4);
Point inter;
if(intersect(l1,l2,inter))
{
std::cout<<"Coordinates of intersection: "<<inter.x()<<" "<<inter.y()<<std::endl;
}
return 0;
}
编辑:跨产品和PERP积+详细删除tol
参数(题外话)
如果你问的链接,或建议一个库,然后你的问题是关闭-话题。如果没有,那么你的问题是广泛的。 –
你如何表示一条线......两点?霍夫空间? m,p? –
每条线表示为y = kx + b,并且在交点x和y两条线的值相等,所以我们可以通过方程{y = k1x + b1; y = k2x + b2} – user3514538