2015-05-21 2 views
0

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

Вот картина, чтобы получить представление:

enter image description here

красные цифры многоугольник линии, которые существуют в списке. Затем у меня есть другой список с линиями, которые являются параллелями одной многоугольной линии, пересекающей многоугольник с определенным смещением (изображение показывает параллели с полилинией № 4). Итерация через них Я получаю точки пересечения, отображаемые в черных числах.

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

Надеюсь, вы знаете, что я имею в виду. Я бы хотел, чтобы точки пересечения всегда были одинаковыми, как показано на рисунке.

Единственная идея, которую я придумал, чтобы преобразовать текущую строку на оси координат, а затем отсортировать 2 пересечениях х значение, но я предполагаю, что это очень плохо ...

Я был бы признателен каждый ответ, который приводит меня к решению. Заранее спасибо

Вот мой фрагмент кода:

for (int i = 0; i < parallelLines.Count; i++) 
{ 
      for (int j = 0; j < polyLines.Count; j++) 
      { 
       var actual = ber.LineSegementsIntersect(
        parallelLines[i].v1, 
        parallelLines[i].v2, 
        polyLines[j].v1, 
        polyLines[j].v2, 
        out intersection); 

       // if intersection is found 
       if (actual) 
       { 
         intersections.Add(intersection);  
       } 
      } 
} 
+0

Отсортируйте линии пересечения по их расстоянию от исходной линии. – RBarryYoung

ответ

1

итерация по линиям первого во внешнем контуре, то для каждой строки получить 2 очка в определенном порядке, который вы хотите.

Измените свой код, чтобы поместить два найденных itxns во временный список, а не непосредственно в коллекцию пересечений - затем между внутренним и внешним циклами добавьте эти два объекта intx в коллекцию пересечений в правильном порядке ((один с меньшим значением х первого, или как правило вы хотите)

как это: (Предположим, что IntersectionType является объявленный тип вашего объекта Пересечения)

for (int i = 0; i < parallelLines.Count; i++) 
{ 
     var pair = new List<IntersectionType>(); 
     for (int j = 0; j < polyLines.Count; j++) 
     { 
      var actual = ber.LineSegementsIntersect(
       parallelLines[i].v1, 
       parallelLines[i].v2, 
       polyLines[j].v1, 
       polyLines[j].v2, 
       out intersection); 

      // if intersection is found 
      if (actual) pair .Add(intersection);      
     } 
     intersections.Add(pair.OrderBy(i=>i.XValue).First()); 
     intersections.Add(pair.OrderByDescending(i=>i.XValue).First()); 
} 

о, кстати, переменная actual, если он это то, что я думаю, это должно быть переименовано в found, или , лучше, рефакторинг как:

for (int i = 0; i < parallelLines.Count; i++) 
{ 
     var pair = new List<IntersectionType>(); 
     for (int j = 0; j < polyLines.Count; j++) 
      if(ber.LineSegementsIntersect(
       parallelLines[i].v1, parallelLines[i].v2, 
       polyLines[j].v1, polyLines[j].v2, 
       out intersection)) 
       pair .Add(intersection); 
     intersections.Add(pair.OrderBy(i=>i.XValue).First()); 
     intersections.Add(pair.OrderByDescending(i=>i.XValue).First()); 
} 
+0

не знаю точно, что вы имеете в виду. Я добавил свой код к вопросу – GeoGecco

+0

в порядке, я вижу, как вы это делаете ... Измените его, чтобы поместить два найденных itxns во временный список, а не непосредственно в коллекцию пересечений - тогда между внутренним и внешним циклами добавьте те два объекта intx в коллекцию пересечений в правильном порядке ((тот, который сначала имеет меньшее значение x, или любое другое правило) –

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