Kodumu deneyebilirsin, boost::geometry
kullanıyorum ve ana işlevde küçük bir test durumu koydum.
Öznitelik olarak iki nokta içeren bir sınıf satırı tanımlarım.
Çapraz ürün, iki çizginin kesişip kesmediğini bilmek için çok basit bir yoldur. 2D'de, 2B düzleminin normal vektöründe çapraz ürünün bir projeksiyonu olan perp nokta ürününü hesaplayabilirsiniz (bkz. perp
fonksiyonu). Bunu hesaplamak için, her satırın bir yön vektörünü almanız gerekir (bkz. getVector
yöntemi).
2B'de, perp nokta ürününü ve satırın parametrik denklemini kullanarak iki satırın kesişim noktasını alabilirsiniz. Bir açıklama here buldum.
intersect
işlevi, iki çizginin kesişip kesmediğini kontrol etmek için bir boole döndürür. Kesişirse, kesişme noktasını referans olarak hesaplar.
#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;
}
DÜZENLEME: Bir kütüphane için bağlantıları veya öneriler için soruyorsanız çapraz ürün ve Fail nokta ürünün + üzerinde daha ayrıntılı
(konu dışı)
tol
argüman silin ardından soru kapalıyken -topic. Eğer değilse, sorunuz geniş olacaktır. –Bir çizgiyi nasıl temsil ediyorsunuz .. iki nokta? hough uzayı? m, p? –
Her satır y = kx + b olarak gösterilir ve her iki çizgi için kesişme noktasında x ve y değerleri eşittir, dolayısıyla denklemle {y = k1x + b1; y = k2x + b2} – user3514538