2013-03-22 10 views
10

sto disegnando la linea utilizzando seguente codice, funziona semplicemente fantastico,Linea Disegno + Intersezione di quella linea con l'auto e anche rilevare CCSprites dentro quella linea disegnato

http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/

Ora voglio ... ..

1> Rileva se la linea si interseca con se stessa. 2) Rileva se CCSprite si trova all'interno di questa linea chiusa o meno.

Durante la ricerca mi sono imbattuto in molte logiche per LineIntersection ma nessuna di esse è accurata. Ne sto dando uno che rileva un'intersezione, ma lo rileva anche quando non c'è un'intersezione di linea.

  1. Primo metodo

    - (BOOL) lineIntersectOccured:(CGPoint)t1 pointEnd:(CGPoint)t2 
    { 
        BOOL result = NO; 
        int pointsCount = [arrlinePoints count]; 
    
        CGPoint cp1; 
        CGPoint cp2; 
    
        for(int i = 0, j = 1; j < pointsCount; i++,j++) 
        { 
         [[arrlinePoints objectAtIndex:i] getValue:&cp1]; 
         [[arrlinePoints objectAtIndex:j] getValue:&cp2]; 
    
         // lines connected do not need to be included. 
         if((cp2.x == t1.x && cp2.y == t1.y) || (cp1.x == t2.x && cp1.y == t2.y)) 
         { 
          continue; 
         } 
    
         CGPoint diffLA = CGPointMake(cp2.x - cp1.x,cp2.y - cp1.y); 
         CGPoint diffLB = CGPointMake(t2.x - t1.x, t2.y - t1.y); 
    
         float compA = diffLA.x*cp1.y - diffLA.y * cp1.x; 
         float compB = diffLB.x*t1.y - diffLB.y*t1.x; 
    
         BOOL compA1 = (diffLA.x*t1.y - diffLA.y*t1.x) < compA; 
         BOOL compA2 = (diffLA.x*t2.y - diffLA.y*t2.x) < compA; 
         BOOL compB1 = (diffLB.x*cp1.y - diffLB.y*cp1.x) < compB; 
         BOOL compB2 = (diffLB.x*cp2.y - diffLB.y*cp2.x) < compB; 
    
         if(((!compA1 && compA2) || (compA1 && !compA2)) && ((!compB1 && compB2) || (compB1 && !compB2))) 
         { 
          result = YES; 
         } 
        } 
        return result; 
    } 
    

Ed è così che io chiamo questo metodo, ho conservato i miei punti nelle arrLinePoints dal metodo pangesture riconoscitore

if ([self lineIntersectOccured:[[arrlinePoints objectAtIndex:0] CGPointValue] pointEnd:[[arrlinePoints objectAtIndex:[arrlinePoints count] - 1] CGPointValue]]) 
    { 
     NSLog(@"Line Intersected"); 
    } 

questo dà me vero anche con la seguente situazione

enter image description here

Ho anche provato la stessa funzionalità con approccio diverso con l'aggiunta di vista nel punto di vista di CCDirector

UIBezierPath intersect

Ma questo è dare problemi di prestazioni, il mio fps ridotto a quasi 3 a 6. E anche questo problema di intersezione rimane lo stesso.

la situazione ideale per intersezione è

enter image description here

Si prega di aiutare il più presto possibile! Grazie per tutto il supporto.

+0

Voglio rilevare l'intersezione della stessa linea in Cocos2d. – Anand

+0

Non implementato, penso che sia possibile rilevare il valore del pixel della linea tracciata con il valore del pixel della linea disegnata all'interno del metodo 'touchesMoved'. – NiKKi

+0

Dai un'occhiata a scribus/lib2geom functionfind_self_intersections http://www.scribus.net/svn/Scribus/branches/ScribusOTF/scribus/plugins/tools/2geomtools/lib2geom/basic-intersection.cpp. Può essere istruttivo –

risposta

1

Non implementato, penso che sia possibile rilevare il valore in pixel della linea tracciata con il valore in pixel della linea disegnata all'interno del metodo touchesMoved. Oppure è possibile consultare here per un approccio dettagliato. Lo stesso lavoro è stato fatto qui.

3

Mentre si costruisce il percorso da soli, non dovrebbe essere necessario verificare i pixel. Usa invece i punti usati per creare il percorso.

Non dovrebbe essere troppo difficile trovare un buon algoritmo di intersezione del segmento di linea. Sembra la risposta superiore di questa domanda ha un buon metodo: Determining if two line segments intersect?

Una volta trovato un colpo, l'uso che punto esatto colpo e la storia di punti per costruire un poligono.

Da lì si dovrebbe essere in grado di eseguire un test "punto in poligono".

Alcuni consigli per le prestazioni:

  1. Alla ricerca per l'intersezione, solo controlla il segmento di linea più recente di collisione con gli altri (tutte le linee che non si intersecano in precedenza non si intersecano tra di loro questa volta)
  2. si potrebbe saltare i segmenti quando si può concludere che entrambi i punti sono su un estremo del segmento di linea, per esempio si potrebbe saltare straniera se: current.ax < current.bx & & (foreign.ax < current.ax & & foreign.b.x < current.a.x)

Spero che questo ti aiuti.

+0

Grazie per bel suggerimento. – Anand

+0

+1 per suggerimento segmento di linea e 2 ° suggerimento prestazioni (1 ° comunque penso che sia spazzatura). –

+0

Ho modificato il primo suggerimento per chiarirlo, sperando di renderlo meno spazzatura. – cantgetright82

Problemi correlati