Anuncios Google

DUDA Sacar si un punto está dentro de un polígono [Lua Dev]

Necesito ayuda con una cosa.

Imaginemos un hexágono con 2 lados iguales y otros 4 iguales, como este:

Lo que yo quiero saber es si cierto punto X,Y está dentro de ese hexágono, sabiendo que ese hexágono puede rotar y desplazarse.

El hexágono está hecho con trigonometria, lo que necesito es una función que me devuelva si un punto está dentro de ese hexágono.

 

Espero que puedan ayudarme, gracias

1 Saludo


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de User170294

Haber si esto te sirve...

Lo primero que debes de pensar es el algoritmo que vas a utilizar para saber si un punto está dentro del polígono :/

Lo lógico sería tener un conjunto con todos los puntos posibles (480x272 en este caso) y otro conjunto con los puntos situados dentro del polígono (que serán calculados mediante el algoritmo). De esta manera podrás comparar si un punto está contenido en el segundo conjunto o no (si está dentro del polígono o no) ;)

Para diseñar el algoritmo (si, te voy a ayudar pero no te voy a hacer el trabajo sucio :p) también deberás de indicar al algoritmo (o función) cuantos vértices tiene este y su posición (para cada vértice será un punto del primer conjunto). Ten en cuenta que los vértices normalmente deberían ser considerados del segundo conjunto (puntos contenidos).

Con eso debería servirte :D


Imagen de jorge_97

..

Disculpa, ya lo solucioné por mi cuenta :D.

No buscaba el CODE pero tampoco el Algoritmo.

Un saludo

Imagen de Mills

Círculos

Te iba a decir lo de los círculos jeje, es que cualquier otro metodo usa for, y ya sabes que es lento para esas cosas luadev, pero bueno, si alguien lo hace en c, ahí está el código con los for también.

Saludos


Pobre PSP

Imagen de jorge_97

:D

Jajajaja con Lua aprendemos a hacer apaños xD

Con círculos hay porcentajes de error, pero vamos, son mínimos

Salu2

Esto ya es algo más

Esto ya es algo más complejo.

He encontrado este código C, será fácil portarlo:

int pnpoly(int npol, float *xp, float *yp, float x, float y)
{
  int i, j, c = 0;
  for (i = 0, j = npol-1; i < npol; j = i++) {
    if ((((yp[i] <= y) && (y < yp[j])) ||
         ((yp[j] <= y) && (y < yp[i]))) &&
        (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
      c = !c;
  }
  return c;
}

Imagen de jorge_97

;)

Gracias por la función Xerpi... no la he entendido muy bien pero bueno xD.

Al final lo he solucionado con círculos.

Como estoy trabajando con dimensiones muy pequeñas los píxeles que pierdo son pocos.

Aquí tienen la imagen que lo explica:

La zona roja es el la parte del hexágono donde no detecta el punto.

La zona amarilla y verde (No corresponde al hexágono) donde si lo puede detectar.

Quizá este metodo no sea eficaz, pero para lo que estoy haciendo me vale :D

Un saludo y gracias


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.

Si no buscas mucha precisión

Si no buscas mucha precisión es buena idea.

Si quieres puedes probar esto:

--la tabla debe ser del estilo {{x = 10, y = 20}, {x = 59, y = 13, ...}}
function pnpoly(poli, px, py)
	local c = false;
	local npol = #poli;
	local j = npol-1;
	for i = 0, i < npol do
		j = i;
		if ((((poli[i].y <= py) && (py < poli[j].y)) or
			((poli[j].y <= py) && (py < poli[i].y))) and
			(px < (poli[j].x - poli[i].x) * (py - poli[i].y) / (poli[j].y - poli[i].y) + poli[i].x))
			c = not c;
		end
	return c;
end

Imagen de Jepte

tambien puedes utilizar

tambien puedes utilizar cuadros creo que es mas facil. xd

Imagen de AitorDB

By Aitor

También otra cosa que podrías hacer es esto:

  1. Haces una captura de pantalla
  2. Con la función image.pixel(img,x,y) obtienes el color de dicho punto
  3. Si el color de dicho punto es igual al del poligono pues el punto está dentro (siempre y cuando el color del poligono solo este dentro)

 


Sígueme en Twitter: @Aitor_db

Imagen de jorge_97

Eso ya lo hice

Ya probé eso pero pierdes mucho tiempo, ocupas mucha ram y bajan los FPS.

Además no funciona muy bien...

Salu2

Pues depende de cómo lo

Pues depende de cómo lo tengas programado. Si estás tomando la captura cada ciclo por supuesto que se alenta, pero podrías tomarla cada 10-15 ciclos y ni se nota :P

Imagen de jorge_97

Sí...

La cosa es que yo queria detectar el punto para saber la colisión.

El movimiento de los objetos se realiza a 1PX ciclo. 10-15 ciclos = 10-15 PX de fallo.

Prefiero no hacer eso ya que hay otros factores como por ejemplo el cursor que también lo captura y además no se distingue muy bien los píxeles...

Salu2


Risa Dos años en SCENEBETA Risa

Click aquí para ver la Entrada de Bitácora.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.