Hola todos, en los ?ltimos d?as me surgi? un problema, y la verdad no he encontrado ning?n buen m?todo para resolverlo, necesito obtener una coordenada aleatoria que este dentro de un angulo y rango determinado, no se bien como explicarlo as? que dejo esta imagen como ejemplo.



Como ver?n las coordenadas (7,1) (8,1) y ( 9,4) est?n dentro del angulo pero (2,1) (1,2) y (2,4) no lo est?n, lo que necesito es obtener aleatoriamente cualquiera de las coordenadas que est?n dentro del ?rea azul.

No es necesario leer esto.
En mi juego el angulo que se ve azul en la imagen seria la visi?n de mi personaje, para lograr obtener la coordenada he intentado varias cosas como elegir una coordenada aleatoria de todo room luego revisar si el producto escalar de un vector que va de la coordenada en la que esta mi personaje a el numero aleatorio y un vector que apunta en la direcci?n de mi personaje es menor a la mitad de la medida del angulo de visi?n de mi personaje, si no lo es,  se repite la misma operaci?n, el m?todo funciona pero aveces es muy lento. Espero que entiendan esta parte.

Gracias de antemano.

#1 Junio 23, 2011, 06:06:57 AM Ultima modificación: Junio 23, 2011, 06:33:27 AM por Texic
Podr?as calcular un ?ngulo aleatorio en base al ?ngulo de visi?n, supongamos que fuere 45?
random(45)
Luego en base a ese ?ngulo aleatorio sac?s una distancia aleatoria en base a la distancia que hay entre el personaje y el limite del room, esto habr?a q pensar en c?mo sacarlo con precisi?n, en un rato hago alguna f?rmula y te digo. Luego q sacas esa distancia aleatoria usas
lengthdir_x(dir,len)
lengthdir_y(dir,len)

Para obtener la posici?n final del objeto en cuesti?n. Y listo!
Como dije, ahora me fijo c?mo sacar la distancia hasta afuera del room

EDITO: Listo, ya saqu? algo para conseguir el len, no es el algoritmo m?s eficaz del mundo pero no soy un as en matem?ticas xD
x1=x
y1=y
while x1<room_width and x1>0 and y1<room_height and y1>0 {len+=5 x1=x+lengthdir_x(len,dir) y1=y+lengthdir_y(len,dir)}
len-=5


Te lo dejo con ejemplo y todo




#2 Junio 23, 2011, 06:41:09 AM Ultima modificación: Junio 23, 2011, 07:06:45 AM por brunoxzx
oh que buena idea texic ese m?todo es cien veces mas eficaz que cualquiera que se me halla ocurrido y ni siquiera es complicado, aunque creo que puedo mejorar el c?digo para obtener la distancia al final del room, a algo que no use while, ahora edito y te digo que tal me funciono.

P.D. yo tampoco se mucho de matem?ticas pero leyendo unos cuantos articulos he aprendido mucho te dejo unos links de donde aprend? lo del producto escalar (dot product), la parte 1 es algo b?sica y la 2 es muy ?til.

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/
http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-2/

Edit: excelente me funciono a la perfecci?n, muchas muchas gracias, si se me ocurre algo para optimizar lo de la distancia al final del room lo posteare.

#3 Junio 23, 2011, 06:35:57 PM Ultima modificación: Junio 23, 2011, 06:38:47 PM por Zeit
Hola, otro metodo es usar coordenadas polares:
1. tu personage tiene una direccion de vision de a grados (o radianes).
2. la amplitud de la vision es de 2b grados simetrica con respecto a la direccion vision.
3. la longitud de vision es de d pixeles (no puede tener vision infinita).
4. la solucion es:
   I. generar un angulo aleatorio c (en grados o radianes) de entre (a-b,a+b).
   II. generar un numero aleatorio r para la distancia del objeto con respecto al personaje de entre (0,d).
   III. x=r*cos(c);
        y=r*sin(c);
   IV. solo falta sumarle la posicion del personaje por que lo anterior es para el origen.
Espero te sirva y si necesitas un ejemplo puedo hacerlo, por cierto solo hay que limitar para que no salga del room si es que esto importa. Saludos.
Saludos Cordiales!!!

@ Zeit la verdad tuve que buscar eso de coordenadas polares en google  :-[ y por lo que entend? lo que tu dijiste es exactamente lo mismo que texic dijo, solo que texic lo puso con programaci?n y tu en formulas matem?ticas (creo) de igual modo gracias.

@Texic all? esta el c?digo para obtener la distancia al final del room, dudo mucho que sea el mejor, pero al menos es mas r?pido que usar un while.

[gml]x1=lengthdir_x(1,dir)
y1=lengthdir_y(1,dir)
len=min(abs((sign(floor(x1)+1)*room_width-x)/x1),abs((sign(floor(y1)+1)*room_height-y)/y1))[/gml]

P.D: No lo puedo creer te bajaron otro punto de karma texic XD pero me imagino que ya no te importa de cualquier modo tu karma ya no era perfecta.

Wow, buen c?digo, lo voy a probar, si sirve ser?a util para otras cosas. Y no, ya fue lo del karma, seguro me lo van a seguir bajando, pero la verdad ya est?, creo que me conocen lo suficiente ya como para no guiarse en el karma a la hora de saber si soy buena persona o no




Bueno en mi caso el c?digo funciona a la perfecci?n. Como sea te recomiendo leer los links que postee (no se si as? se escriba) y sobre lo del karma, como dijiste ya todos sabemos quien y como eres, as? que solo ser?n un par de n?meros bajo tu nombre.