このASCII図面を考えてみましょう。
A _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ D
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
B C
ポイントA、B、C、およびDは、CGPoints
内で既知であり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
、、、... 、、から線を引く必要があります。配列内でEがBの後になく、CがLの後にない場合(これはそうではありません)、これは明らかに正しく描画されません。B → E
E → F
K → L
L → C
C → D
詳しくは
- すべての線は互いに垂直に描かれているので、すべての線はそれらの前後でまたは座標を
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