Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas Con Un Algoritmo

Iniciado por pbarros, 10 de Mayo de 2006, 08:53:14 PM

« anterior - próximo »

marcode

 Aquí va mi aportación por si te sirve, tenía algo parecido ya hecho, he tenido que apañarlo un poco para que se entienda y lo puedas adaptar.

Primero se haya el número de fila y columna donde está el cursor, que es igual a su posición dividido por la distancia de cada punto.

Pero hay que hacer un par de correcciones al cursor para ajustar el comienzo a la posición del inicio de la matriz de puntos restándole este.

También para que el punto esté en el centro de la celda en lugar de estar en la esquina superior izquierda, sumando la mitad del tamaño de la distancia entre cada punto (creo que es el problema que tenías).

col = ( CursorX - InicioX + DistanciaX/2 ) / DistanciaX;
fil = ( CursorY - InicioY + DistanciaY/2 ) / DistanciaY;


después se obtiene la posición del punto a partir del inicio y de la posición de la fila/columna.

px = InicioX + col * DistanciaX;
py = InicioY + fil * DistanciaY;


si ese punto esta dentro del radio de localización se dibuja o lo que sea

if ( (px-CursorX) * (px-CursorX) + (py-CursorY) * (py-CursorY)  < Rango*Rango)
{
Circle( px, py, radio );
}

size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

zupervaca

 Este post empieza a rallar y comienza a ser ofensivo :P

Lo mas facil es que trates la pantalla como puntos del tamaño de los puntos que buscas o del rango que quieras, de esta manera lo haces como un mapa de tiles de toda la vida y no tienes que comprobar todos los puntos de pantalla, para saber si se debe de mostrar el circulo o no haces el modulo del tile (lo calculas con la coordenada del raton) contra el numero de tiles que hay de separacion entre ellos, si el modulo te da 0 es que se pinta si te da otro valor no.



Y lo dicho en mi tutoblog, hecho para una dimension hecho para todas ;)


Ejemplo:

int tilex = mouse.x / tile.width;
int tiley = mouse.y / tile.height;
if( tilex % 4 == 0 && tiley % 4 == 0 )
{
   // pintamos circulo
}

Con esto solo ya haces todos los puntos, donde puse 4 pones el numero de puntos invisibles o el rango que veas tu para hacer el efecto que quieras dar y lo mismo para tile.width y tile.height que es el ancho y alto.

marcode

 Zupervaca, tan simple lo has hecho que te has dejado cosas por resolver.

1. Das por hecho que el origen de la cuadrícula es 0,0

2. El centro de selección no es el punto medio entre un punto y el siguiente (centro de la celda) como lo entiendes tú, si no cada punto (ese es el problema fundamental que creo que tenía).

3. Si la matriz de celdas es menor que la pantalla, cuando se sale el cursor pintas también un círculo fuera o seleccionas puntos que no existen.

4. Y después de hacer todo eso hay que hallar las coordenadas del punto obtenido para dibujar el círculo.

Lo que he puesto antes es más sencillo de lo que parece y no hay que comprobar todos los puntos, échale un vistazo de nuevo, ( pero esta vez sin rallarte ) :P
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

pbarros

 Bueno, antes de seguir, me gustaría decirles que soy medio novato en esto, y no he programado antes un juego de tiles, sé que se trata de cuadros de tamaño fijo con el que se crean mapas, etc., etc. pero jamás he hecho uno. Así que para los que me han dado solución y se han referido a los tiles...  :blink: I'm sorry, pero no entiendo mucho a lo que se refieren.

