2010-07-17 12 views
8

¿Hay alguna forma que me permita encontrar todos los puntos de intersección entre una línea y una cuadrícula? (Los círculos de intersección no están dibujados a escala entre sí, sé)Encuentre la intersección entre la línea y la cuadrícula de una manera rápida

Una manera la fuerza bruta es computar muy intersección de la cuadrícula x-y con la línea, pero este algoritmo es muy ineficiente (O(m*n) , donde m es el número de cuadrícula x y n es el número de cuadrícula y).

Estoy buscando un mejor algoritmo para esto.

+2

¿Se supone que la cuadrícula es regular? –

+0

@Ignacio, sí, la cuadrícula es regular. – Graviton

Respuesta

6

Parece que necesita un Digital Differential Analyzer o Bresenham's line algorithm. Bresenham es el mismo algoritmo utilizado para dibujar líneas en un mapa de bits; en este caso, colorear un píxel es equivalente a verificar colisiones en ese cuadrado.

+0

Creo que esta debería ser la respuesta aceptada. El uso de un algoritmo como el de Bresenham dará los puntos de la grilla para verificar, y a partir de ahí los puntos de intersección individuales se pueden calcular con mucha más facilidad: se conocen todos los componentes horizontales y verticales. –

6

No estoy seguro de que realmente entiendo la pregunta. ¿Es esto lo que estás buscando por casualidad?

Illustration 1 http://i31.tinypic.com/mwwg37.png

Illustration 2 http://i27.tinypic.com/657uc1.png

+0

Quiero cada punto de intersección entre la línea roja y la línea de la cuadrícula. Entonces, los puntos son '(0, b)', '((hb)/m, h)', '(w, mw + b)', '(2w, 2wm + b)', '((2h- b)/m, 2h) ',' (3w, 3wm + b) 'y así sucesivamente – Graviton

+0

¿Qué le falta? – dtb

+0

@dtb, no falta nada. Pero quiero un algoritmo eficiente para ese – Graviton

0

Si la cuadrícula está alineado eje:

  1. averiguar la ecuación línea
  2. calcular los puntos de intersección directamente utilizando X o Y de la línea de cuadrícula como una variable fija

Si la cuadrícula es regular, la distancia entre las intersecciones con cada línea horizontal será la misma. Lo mismo ocurre con las líneas verticales. Podría hacer un algoritmo iterativo simple con dx y dy en ese caso.

Cuestiones relacionadas