Как рассчитать пересечение отрезка лучевой линии предпочтительно в OpenCV?И получить его точки пересечения и расстояние от начала координат? - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть 4 отрезка линий, A, B, C и D. Каждая линия представлена ​​в виде двух точек.Например.линия А представлена ​​как точка А1 и точка А2.

enter image description here

То, что я хочу, это

  1. точка X, котораяточка, где луч A пересекается с линией B
  2. расстояние между X и A1 (начало координат)

При тестировании на пересечение луч линии A не должен

  1. пересекаются с отрезком линии D
  2. пересекаются с отрезком линии C

Как мне это сделать?

1 Ответ

0 голосов
/ 22 декабря 2018

Наконец-то начал работать на OpenCV C ++.Исходя из этого https://stackoverflow.com/a/32146853/457030.

// 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;
}

Должен быть самоочевидным.

...