Как рассчитать пересечение отрезка лучевой линии предпочтительно в OpenCV? И получить его точки пересечения и расстояние от начала координат?
У меня есть 4 отрезка линий, A, B, C и D. Каждая линия представлена в виде двух точек. Например. линия А представлена как точка А1 и точка А2.
https://stackru.com/images/8fdeff616df9afeae16aee690de b41d00fa4a920.png
Что я хочу это
- точка X, которая является точкой, где луч A пересекается с линией B
- расстояние между X и A1(начало координат)
При проверке на пересечение луч линии А не должен
- пересекаются с отрезком линии D
- пересекаются с отрезком C
Как мне это сделать?
1 ответ
Наконец-то все заработало на OpenCV C++. На основании этого /questions/25480320/kak-vyi-proveryaete-peresechenie-otrezka-i-lucha-ishodyaschego-iz-tochki-pod-uglom-ot-gorizontali/25480330#25480330.
// return the distance of ray origin to intersection point
double GetRayToLineSegmentIntersection(Point2f rayOrigin, Point2f rayDirection, Point2f point1, Point2f point2)
{
Point2f v1 = rayOrigin - point1;
Point2f v2 = point2 - point1;
Point2f v3 = Point2f(-rayDirection.y, rayDirection.x);
float dot = v2.dot(v3);
if (abs(dot) < 0.000001)
return -1.0f;
float t1 = v2.cross(v1) / dot;
float t2 = v1.dot(v3) / dot;
if (t1 >= 0.0 && (t2 >= 0.0 && t2 <= 1.0))
return t1;
return -1.0f;
}
// use this to normalize rayDirection
Point2f NormalizeVector(Point2f pt)
{
float length = sqrt(pt.x*pt.x + pt.y*pt.y);
pt = pt / length;
return pt;
}
// gets the intersection point
Point2f GetRayIntersectionPoint(Point2f origin, Point2f vector, double distance)
{
Point2f pt;
pt.x = origin.x + vector.x * distance;
pt.y = origin.y + vector.y * distance;
return pt;
}
Должен быть самоочевидным.