Dibujo lineal + Intersección de esa línea con uno mismo y también detectar CCSprites dentro de esa línea dibujada.

Estoy dibujando la línea usando el siguiente código, funciona simplemente increíble,

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

Ahora quiero …..

1> Detectar si la línea se intersecta con sí misma. 2) Detectar si CCSprite está dentro de esta línea cerrada o no.

Durante la búsqueda encontré muchas lógicas para LineIntersection, pero ninguna de ellas es precisa. Estoy dando uno de ellos que detecta una intersección, pero también lo detecta cuando no hay intersección de línea.

  1. Primer método

    - (BOOL) lineIntersectOccunetworking:(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; } 

Y así es como llamo a este método, he almacenado mis puntos en los arrLinePoints del método reconocedor de pangesture

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

Esto me da verdad incluso con la siguiente situación

introduzca la descripción de la imagen aquí

También he probado la misma funcionalidad con un enfoque diferente al agregar vista en la vista de CCDirector

Intersección UIBezierPath

Pero esto está dando problemas de performance, mis fps se networkingujeron a casi 3 a 6. Y también ese problema de intersección sigue siendo el mismo.

La situación perfecta para la intersección es

introduzca la descripción de la imagen aquí

¡Por favor ayuda tan pronto como sea posible! Gracias por todo el soporte.

Mientras construyes la ruta tú mismo, no debería ser necesario probar los píxeles. En su lugar, use los puntos utilizados para crear la ruta.

No debería ser demasiado difícil encontrar un buen algorithm de intersección de segmento de línea. Parece que la respuesta principal de esta pregunta tiene un buen método: ¿ Determinar si dos segmentos de línea se cruzan?

Una vez que hayas encontrado un golpe, usa ese punto de golpe exacto y el historial de puntos para build un polígono.

Desde allí, debería poder realizar una testing de "punto en polígono".

Algunos consejos para el performance:

  1. En la búsqueda de la intersección, solo verifique el segmento de línea más reciente para colisionar con los demás (todas las líneas que no se cruzaron anteriormente no se cruzarán entre sí esta vez)
  2. Puede omitir segmentos cuando puede concluir que ambos puntos están en un extremo del segmento de línea, por ejemplo, podría omitir los valores externos si: current.ax <current.bx && (foreign.ax <current.ax && foreign.bx <current .hacha)

Espero que esto te ayude.

Sin embargo, no implementado, supongo que puede detectar el valor de píxel de la línea dibujada con el valor de píxel de su línea dibujada dentro del método touchesMoved. O puede consultar aquí para un enfoque detallado. El mismo trabajo se ha hecho aquí.