Considerate questo disegno ASCII:iOS - Come disegnare un CGPath specifico con CGPoints non ordinate
A _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ D
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
B C
punti A, B, C, e D sono noti CGPoints
all'interno di un NSMutableArray
e sono stati utilizzati per creare un riempito CGPath
. Ora consideriamo questo disegno:
A _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ D
| |
| |
| |
| |
| H _ _ _ I |
| | | |
| | | |
| F _ _ _| | |
| | G | |
| | |_ _ _ K |
| | J | |
| | | |
|_ _ _ _| _ _ _ _ _ _ _ _ |_ _ _|
B E L C
CGPoints
E, F, G, H, I, J, K e L sono noti e sono stati aggiunti alla fine della NSMutableArray
.
La questione
Come posso riorganizzare tutti i punti all'interno della matrice per creare un CGPath
che si presenta come il disegno sottostante?
A _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ D
| |
| |
| |
| |
| H _ _ _ I |
| | | |
| | | |
| F _ _ _| | |
| | G | |
| | |_ _ _ K |
| | J | |
| | | |
|_ _ _ _| |_ _ _|
B E L C
Attualmente non ho problemi a creare un CGPath
- se conosco l'ordine del CGpoints
- da loop attraverso di loro:
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);
... ma questo presuppone che un linea dovrebbe essere disegnata da ogni punto nell'array i
al seguente punto i + 1
. Nel disegno sopra, le linee dovrebbero essere disegnate da A → B
, B → E
, E → F
... K → L
, L → C
, C → D
. Se E non è dopo B e C non è dopo L nell'array (che non saranno), ovviamente questo non verrà disegnato correttamente.
Ulteriori informazioni
- Tutte le linee vengono disegnate perpendicolari tra loro, in modo che tutti
CGPoints
dovrebbero condividere unx
oy
coordinata con laCGPoint
prima e dopo di loro. - (Un'estensione di # 1) Un punto sarà sempre ad angolo retto rispetto ai punti prima e dopo di esso.
- Non è possibile prevedere dove si verificheranno i punti all'interno del quadrato e la nuova serie di punti potrebbe essere o meno in ordine quando aggiunta alla fine dell'array.
- ...
altri layout possibili
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
Come stai mettendo i punti nel tuo array? Perché non puoi semplicemente averli nell'ordine che ti serve? – rdelmar
I punti sono sempre ad angolo retto tra loro o è solo per l'esempio? –
@rdelmar i punti vengono aggiunti in un momento sconosciuto dopo l'inizializzazione dell'array. Gli unici quattro punti nella matrice all'inizializzazione sono i quattro angoli. – Anthony