2016-11-07 6 views
0

Я пытаюсь сортировать координаты квадратного многоугольника.Сортировка координат квадрового многоугольника

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

Пример приведен ниже:

enter image description here

Все, что я получаю от этого многоугольника является наборы из 4 координат, и я хочу, чтобы отсортировать его как по часовой стрелке, каждый раз я получить его. И первая точка всегда должна быть слева вверху.

Любая идея, как подойти к этой проблеме?

+0

Имеет ли значение координирующих на первом месте? Или, если это по часовой стрелке, первая точка может быть любой (верхняя, нижняя правая и т. Д.). – Addison

+0

Первым всегда должен быть верхний правый. – GeneCode

+0

Что делать, если в верхнем правом углу находятся 2 точки? Как «(0, 1)» и «(1, 0)» квадрата, повернутого на 45 градусов? Является ли верхняя или правая более важной? – Addison

ответ

1

Отвечая на мой вопрос снова. Предполагая, что у нас есть массив точек квада. А начальная точка (0,0) не больше верхней левой. Порядок произволен. Здесь я просто помещаю точки.

NSMutableArray *pointsArray = [[NSMutableArray alloc] initWithObjects: 
           [NSValue valueWithCGPoint:rf.bottomLeft], 
           [NSValue valueWithCGPoint:rf.topRight], 
           [NSValue valueWithCGPoint:rf.topLeft], 
           [NSValue valueWithCGPoint:rf.bottomRight], 
           nil]; 

Сначала мы сортируем точки по координатам x от малого до большого.

NSArray *sortedByX = [pointsArray sortedArrayUsingComparator:^NSComparisonResult(NSValue *obj1, NSValue *obj2) { 
     CGPoint p1 = [obj1 CGPointValue]; 
     CGPoint p2 = [obj2 CGPointValue]; 
     return p1.x > p2.x; 
    }]; 

Затем мы получаем первые 2 балла (эти два в основном слева вверху и внизу слева). Поэтому мы проверяем значения Y этих двух, чтобы определить, что находится наверху и которое находится внизу, и мы можем сразу это назначить.

CGPoint Pt1, Pt2, Pt3, Pt4; 

    CGPoint ptMinX1 = [[sortedByX objectAtIndex:0] CGPointValue]; 
    CGPoint ptMinX2 = [[sortedByX objectAtIndex:1] CGPointValue]; 

    if (ptMinX1.y<ptMinX2.y) { 
     Pt1 = ptMinX1; 
     Pt4 = ptMinX2; 
    } else { 
     Pt1 = ptMinX2; 
     Pt4 = ptMinX1; 
    } 

То же самое делается для определения правильных сторон.

CGPoint ptMaxX1 = [[sortedByX objectAtIndex:2] CGPointValue]; 
    CGPoint ptMaxX2 = [[sortedByX objectAtIndex:3] CGPointValue]; 

    if (ptMaxX1.y<ptMaxX2.y) { 
     Pt2 = ptMaxX1; 
     Pt3 = ptMaxX2; 
    } else { 
     Pt3 = ptMaxX1; 
     Pt2 = ptMaxX2; 
    } 

Наконец мы получаем очки в этом порядке, по часовой стрелке:

// Pt1 Pt2 
// 
// Pt4 Pt3 

Вы можете расположить эти точки, как вам нравится (против часовой стрелки, зигзаг или любой другой)

+0

Как ваши координаты определены (x = 0 & y = 0) в левом нижнем углу? В этом случае я получаю не часовой порядок, следуя вашей формуле. –

+0

Фактически в моей системе начало координат (0,0) находится в левом верхнем углу. – GeneCode

+0

Не могли бы вы добавить свое предположение относительно происхождения в своем ответе? –

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