Вы можете попробовать мой код, я использую boost::geometry
, и я положил небольшой тестовый пример в основную функцию.
Я определяю класс Line с двумя точками в качестве атрибутов.
Крест продукта - очень простой способ узнать, пересекаются ли две линии. В 2D вы можете вычислить продукт точки перпа (см. Функцию perp
), который представляет собой проекцию поперечного произведения на нормальный вектор двумерной плоскости. Чтобы вычислить его, вам нужно получить вектор направления каждой строки (см. Метод getVector
).
В 2D вы можете получить точку пересечения двух линий, используя продукт точки перпа и параметрическое уравнение линии. Я нашел объяснение 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;
}
EDIT: более подробно на перекрестном продукте и ПЭРП скалярного произведения + удалить tol
аргумент (не по теме)
Если вы просите ссылки, или рекомендацию для библиотеки, то ваш вопрос выключен -topic. Если нет, тогда ваш вопрос будет широк. –
Как вы представляете строку .. две точки? поджилки-пространство? m, p? –
Каждая строка представлена в виде y = kx + b, а в точке пересечения x и y для обеих линий равны, поэтому мы можем найти ее по уравнению {y = k1x + b1; y = k2x + b2} – user3514538