La verdad es que tengo muy pocos conocimientos en lo que se refiere a juegos, hasta el momento practicamente lo único que he hecho han sido SIA y otros, que no han requerido de gráficos, ni grandes cálculos ni nada de eso, así que les pido paciencia  :(

La librería de José ([EX3]), me ha abierto un poco el mundo de la programación al mundo de los video juegos, pero como les mencionaba, estoy recién empezando.

José puede decir con propiedad cuánto lo molestaba cuando recién empecé a entender su librería, tengo su MSN y cada vez que estaba conectado lo invadía con preguntas... y le agradezco su voluntad para conmigo, todos uds. han sido de gran ayuda. Y lo más probable es que llene el foro de preguntas, no creo que sea el único que esté recién empezando y a más de alguien le servirá, aparte de mi.

Y refieriéndome un poco más a lo que quiero hacer... más de alguno habrá jugado o visto DOOM3 (ole), el menú del comienzo, en que aparece una malla de líneas; cuando acercas el ratón al vértice de alguna celda formada por esta malla, se activa la correspondiente linea horizontal y vertical. Sólo que yo no quiero que se dibujen las líneas, sino que se marque el vértice :rolleyes: .

zupervaca

 Codigo final:

int tilex = (origen.x  + mouse.x) / tile.width;
int tiley = (origen.y + mouse.y) / tile.height;
if( tilex % 4 == 0 && tiley % 4 == 0 )
{
  int xcircle = (tilex * tile.width) + (tile.width >> 1);
  int ycircle = (tiley * tile.height) + (tile.height >> 1);
  circle( xcircle, ycircle, radio );
}

¿Ta mejor asi? tile.width y tile.height no tienen por que ser del tamaño del punto, pueden ser mayor para para que en algunas zonas no se dibuje ningun circulo, ejemplo:


Los recuadros negros son los tiles o cuadricula invisible y los rojos son los puntos visibles, en la flecha verde se dibuja el ciculo por que su modulo es 0, pero en la flecha gris no ya que su modulo seria 2, como la cuadricula invisible es mayor al tamaño de los puntos la zona donde se indica que se debe de dibujar el circulo es mayor a la zona del punto.

pbarros

 zupervaca,
insisto, no son tiles, no es un mapa de tiles, si lees mi mensaje anterior te darás cuenta de lo que me propongo...

[EX3]

 La forma sencilla la que te comente, recorre el array o lista de puntos y realizas la comprobacion que dije:

Si distancia(Cursor, Punto) <= MinDistancia Entonces dibujo tile o lo que sea

Y se podria hacer tambien lo que comento Vicente, puedes dividir en diferentes regiones rectangulares la zona y asignar a cada zona una lista de puntos. Compruebas mediante MATH_PointInRect() de dx_System si la posicion del cursor esta dentro de alguna region que has definido y despues realizar la comprobacion punto a punto de la lista asignada a esa region. De esta forma te ahorrarias tener que recorrer todos los puntos de toda la zona. Es un metodo facil y sencillo en mi opinion.

Salu2...

P.D.: Te digo de usar funcion de la dx_lib32 por que me supongo que la estaras usando en tu proyecto y mas que nada por este hilo esta en el foro de la libreria :P
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

ZüNdFoLGe

 Cuando la flecha esta sobre un punto es porque las coordenadas son múltiplos de la distancia entre ellos.
Fijando un entorno, si la flecha se encuentra dentro de él, también es válido dibujar el circulo.


mouse_y = k . distancia_y + r    ( 0mouse_x = k' . distancia_x + r'

La funcionalidad de r es sumar (hasta 'entorno' cantidad)  hasta compensar para que sea múltiplo de distancia. Esto implica la resta.

Si no se cumple que r sea menor que entorno, entonces sin importar en qué lugar esté la flecha va a estar alejada del punto y su entorno.

CONDICION:    r <= entorno

ahora,  
k = mouse_coord / distancia

despejo r (para el caso de mouse_y) y r' (para el caso de mouse_x) de las ecuaciones anteriores y lo comparo con entorno

if  (((mouse_y - ((mouse_y / distancia_y) *distancia_y)) <= entorno) || ( - (mouse_y - ((mouse_y / distancia)+1)*distancia) <= entorno)) && (((mouse_x - ((mouse_x / distancia_x) *distancia_x)) <= entorno) || ( - (mouse_x - ((mouse_x / distancia_x)+1)*distancia_x) <= entorno))

   // si está entonces compenso la diferencia para que el centro del círculo sea justo el punto
   drawCircle(mouse_x+(distancia_x - ((mouse_x) % distancia_x), mouse_y+(distancia_y- ((mouse_y) %
                     distancia_y));


considero el caso en que "falte" para llegar a ser múltiplo, por esto sumo 1 en el segundo caso (segunda condicion del OR).

Es decir, si la distancia entre cada punto y es de 20 unidades, entorno 5, y la flecha se encuentra en la posición 17 entonces:

((mouse_y - ((mouse_y / distancia_y) *distancia_y)) = 17 - (0) * 20 = 17 > entorno (NO SE CUMPLE)

pero 17 sí cae en el entorno de uno de los puntos, entonces:

- (mouse_y - ((mouse_y / distancia)+1)*distancia) = - ( 17 - (0 + 1)*20 ) = 3 < entorno (SE CUMPLE)

sumar el 1 implica "pasarse" para el otro lado, para luego ver si puedo sumar un numero no mayor a entorno y llegar al múltiplo.

Y esta vez quedan contemplados ambos casos, y matemáticamente, es correcto.  (ole)

sés

 Por diox, es un simple mapa de tiles, que rebuscaos <_<
Soy indeciso... ¿o no?

ZüNdFoLGe

 
Cita de: "sés"Por diox, es un simple mapa de tiles, que rebuscaos <_<
El codigo espanta, pero  el concepto es:

SI (estoy mas arriba del punto y puedo compensar)  O (estoy mas abajo y puedo compensar) ENTONCES
      DIBUJO CIRCULO;

Hacer el mapa de tiles y andar calculando distancia entre 2 puntos o verificar esta tonta condicion son rebusques por igual  :P  

sés

 Con 2 divisiones sabes el punto más cercano, luego sólo hay que calcular la distancia para ver si estás suficientemente cerca.

:blink: ¿Rebusques?
Soy indeciso... ¿o no?

ZüNdFoLGe

 Joder "sés" qué insistente eres :blink: ; debe ser por eso los ojos de tu avatar.
No voy a seguir en la estúpida discusión de "qué es mejor" . La condición es estúpida y son solo 3 lineas, como ves, tampoco he declarado ninguna variable. En términos de costos basta con ver la función distancia mas las variables...

Math.sqrt(Math.pow((x1-x0),2)+Math.pow((y1-y0),2));


Pero claro...si no tienes ni idea de donde sale o cómo llegar a la condición puede parecerte muy rebuscado o demasiado raro.  :ph34r:  

zupervaca

 ses dejalo, ya hemos dicho que es como un mapa de tiles y no hacen caso, que lo hagan como quieran, no se dan cuenta que la solucion es plantearlo como si fuera un mapa de tiles

sés

Cita de: "ZüNdFoLGe"Joder "sés" qué insistente eres :blink:
Pero si sólo le he dicho una vez...
Soy indeciso... ¿o no?

pbarros

Cita de: "zupervaca"ses dejalo, ya hemos dicho que es como un mapa de tiles y no hacen caso, que lo hagan como quieran, no se dan cuenta que la solucion es plantearlo como si fuera un mapa de tiles
(uoh) Caballeros, está bien que sea un foro de discusión, pero no es necesario armar una pelea por la solución del problema planteado. Siempre hay más de una solución  ;) .
ses y zupervaca, si me explican cómo se hace un mapa de tiles, sin la necesidad de guardar las coordenadas en un vector, ni en ningún otro lado... y a la vez puedo hacer el cálculo... se los agradecería ;).
Y José, si, estoy usando tu librería... voy a probar la solución que me planteas.

Y gracias a todos  (ole)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.