考虑这个 ASCII 绘图:
A _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ D
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
B C
点 A、B、C 和 DCGPoints
在 an中是已知的NSMutableArray
,并已用于创建填充的CGPath
. 现在考虑这张图:
A _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ D
| |
| |
| |
| |
| H _ _ _ I |
| | | |
| | | |
| F _ _ _| | |
| | G | |
| | |_ _ _ K |
| | J | |
| | | |
|_ _ _ _| _ _ _ _ _ _ _ _ |_ _ _|
B E L C
CGPoints
E、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 之后(它们不会),那么这显然不会正确绘制。
更多信息
- 所有的线都是相互垂直的,所以所有的线都应该与它们之前和之后
CGPoints
共享一个x
或y
坐标。CGPoint
- (#1 的扩展)一个点总是与它之前和之后的点成直角。
- 无法预测点将出现在正方形内的哪个位置,并且新的点集在附加到数组末尾时可能会或可能不会按顺序排列。
- ...
其他可能的布局
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