Sie können meinen Code versuchen, ich verwende boost::geometry
und ich legte einen kleinen Testfall in die Hauptfunktion.
Ich definiere eine Klasse Linie mit zwei Punkten als Attribute.
Cross-Produkt ist sehr einfach zu wissen, ob zwei Linien schneiden. In 2D können Sie das Perp-Punkt-Produkt berechnen (siehe perp
Funktion), das eine Projektion des Kreuzprodukts auf den Normalenvektor der 2D-Ebene ist. Um es zu berechnen, müssen Sie einen Richtungsvektor jeder Linie erhalten (siehe getVector
Methode).
In 2D können Sie den Schnittpunkt von zwei Linien mit Hilfe von Perp-Punkt-Produkt und parametrische Gleichung der Linie erhalten. Ich fand eine Erklärung here.
Die Funktion intersect
gibt einen booleschen Wert zurück, um zu prüfen, ob sich zwei Linien schneiden. Wenn sie sich schneiden, berechnet sie den Schnittpunkt als Referenz.
#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: weitere Einzelheiten über Kreuzprodukt und perp Skalarprodukt + löschen tol
Argument (off topic)
Wenn Sie Links sind zu fragen, oder Empfehlungen für eine Bibliothek dann ist Ihre Frage aus -Thema. Wenn nicht, dann ist Ihre Frage zu breit. –
Wie stellen Sie eine Linie dar .. zwei Punkte? Hough-Raum? m, p? –
Jede Zeile wird als y = kx + b dargestellt, und im Schnittpunkt sind die x- und y-Werte für beide Zeilen gleich, so dass wir sie durch die Gleichung {y = k1x + b1; y = k2x + b2} – user3514538