考虑这个ASCII图:
A _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ D
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
B C
已知点A、B、C和D是NSMutableArray
中的CGPoints
,并已使用它们创建了一个填充的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
目前为止,只要我知道CGPoints
的顺序,我没有任何问题来创建一个CGPath
,只需通过循环它们:
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
都应该与前后的CGPoint
共享一个x
或y
坐标。 - (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