2014-04-17 15 views
12

Ho una semplice forma triangolare (che serve come una coda palloncino) che sto cercando di curva come la seguente:Come curva coda palloncino (semplice forma triangolare)

enter image description here

ho la shape tail memorizzato in un CGMutablePathRef ed è tracciata come segue:

- (void) drawPaths 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextAddPath(context, self.mutablePath); 

    CGPathRelease(mutablePath); 
    CGColorRelease(fillColor); 
    CGColorRelease(strokeColor); 

} 

sto cercando di fare in modo quando i ingresso certo angolo di questo algoritmo (diciamo 45 gradi) che ruota la coda e le curve molto simile foto sopra . La rotazione è ovviamente una trasformazione facile, ma farla diventare curva è ciò con cui sto lottando. Mi rendo conto che probabilmente ho bisogno di usare: CGPathAddQuadCurveToPoint tuttavia ho difficoltà a capire cosa impostare come i miei punti di controllo e sto ottenendo risultati imprevedibili. Anche questo brillante post mi ha lasciato senza tracce: Given a CGPath, how to make it curve?

Qualcuno sa come fare questo?

+2

"La rotazione è ovviamente una trasformazione facile" No, non lo è. Non è solo una rotazione; è una coppia di curve totalmente diversa. – matt

+0

@matt - Volevo dire che da solo, posso ruotare la forma attorno al suo ancoraPoint (.5, 0) (in alto al centro). Ma questo è senza curvatura della forma. –

risposta

1

Suppongo tu abbia o possa ottenere le coordinate xey sia per il punto di origine dei percorsi - la fine dei percorsi sul fumetto - e per il punto finale - la punta del triangolo - che desideri per ciascuno dei percorsi. Chiamiamo il punto di origine (xorig, yorig) e il punto finale (xend, yend). Per rendere la curva del percorso, dobbiamo calcolare un punto di coordinazione della curva quadratica ragionevole, che chiameremo (xc, yc). Credo il seguente calcolo di coordinate produrrà una curva ragionevole per voi:

xc = (xorig * 3 + xend)/4; 
yc = (xorig + xend)/2; 
CGPathAddQuadCurveToPoint(mutablePath, NULL, xc, yc, xend, yend). 

Per rendere la curva di percorso diverso, è possibile variare i pesi di xorig e xend nel calcolo del xc.

+0

Hai dimenticato di chiedere, ma per il punto di origine, se ce ne sono due, che stai prendendo? O stai prendendo il punto centrale tra entrambi questi punti? –

+0

Se sto ricordando correttamente la domanda, penso che farei un calcolo separato per ciascuno dei punti di origine. Cioè, per ogni "lato" della coda, calcolerei xc e yc specificamente per quel lato. –

1
 
@interface 
V : UIView 
@end 

@implementation 
V 
{ UIBezierPath* u1; 
    UIBezierPath* u2; 
} 

- (void) 
awakeFromNib 
{ u1 = UIBezierPath.bezierPath; 
    [ u1 
     moveToPoint:CGPointMake(0, 0) 
    ]; 
    [ u1 
     addQuadCurveToPoint:CGPointMake(10, 100) 
     controlPoint:CGPointMake(10, 30) 
    ]; 
    [ u1 
     addQuadCurveToPoint:CGPointMake(20, 0) 
     controlPoint:CGPointMake(10, 30) 
    ]; 
    u1.lineWidth = 3; 
    u1.lineJoinStyle = kCGLineJoinBevel; 

    u2 = UIBezierPath.bezierPath; 
    [ u2 
     moveToPoint:CGPointMake(0, 0) 
    ]; 
    [ u2 
     addQuadCurveToPoint:CGPointMake(50, 60) 
     controlPoint:CGPointMake(10, 30) 
    ]; 
    [ u2 
     addQuadCurveToPoint:CGPointMake(20, 0) 
     controlPoint:CGPointMake(10, 30) 
    ]; 
    u2.lineWidth = 3; 
    u2.lineJoinStyle = kCGLineJoinBevel; 
} 

- (void) 
drawRect:(CGRect)p 
{ CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 100, 100); 
    [ u1 stroke ]; 
    CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 100, 0); 
    [ u2 stroke ]; 
} 

@end 

Questo programma restituisce l'immagine seguente. Forse alcuni suggerimenti.

enter image description here

1

vorrei primo esperimento con PaintCode per vedere che tipo di codice e le variabili che posso venire con.

Problemi correlati