2013-11-21 5 views
0

Я тестирую, чтобы определить, перекрываются ли два полигона. Я разработал первую версию, которая делает простую точку в полигоне (рис. 1). Однако я ищу, чтобы обновить этот метод, чтобы справиться с ситуациями, когда вершины многоугольника A не находятся в многоугольнике B, но их линейные сегменты перекрываются (рис. B).Испытание на столкновение полигонов/испытание на перекрытие многоугольника в C# - не точка в полигоне

Любая помощь при запуске будет принята с благодарностью.

enter image description here

+0

Все, что вам нужно сделать, это противоположная точка в тесте полигона. т. е. 'var isCollision = IsPointInPolygon (a, b) || IsPointInPolygon (b, a) ' – Mike

+0

Майк, не могли бы вы рассказать немного больше? –

+0

Используя пример изображения, который вы показали на рис. 2, треугольник не имеет точки в прямоугольнике; однако прямоугольник имеет точку в треугольнике. Если два полигона перекрываются, то один из них будет иметь точку в другой. Проверьте, имеет ли A точку в B, а также, если B имеет точку в A, если либо истинно, то есть столкновение, если ни одно не верно, то они не касаются. – Mike

ответ

2

Вот пример с использованием Регион:

GraphicsPath grp = new GraphicsPath(); 

    // Create an open figure 
    grp.AddLine(10, 10, 10, 50); // a of polygon 
    grp.AddLine(10, 50, 50, 50); // b of polygon 
    grp.CloseFigure();   // close polygon 

    // Create a Region regarding to grp 
    Region reg = new Region(grp); 

Теперь вы можете использовать метод Region.IsVisible, чтобы определить, является ли область в прямоугольник или точки.

+0

Это может быть слишком дорогостоящим, но стоит попробовать. –

+0

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

+0

Это заставило меня двигаться в правильном направлении. Спасибо, Деннис. –

0

Решение:

Я изменил некоторый код найден here.

private Region FindIntersections(List<PolyRegion> regions) 
{ 
    if (regions.Count < 1) return null; 

    Region region = new Region(); 
    for (int i = 0; i < regions.Count; i++) 
    { 
     using (GraphicsPath path = new GraphicsPath()) 
     { 
      path.AddPath(regions[i].Path, false); 
      region.Intersect(path); 
     } 
    } 

    return region; 
} 

Результат:

enter image description here

Смежные вопросы