Soy un desarrollador de juegos Flash ActionScript que está un poco atrasado con las matemáticas, aunque encuentro que la física es interesante y genial.
Como referencia, este es un juego similar al que estoy haciendo: juego flash desenredado
He hecho este juego desenredado casi hasta completar la lógica. Pero, cuando dos líneas se cruzan, necesito que esas líneas cruzadas o 'enredadas' muestren un color diferente; rojo.
Sería muy amable de su parte si pudieran sugerir un algoritmo para detectar colisiones de segmentos de línea . Básicamente soy una persona a la que le gusta pensar 'visualmente' que 'aritméticamente' :)
Editar: me gustaría agregar algunos diagramas para transmitir la idea más claramente
PD Estoy tratando de hacer una función como
private function isIntersecting(A:Point, B:Point, C:Point, D:Point):Boolean
Gracias por adelantado.
Respuestas:
Utilizo el siguiente método, que es prácticamente solo una implementación de este algoritmo . Está en C #, pero traducirlo a ActionScript debería ser trivial.
Sin embargo, hay un problema sutil con el algoritmo, que es el caso en el que dos líneas coinciden pero no se superponen. El algoritmo aún devuelve una intersección en ese caso. Si le importa ese caso, creo que esta respuesta en stackoverflow tiene una versión más compleja que lo aborda.
Editar
Es extraño, lo he probado y está funcionando para mí, excepto por el caso que describí anteriormente. Usando exactamente la misma versión que publiqué anteriormente, obtuve estos resultados cuando lo tomé para una prueba de manejo:
fuente
Sin divisiones! Así que no hay problema con la precisión ni por división por cero.
El segmento de línea 1 es de A a B El segmento de línea 2 es de C a D
Una línea es una línea interminable, el segmento de línea es una parte definida de esa línea.
Compruebe si las dos cajas delimitadas se cruzan: si no hay intersección -> ¡Sin cruz! (cálculo realizado, devuelve falso)
Compruebe si la línea seg 1 se extiende a ambos lados de la línea seg 2 y si la línea seg 2 se extiende a ambos lados de la línea seg 1 (es decir, la línea Segmento 1 está a ambos lados de la Línea definida por la línea Segmento 2).
Esto se puede hacer traduciendo todos los puntos por -A (es decir, mueve las 2 líneas para que A esté en origo (0,0))
Luego verifica si los puntos C y D están en diferentes lados de la línea definida por 0,0 a B
Si aún no tiene un "No Cross", continúe usando no A, B versus C, D sino C, D versus A, B (los mismos cálculos, simplemente cambie A y C, B y D), si no hay "¡No cruz!" entonces tienes una intersección!
Busqué los cálculos exactos para el producto cruzado y encontré esta publicación de blog que explica el método también.
fuente
Solo quiero decir que lo necesitaba para mi juego Gamemaker Studio y funciona bien:
fuente
La respuesta aceptada dio una respuesta incorrecta en este caso:
Estas líneas obviamente no se cruzan, pero de acuerdo con la función en la "respuesta correcta" las líneas se cruzan.
Esto es lo que uso:
devuelve 0 = las líneas no se cruzan
devuelve> 0 = las líneas se cruzan
Actualiza para responder la pregunta:
No creé este código yo mismo. Tiene más de 5 años y no sé cuál es la fuente original. Pero..
Creo que el valor de retorno es la posición relativa de la primera línea donde se cruzan (para explicarlo mal). Para calcular el punto de intersección, probablemente podría usar lerp de esta manera:
(NO PROBÉ ESTO)
fuente