2015-03-14 8 views
2

У меня возникают проблемы с лучом на пересечениях сегментов линии. Я кодирую в Lua, но примеры на любом языке были бы полезны.Пересечение сегмента Ray to Line

Я провел большую часть этой недели ищу алгоритмы или существующие функции, которые я мог бы базировать шахту прочь, и я наткнулся на это на другой день:

bool RayLineSegmentIntersection(const vec2 &o, const vec2 &d, const vec2 &a, const vec2 &b) 
{ 
    vec2 ortho(-d.y, d.x); 
    vec2 aToO(o - a); 
    vec2 aToB(b - a); 

    float denom = dot(aToB, ortho); 

    // Here would be a good time to see if denom is zero in which case the line segment and 
    // the ray are parallel. 

    // The length of this cross product can also be written as aToB.x * aToO.y - aToO.x * aToB.y. 
    float t1 = length(cross(aToB, aToO))/denom; 
    float t2 = dot(aToO, ortho)/denom; 

    return t2 >= 0 && t2 <= 1 && t1 >= 0; 
} 

Source

Однако я не уверен, что автор означает по длине, так как комментарий просто определяет кросс-произведение, и нет определенной длины функции.

Моя реализация подобна, но поскольку я не знаю, что он имеет в виду по длине, я просто беру крестик. Проблема в том, что сегменты линий, по-видимому, рассматриваются как лучи, потому что я получаю пересечения, которые не могут быть возможны, если я не пересекаю лучи. Например, луч, проходящий прямо через центр прямоугольника, сообщает о пересечениях через другие прямоугольники (теперь я петлю по линиям), чтобы он не пересекался.

Есть ли более эффективные способы решения этой проблемы или недостающая функция длины выше того, что может решить эту проблему?

Вот грубый рисунок того, что я ожидаю, чтобы это произошло, и что я думаю, что происходит:

Drawing

ответ

0

Оказывается, что этот вопрос не был алгоритм, но ошибка в другом месте в моем коде. Мне потребовалось некоторое время, чтобы понять это, но как только я это сделал, алгоритм работает отлично.

1

Несколько лет назад я использовал этот в моем простом проекте drawnig. Я нашел этот алгоритм и настроил его для своих нужд. Я надеюсь, что это как-то поможет вам.

  public virtual bool IsPointInPolygon(PointF[] polygon, PointF point) 
      { 
       bool isInside = false; 
       for (int i = 0, j = polygon.Length - 1; i < polygon.Length; j = i++) 
       { 
        if (((polygon[i].Y > point.Y) != (polygon[j].Y > point.Y)) && 
        (point.X < (polygon[j].X - polygon[i].X) * (point.Y - polygon[i].Y)/(polygon[j].Y - polygon[i].Y) + polygon[i].X)) 
        { 
         isInside = !isInside; 
        } 
       } 
       return isInside; 
      } 

Это источник я думаю - http://alienryderflex.com/polygon/