Отвечая на мой вопрос снова. Предполагая, что у нас есть массив точек квада. А начальная точка (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
Вы можете расположить эти точки, как вам нравится (против часовой стрелки, зигзаг или любой другой)
Имеет ли значение координирующих на первом месте? Или, если это по часовой стрелке, первая точка может быть любой (верхняя, нижняя правая и т. Д.). – Addison
Первым всегда должен быть верхний правый. – GeneCode
Что делать, если в верхнем правом углу находятся 2 точки? Как «(0, 1)» и «(1, 0)» квадрата, повернутого на 45 градусов? Является ли верхняя или правая более важной? – Addison