iOS -Как нарисовать определенный CGPath с неупорядоченными CGPoints

Рассмотрим этот рисунок ASCII:

A _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ D
 |                               |
 |                               |
 |                               |
 |                               |
 |                               |
 |                               |
 |                               |
 |                               |
 |                               |
 |                               |
 |                               |
 |                               |
 |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
B                                 C

Точки A, B, C и D известны CGPointsвнутри NSMutableArrayи использовались для создания заполненного CGPath. Теперь рассмотрим этот рисунок:

A _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ D
 |                               |
 |                               |
 |                               |
 |                               |
 |            H _ _ _ I          |
 |             |     |           |
 |             |     |           |
 |      F _ _ _|     |           |
 |       |      G    |           |
 |       |           |_ _ _ K    |
 |       |          J      |     |
 |       |                 |     |
 |_ _ _ _| _ _ _ _ _ _ _ _ |_ _ _|
B         E               L       C

CGPointsE, F, G, H, I, J, K и L известны и добавлены в конец NSMutableArray.

Вопрос

Как переставить все точки в массиве, чтобы создать CGPath, как на рисунке ниже?

A _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ D
 |                               |
 |                               |
 |                               |
 |                               |
 |            H _ _ _ I          |
 |             |     |           |
 |             |     |           |
 |      F _ _ _|     |           |
 |       |      G    |           |
 |       |           |_ _ _ K    |
 |       |          J      |     |
 |       |                 |     |
 |_ _ _ _|                 |_ _ _|
B         E               L       C

В настоящее время у меня нет проблем с созданиемCGPath-если я знаю порядокCGpoints-перебирая их:

CGPoint firstPoint = [[points objectAtIndex:0] CGPointValue];
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, firstPoint.x, firstPoint.y);
for (int i = 0; i < [points count]; i++)
{
    CGPathAddLineToPoint(path, NULL, [[points objectAtIndex:i] CGPointValue].x, [[points objectAtIndex:i] CGPointValue].y);
}
CGPathCloseSubpath(path);

... но это предполагает, что линия должна быть проведена от каждой точки массива iдо следующей точки i + 1. На приведенном выше рисунке линии должны быть проведены от A → B, B → E, E → F... K → L, L → C, C → D. Если E не находится после B, а C не после L в массиве (, а они не будут ), то это, очевидно, не будет отображаться правильно.

Дополнительная информация

  1. Все линии рисуются перпендикулярно друг другу, поэтому все CGPointsдолжны иметь общую координату xили yс CGPointдо и после них.
  2. ( Расширение #1 )Точка всегда будет находиться под прямым углом к ​​точкам до и после нее.
  3. Невозможно предсказать, где точки будут находиться внутри квадрата, и новый набор точек может быть или не быть в порядке при добавлении в конец массива.
  4. ...

Другие возможные макеты

A _ _ _ _ _ _ _ K         P _ _ _ D
 |             |           |     | 
 |             |           |     |
 |             |    N _ _ _|     |
 |             |     |      O    |
 |             |_ _ _|           |
 |            L       M          |
 |                               |
 |            F _ _ _ G          |
 |             |     |           |
 |             |     |_ _ _ I    |
 |             |    H      |     |
 |             |           |     |
 |_ _ _ _ _ _ _|           |_ _ _|
B               E         J       C


A _ _ _ _ _ _ _ _ _ _ M
 |                   |           
 |                   |           
 |                   |_ _ _ _ _ _ O
 |                  N            |
 |            H _ _ _ I          |
 |             |     |           |
 |             |     |           |
 |      F _ _ _|     |           |
 |       |      G    |           |
 |       |           |_ _ _ K    |
 |       |          J      |     |
 |       |                 |     |
 |_ _ _ _|                 |_ _ _|
B         E               L       C
7
задан Anthony 21 July 2012 в 22:31
поделиться