Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: Tachikomaia en 18 Noviembre 2022, 09:06 am



Título: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: Tachikomaia en 18 Noviembre 2022, 09:06 am
1- Su velocidad de caída aumenta 0.01 por segundo (segundo es un decir, es más bien una centésima de segundo).

2- Sus velocidades hacia los costados (X), adelante (Y, arriba) y arriba (Z, distancia con respecto al suelo) deben ser acordes a la fuerza del jugador que realiza el tiro. La velocidad hacia abajo aumentará, pero me refiero a las velocidades iniciales. Si por ejemplo tiene fuerza 4 y aplicó 3 para que la pelota avance 3 pixeles (es un decir) por segundo entonces no puede ser que la pelota se eleve 2 pixeles por segundo, ya que la fuerza que queda disponible es sólo 1.

3- Cuando llega a la red la Z de la pelota debe ser igual o mayor a cierto valor, es decir, se debe preestablecer un valor que represente la mínima Z con la que la pelota pasa por encima de la red sin tocarla, y cuando llegue a la red debe tener ese valor o uno mayor. En mi caso es 17.5 pero elijan el que gusten.

4- Debe caer en la cancha rival.

5- Las velocidades deben ser tales que la pelota caiga en cierto punto. Por ejemplo:
(https://i.ibb.co/52209nb/Sin-t-tulo.png)

6- Su velocidad hacia adelante (Y) debe ser la máxima posible.


Es decir, se intenta que se cumpla una condición en tanto eso no cause que no se cumplan las otras.
3- Se quiere que la pelota pase por encima de la red, pero sin que ello implique que haya caído más/menos de lo que debe (condición 1) ni que se le haya aplicado más fuerza de la que se estableció como posible (condición 2). Si el jugador no tiene suficiente fuerza como para que se cumpla esta condición, no se cumple.
4- La oración anterior.
5- Lo mismo. Si para cumplir las condiciones anteriores es necesario que el tiro no vaya tan diagonal como se quiere, entonces no irá tan así, irá más bien verticalmente.
6- En tanto se cumplan las condiciones anteriores... Si la fuerza es 10 la velocidad Y no debe ser mayor que eso. Si queriendo asignar determinada fuerza a Y luego sin importar cuánta se asigne a Z la pelota no pasa la red o no cae en la cancha rival, entonces habrá que reducir la velocidad Y...


Por si los necesitan o quieren, les dejo los datos del caso (pero pueden inventar otros, lo que sí debe tenerse en cuenta es que no necesito simplemente averiguar 3 numeritos basados en otros, sino un método para averiguarlos teniendo en cuenta que los otros pueden variar, por ejemplo se puede elegir hacer un saque hacia al medio o puede que el personaje tenga distinta fuerza):
NOTA: Ignoren lo de "_level0."
  Variable _level0.AlexFuerza = 10
  Variable _level0.BallX = 417
  Variable _level0.BallY = 548
  Variable _level0.BallZ = 43.8
  Variable _level0.DistanciahastaDestinoX = 136.9
  Variable _level0.DistanciahastaDestinoY = 368
  Variable _level0.DistanciahastaRed = 248
  Variable _level0.DistanciahastaMinsafeBallZ = 26.3


Gracias.

Ah: El incremento de Y está invertido, es decir, entre más abajo más valor.
0,0________600,0
0,800______600,800


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: RayR en 22 Noviembre 2022, 04:23 am
Esto se resuelve con cálculo de parábolas. Si entiendo bien, lo que quieres hacer es averiguar cuánta "fuerza" en x y en y debes ejercer para que la pelota caiga en un punto específico (y obviamente, que pase la red) ¿no?

Si es así, para resolverlo solo necesitas un poco de matemáticas, y en particular de trigonometría, pero nada demasiado complicado. No es una solución de cortar y pegar en tu código, pero no debería ser difícil implementarla y en su caso, tomarla como base para adaptarla. De todas formas, pongo en negrita los cálculos que necesitas hacer en tu programa. El resto son más bien explicaciones breves.

En tu mensaje no indicas que la pelota pueda hacer curva en el eje x, así que no hay necesidad de complicarte usando 3 dimensiones al hacer los cálculos, cuando en realidad es un problema de sólo 2 dimensiones. Por lo tanto, para calcular la parábola solo hay que usar los ejes (x, y). La forma de visualizar la curva que forma la pelota es esta:

(https://i.ibb.co/hX95vZJ/grafica.png)


El trayecto que recorre depende de la velocidad inicial, (lo que llamas fuerza), de su ángulo, y de la gravedad (lo que llamas "velocidad" de caída). Recalco lo de velocidad inicial, puesto que la fuerza es otra cosa y no se relaciona directamente con la velocidad. En tu programa la puedes seguir llamando fuerza sin problemas, pero aquí usaremos el término adecuado. También hay que aclarar que no se distribuye de la manera en que piensas, así que esto:

Citar
Si por ejemplo tiene fuerza 4 y aplicó 3 para que la pelota avance 3 pixeles (es un decir) por segundo entonces no puede ser que la pelota se eleve 2 pixeles por segundo, ya que la fuerza que queda disponible es sólo 1.

no es correcto. Si la velocidad inicial total (v0) es 4, y 3 "se van" a la velocidad inicial en x (vx), entonces la velocidad en y (vy) no es de solo 1 pixel/seg, sino aproximadamente 2.64.  Esto es porque la velocidad total no es igual a la suma de las velocidades horizontal y vertical. En realidad, v0 es exactamente igual a la hipotenusa de un triángulo cuyos catetos son vx y vy. O sea:

v0 = raiz(vx2 + vy2).

Si sustituyes v0 por 4, y vx por 3, comprobarás que vy = raiz(7) o alrededor de 2.64.

Lo que determina dónde caerá la pelota y cómo se distribuirá v0 en vx y vy, es el ángulo inicial. Calculándolo, obtienes vx y vy con las ecuaciones que pongo más adelante.

Aclarado todo lo anterior, las ecuaciones para calcular las coordenadas (x, y) de la pelota en cada instante del trayecto son:

1) x = v0 * cos(θ) * t
2) y = v0 * sen(θ) * t - (g * t2)/2

donde θ es el ángulo, g es la gravedad, t es el tiempo (que de momento no interesa, pero servirá más adelante), y ya sabes que v0 es la velocidad inicial total.

Para resolver tu problema, y hacerlo en 2D, primero debes calcular la distancia total (que llamaremos x) hasta el punto destino:

x =  raiz(DistanciahastaDestinoX2 +  DistanciahastaDestinoY2)

Luego tienes que determinar, dada v0, cuál es el ángulo que permite que la pelota alcance el destino. Para esto puedes aplicar la fórmula del rango (v0, como habíamos dicho, es el valor de AlexFuerza):

R = (v02 * sen(2θ))/g

donde R representaría la distancia total en x que se recorre antes de caer al suelo. Como este valor ya lo conocemos (lo calculamos en el paso anterior), podemos despejar para calcular el ángulo:

θ = arcsen(g * R / v02)/2

Ojo: si la distancia a recorrer es muy larga y tenemos poca "fuerza", puede darse el caso de que sea imposible alcanzar el destino. Si quieres verificarlo, asegúrate de que g * R / (v02) sea mayor o igual a -1 y menor o igual a 1, de lo contrario es imposible llegar, sin importar el ángulo. También aclaro que para simplificar he hecho algunas suposiciones basándome en tu mensaje (por ejemplo, no especificas si hay variaciones en la altura inicial), pero igualmente creo que te serviría de manera general.

Una vez conocido el ángulo, podemos calcular vx y vy:

vx = v0 * cos(θ)
vy = v0 * sen(θ)


que es lo que buscabas. Sin embargo, todavía falta verificar si con ese tiro libramos la red. Para eso hay que calcular la distancia hacia la red siguiendo la trayectoria de la pelota, pues aunque la posición de la red sea fija, en cada tiro, si cambia la posición inicial de la pelota y/o el destino, la distancia hacia la red también cambiará. La forma de hacerlo es calculando las coordenadas donde la línea del trayecto de la pelota intersecta la línea formada por la red. Veo que tienes la variable DistanciahastaRed, aunque no sé si la calculas con cada tiro, pero suponiendo que sea correcta, lo que sigue es calcular la altura de la pelota en el momento t en el que pasa por la red. Para esto usamos las ecuaciones de la parábola que te puse al inicio. La primera servirá para calcular t:

t = x/(v0 * cos(θ))
en tu caso: t = DistanciahastaRed/(v0 * cos(θ))

Una vez obtenida t, la sustituyes en esta ecuación para calcular la altura:

y = v0 * sen(θ) * t - (g * t2)/2

Ya sólo queda verificar que y > altura de la red. Si no es así, significa que no tienes suficiente fuerza para hacer ese tiro.


Editado con algunas correcciones y aclaraciones.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: Tachikomaia en 23 Noviembre 2022, 10:51 am
Esto se resuelve con cálculo de parábolas. Si entiendo bien, lo que quieres hacer es averiguar cuánta "fuerza" en x y en y debes ejercer para que la pelota caiga en un punto específico (y obviamente, que pase la red) ¿no?
Y en z.

Citar
En tu mensaje no indicas que la pelota pueda hacer curva en el eje x
¿Como sucede aquí:
https://www.youtube.com/watch?v=yDIWBPwzi_0
?
Por ahora no.

Citar
no hay necesidad de complicarte usando 3 dimensiones al hacer los cálculos, cuando en realidad es un problema de sólo 2 dimensiones
Pero son 3 velocidades a calcular...

Citar
El trayecto que recorre depende de la velocidad inicial, (lo que llamas fuerza), de su ángulo, y de la gravedad (lo que llamas "velocidad" de caída). Recalco lo de velocidad inicial, puesto que la fuerza es otra cosa y no se relaciona directamente con la velocidad. En tu programa la puedes seguir llamando fuerza sin problemas, pero aquí usaremos el término adecuado.
¿Me puedes dar más info?

Citar
También hay que aclarar que no se distribuye de la manera en que piensas
Más o menos lo tengo claro sí, hace años un profesor de matemática me dijo que yo estaba contando mal, usando el método del taxista, me explicó y más o menos entendí.
Lo que dije fue simplificando.

Citar
la velocidad total no es igual a la suma de las velocidades horizontal y vertical
¿Tampoco en caso de que se dedique el 100% a una velocidad sola?

Citar
g es la gravedad
Por las dudas: Mi "simulación" de la gravedad funciona así:
https://foro.rinconmatematico.com/index.php?topic=51754.msg205838#msg205838
¿Es como en la realidad? ¿cómo es en la realidad?

Citar
Ojo: si la distancia a recorrer es muy larga y tenemos poca "fuerza", puede darse el caso de que sea imposible alcanzar el destino.
Lo tenía en cuenta.

Citar
También aclaro que para simplificar he hecho algunas suposiciones basándome en tu mensaje (por ejemplo, no especificas si hay variaciones en la altura inicial)
No me di cuenta de especificarlo: Sí, puede variar.
Pídeme lo que creas necesario.

Citar
aunque la posición de la red sea fija, en cada tiro, si cambia la posición inicial de la pelota y/o el destino, la distancia hacia la red también cambiará
Correcto.

Citar
Veo que tienes la variable DistanciahastaRed, aunque no sé si la calculas con cada tiro
Es la idea, aunque aún no la apliqué. Por las dudas: Esa distancia la calculo usando sólo la distancia Y. No sé si así sirve.


Perdona pero no me cierra mucho que resuelvas el problema usando sólo 2 dimensiones, además de que calculas 2 velocidades y yo necesito 3, o al menos con 2 no veo cómo puede funcionar.

Antes de intentar aplicar tu método decime qué piensas de esto (me lo dijeron hace tiempo o le agregué Z basado en lo que me habían dicho):
Código
  1. Norma = Math.sqrt(DistanciahastaDestinoX*DistanciahastaDestinoX+DistanciahastaDestinoY*DistanciahastaDestinoY+BallZ*BallZ);
  2.  
  3. BallXSpeed = DistanciahastaDestinoX/Norma*-AlexFuerzadetiros;
  4.  
  5. BallYSpeed = DistanciahastaDestinoY/Norma*-AlexFuerzadetiros;
  6.  
  7. BallZSpeed = BallZ/Norma*-AlexFuerzadetiros;
  8.  

AlexFuerzadetiros es lo que antes llamé AlexFuerza.

BallZ es lo mismo que decir DistanciahastaDestinoZ ya que el destinoZ es 0 (el suelo) y BallZ es la altura a la que está la pelota, es la distancia al suelo...

Este proceso me da buenos resultados AUNQUE como podrás deducir no cumple todas las condiciones.
La 3 (pasar por encima de la red) no la cumple a menos que el jugador estuviera muy cerca de la red o algo así.
La 4 (caer en la cancha rival) no la cumple si la fuerza es muy baja, pero también ocurre porque el método no tiene en cuenta que la pelota cae +0.01 por segundo.
Lo que pasa con la 5 (caer en cierto punto) es muy similar a lo que pasa con la 4.

Bueno ¿qué opinás de este método? ¿va bien encaminado y necesita ajustes, o hacer esos ajustes es más complicado que usar tu método? Es que me supera. Igual lo intentaré aplicar próximamente a ver qué resulta.

Por si te interesa te dejo lo que tengo hecho del juego:
https://workupload.com/file/WDjGSMhbSje
Es un rar con un exe dentro. Te pasaría un swf en vez de eso pero dudo que lo puedas reproducir. Está enlentecido porque intento ver claramente algunas cosas.
Etapa 1: Te movés con las flechas del teclado. Al presionar la tecla A, eleva la pelota y pasa a la etapa 2.
Etapa 2: Al presionar A de nuevo, saca. Si la pelota vuelve a la mano (si no presionas A antes de que pasen algunos segundos), vuelve a la etapa 1.
Cliqueando en el botón Reset o presionando Space vuelve a empezar.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: RayR en 26 Noviembre 2022, 03:44 am
¿Como sucede aquí:
https://www.youtube.com/watch?v=yDIWBPwzi_0
?
Por ahora no.


Sí, a eso me refería, y mejor, porque eso lo podría complicar bastante.

Citar
Pero son 3 velocidades a calcular...


Cuando escribí esto:

Citar
en realidad es un problema de sólo 2 dimensiones. Por lo tanto, para calcular la parábola solo hay que usar los ejes (x, y). La forma de visualizar la curva que forma la pelota es esta:

Me refería a que para calcular el ángulo inicial de v para la parábola, sólo se usan 2 dimensiones: la altura y la distancia "hacia adelante". Esta última tú la ves como 2 dimensiones (y como una diagonal en tu dibujo) porque la perspectiva es aérea, pero no tendría que ser forzosamente así. Una buena forma de visualizar esto es imaginar que observamos el tiro desde una perspectiva lateral donde el eje horizontal es paralelo a la trayectoria que seguirá la pelota. Se ve mejor en esta imagen:

(https://i.ibb.co/ZJhqLz1/vista.png)

Si estuviéramos donde está el círculo amarillo de esa imagen, y a ras de suelo, veríamos lo que te puse en la imagen de mi mensaje anterior, que es la que debes tener en mente todo el tiempo que hablemos de la parábola. Desde ahí sólo tenemos 2 dimensiones, ya que la pelota ni se acerca ni se aleja de nosotros. Los cálculos que se hagan son igualmente válidos. Ese cambio de perspectiva, por así decirlo, es lo que se consigue al hacer esto que te había escrito:

Citar
Para resolver tu problema, y hacerlo en 2D, primero debes calcular la distancia total (que llamaremos x) hasta el punto destino:

x =  raiz(DistanciahastaDestinoX2 +  DistanciahastaDestinoY2)

Nota que estamos combinando DistanciahastaDestinoX y DistanciahastaDestinoX en una sola dimensión, que llamamos x, para hacer los cálculos de la parábola. Naturalmente, luego habrá que reconvertir a 3D para mostrar en pantalla. No lo especifiqué porque no tenía idea de qué tanto conoces de estos temas, pero básicamente lo que se hace es revertir la combinación. Más adelante te digo cómo.

Para evitar confusiones, siempre que mencione x o y, me estaré refiriendo a estos ejes desde la perspectiva lateral del dibujo de mi mensaje anterior. Y cuando quiera hacer referencia a la toma aérea (llamémosla coordenadas de pantalla), usaré tus variables BallX, BallY, etc. Si ves el dibujo de la toma lateral, verás que x se refiere a la trayectoria de la pelota (que en coordenadas de pantalla puede ser diagonal, pero desde nuestra perspectiva siempre es de izquierda a derecha simplemente), mientras que y es la altura, que se correspondería con BallZ.

Citar
¿Me puedes dar más info?

Si te refieres a la fuerza, es sólo por ser quisquilloso. Lo que pasa es que en física la fuerza es algo muy concreto que no se mide en distancia por segundo sino en newtons y se refiere a cuánta aceleración le puedes imprimir a un cuerpo de acuerdo con su masa, por lo que no se traduce directamente en velocidad. Solamente sería útil si quisieras una simulación ultra realista, que tome en cuenta la masa de la pelota, quizás resistencia del viento, etc., pero para algo como un juego sencillo sólo complicaría las cosas innecesariamente. Como dije es perfectamente válido llamarla fuerza en tu juego, pero si buscas información en internet o libros, el término que encontrarás es velocidad inicial.

Citar
¿Tampoco en caso de que se dedique el 100% a una velocidad sola?

En ese caso sí, pero es más bien por coincidencia. Como te comenté, la forma en que se distribuye la velocidad es: v0 = raiz(vx2 + vy2). Si la velocidad es totalmente vertical, la horizontal será cero (y viceversa), luego v0 = raiz(vy2 + 0), así que v0 = vy, pero sólo para este caso.

Citar
Por las dudas: Mi "simulación" de la gravedad funciona así:
https://foro.rinconmatematico.com/index.php?topic=51754.msg205838#msg205838
¿Es como en la realidad? ¿cómo es en la realidad?

Más o menos, en el sentido de que va ejerciendo una aceleración hacia abajo a lo largo del tiempo. En la realidad es más o menos como el método que te pongo (salvo que simplificamos obviando resistencia del viento, masa, etc.). De hecho, las ecuaciones de parábola que uso son justo las que encontrarías en un libro de física.

Citar
No me di cuenta de especificarlo: Sí, puede variar.

Entonces hay que hacer algunos cambios, ya que la fórmula del rango R es para cuando la altura inicial y final son iguales. También se hacía esa suposición en la ecuación de la parábola para y, que ahora quedaría así (otra vez, en negrita lo que realmente necesitas calcular en el programa):

y = h + v0 * sen(θ) * t - (g * t2)/2

donde h es la altura inicial de la pelota.

La distancia en línea recta, x, entre la pelota y el objetivo se sigue calculando igual:

x =  raiz(DistanciahastaDestinoX2 +  DistanciahastaDestinoY2)

El cálculo del ángulo se complica, pero sólo un poco. Queremos el valor de θ que permite que cuando la bola caiga (cuando y = 0) haya recorrido la distancia x deseada, así que la ecuación para y queda:

h + v0 * sen(θ) * t - (g * t2)/2 = 0

Pero como no conocemos t, necesitamos usar la otra ecuación que puse en el otro mensaje:

t = x/(v0 * cos(θ))

Sustituimos t por esto en la ecuación para y:

h + v0 * sen(θ) * x/(v0 * cos(θ)) - (g * (x/(v0 * cos(θ)))2)/2 = 0

Si la manipulamos un poco usando las propiedades de las funciones trigonométricas, la podemos convertir en una ecuación de segundo grado que se puede resolver con la fórmula general, y que al final reducimos a esto:

θ = arctan((v02 ± raiz(v04 - (g * (g*x2 - 2*v02*h))))/(g*x))

Como toda ecuación cuadrática puede tener 2 soluciones, por lo que es posible que haya 2 ángulos válidos.

Aquí conviene primero calcular el valor del que se saca la raíz:

disc  = v04 - (g * (g*x2 - 2*v02*h))

Si disc (que es equivalente al discriminante típico de la ecuación cuadrática) es negativo, significa que no tienes la "fuerza" necesaria para el tiro. Si es cero, las 2 soluciones son idénticas, así que sólo hay un ángulo. En caso contrario, hay dos ángulos distintos. Procedes a calcularlo(s):

θ1 = arctan((v02 + raiz(disc))/(g*x))
θ2 = arctan((v02 - raiz(disc))/(g*x))


Lo que seguiría es verificar, para cada ángulo, si pasa la red. Esto no cambia, y se sigue haciendo como en el mensaje anterior. Si sólo uno de los 2 ángulos lo consigue (o sólo había un ángulo), es el que hay que usar. Si los dos lo hacen, toca elegir el que quieras. Si lo que buscas es el que permita mayor velocidad hacia adelante (y menor altura), escoge el menor de θ1 y θ2.

Finalmente, para poder ir mostrando en pantalla la trayectoria, toca convertir las velocidades a 3D. BallZSpeed es la más simple (recuerda que en el mensaje anterior se calcularon vx y vy):

BallZSpeed = vy

aunque con este método no la necesitarías, ya que lo ideal sería calcular directamente la posición BallZ con la misma ecuación de la parábola:

BallZ = h + v0 * sen(θ) * t - (g * t2)/2

de nuevo, h es el valor original de BallZ al momento del tiro, y en t pones el número de segundos transcurridos.

Para las otras dos, hay que hacer unos cálculos. De la misma forma que nuestra x combina DistanciahastaDestinoX con DistanciahastaDestinoY, vx combina  BallXSpeed con BallYZSpeed. Para separarlas hay que conocer el ángulo de inclinación del trayecto de la bola visto desde arriba. Primero, hay que considerar el caso especial para cuando el destino está en línea totalmente vertical: eso significaría que toda la velocidad se aplicó en una sola dirección:

si (DistanciahastaDestinoX == 0)
   BallYSpeed = vx
   BallXSpeed = 0


en caso contrario, primero calculas la pendiente m de la trayectoria (vista desde perspectiva aérea/de pantalla):

m = DistanciahastaDestinoY/DistanciahastaDestinoX

luego su ángulo α:

α = arctan(m)

y con eso obtienes:

BallXSpeed = vx * cos(α)
BallYSpeed = vx * sen(α)


Sí, es vx en ambos casos, porque contiene las 2 velocidades combinadas.

Citar
Es la idea, aunque aún no la apliqué. Por las dudas: Esa distancia la calculo usando sólo la distancia Y. No sé si así sirve.

No. Eso sólo te serviría si el tiro es exactamente en línea recta vertical (en coordenadas de pantalla/vista aérea), pero cuando es en diagonal esa distancia cambia, y además depende del punto de la red por el que la pelota pase.Como te había dicho, lo que se hace es calcular la intersección de la recta que define la red con la del trayecto de la pelota. Hay más de un método para la intersección; no sé si los conozcas.

Citar
Antes de intentar aplicar tu método decime qué piensas de esto (me lo dijeron hace tiempo o le agregué Z basado en lo que me habían dicho):

¿Es el método que usas en tu juego? No está mal, salvo que, como dices, no toma en cuenta la gravedad, y si después la aplicas, descompones totalmente los cálculos. Además ese método hace que la pelota baje desde el primer momento, cuando para ciertos ángulos, primero debería elevarse. Así y todo se ve aceptable, pero no sé si podrías meterle la gravedad de forma convincente ni qué tan complicado sería.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: Tachikomaia en 1 Mayo 2023, 13:51 pm
En otro foro alguien me estaba respondiendo esto de un modo que yo lo entendía más que como me lo estaban explicando aquí y no seguí respondiendo aquí porque si intentar entenderlo de una manera me resultaba complicado, se imaginan si fueran 2, pero la persona del otro foro abandonó, yo en parte también, y ahora quiero retomar, así que retomo esto y envío un privado a RayR a ver si él también quiere. Respuestas de otros también son bienvenidas.

fuerza
Yo le llamaba fuerza a la medida de la capacidad de hacer que la pelota se mueva rápido, ahora uso fuerza de tiros que es calculado basado en varias cosas, pero en el fondo sigue siendo lo mismo. Músculos, no sé, es una palabra común en videojuegos.

...

Si la gravedad atrayera 1cm/s a la pelota, y la pelota está en 100cm, entonces con mi fórmula ocurriría esto:
En 1s cayó 1cm.
En 2s cayó 1cm+2cm
En 3s cayó 3cm+3cm
En 4s cayó 6cm+4cm
En 5s cayó 10cm+5cm
¿Con la fórmula que me dices qué ocurriría? Puede que necesite saberlo por si hago algo simplificado en algún momento y resulta que no quedaría bien porque caería a velocidades distintas.

Citar
primero debes calcular la distancia total (que llamaremos x) hasta el punto destino:

x =  raiz(DistanciahastaDestinoX^2 +  DistanciahastaDestinoY^2)
Considerando que estás trabajando en 2d y midiendo las distancias de un modo más complejo que yo, primero te pediría que me digas cómo obtengo DistanciahastaDestinoX y DistanciahastaDestinoY.

Si DhDX es como la línea que has puesto en la imagen, ten en cuenta que no sé cómo hacer que el programa gire los datos de modo que la línea quede totalmente horizontal.

DhDY supongo que es simplemente la altura a la que está la pelota (Z en la perspectiva aérea).

Empecemos por eso o, si quieres, continúa donde la otra persona me dejó, te muestro lo que me parece más relevante del cálculo pero si crees que falta algo me puedes avisar.
Nota: Es vista aérea.
Código
  1. // Datos para determinar velocidades del tiro.
  2. DistanciahastaDestinoX = 280.1-BallX;
  3. DistanciahastaDestinoY = 180-BallY;
  4. DistanciahastaMinsafeBallZ = BallZ-18.6;
  5. BallZwhenstriked = BallZ;
  6. DistanciahastaDestinoXY = Math.sqrt(DistanciahastaDestinoX*DistanciahastaDestinoX+DistanciahastaDestinoY*DistanciahastaDestinoY);
  7. DistanciahastaRed = DistanciahastaDestinoXY * Math.abs(BallY-300) / DistanciahastaDestinoY;
  8. // Determinando velocidades del tiro.
  9. BallXSpeed = DistanciahastaDestinoX/DistanciahastaDestinoXY*AlexFuerzadetiros;
  10. BallYSpeed = DistanciahastaDestinoY/DistanciahastaDestinoXY*AlexFuerzadetiros;
  11. BallZSpeed = 0;
  12. // Datos para determinar posiciones de la pelota.
  13. Tiempotranscurridodeltiro = 0;
  14. BallXwhenstriked = BallX;
  15. BallYwhenstriked = BallY;
DistanciahastaRed no entiendo cómo está calculada. BallY es en qué punto del eje Y está la bola, 300 es donde está la red, la distancia es la resta hecha absoluta, lo demás no lo entiendo.
AlexFuerzadetiros es básicamente lo que te expiqué, la fuerza del personaje, Alex.
Falta calcular la velocidad Z, pero la fuerza del personaje parece haber sido usada toda en dar velocidad X e Y, así que el cálculo de esas parece mal.

Luego tengo:
Código
  1. function Ballmoving () {
  2. Tiempotranscurridodeltiro = Tiempotranscurridodeltiro+1;
  3. BallX = BallXwhenstriked+BallXSpeed*Tiempotranscurridodeltiro;
  4. setProperty (BallShadow, _x, BallX);
  5. setProperty (Ball, _x, BallX);
  6. BallY = BallYwhenstriked+BallYSpeed*Tiempotranscurridodeltiro;
  7. setProperty (BallShadow, _y, BallY);
  8. DistanciaXYrecorrida = AlexFuerzadetiros * Tiempotranscurridodeltiro * C;
  9. Senodelangulodeltiro = Math.sqrt(1-C*C);
  10. BallZ = BallZwhenstriked + AlexFuerzadetiros * Tiempotranscurridodeltiro * Senodelangulodeltiro;
  11. BallZ = BallZ - 0.01 * Tiempotranscurridodeltiro*Tiempotranscurridodeltiro /2;
  12. }
C supongo que es Coseno, pero casi nada sé de eso.
La posición de BallZ parece que está mal calculada, demasiadas sumas y multiplicaciones (a menos que fueran números negativos pero lo dudo).
Y el resultado es este si el personaje tiene poca fuerza:
https://drive.google.com/file/d/1bY60WE73Gvh7eUFoRX8NAeuBoWIaYtNJ/view?usp=share_link
está aplicando más de la que tiene y además la pelota debe pasar más cerca de la red.

Con un poco más:
https://drive.google.com/file/d/1YEhAz8nrcztWpttScLOeMekfXlZHUVZ9/view?usp=share_link

¿Puedes arreglar eso? Aquí tienes su post:
https://foro.rinconmatematico.com/index.php?topic=122044.msg492794#msg492794

Gracias.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: RayR en 3 Mayo 2023, 04:29 am
Actualmente no tengo mucho tiempo, pero si tienes algunas dudas puntuales con respecto a lo que te expliqué anteriormente, te podría ayudar cuando pueda.

Sólo vi muy de pasada lo del otro foro, pero por lo que veo el método es esencialmente el mismo que te di, aunque algunas cosas allá las calculan de forma más directa, pero, en mi opinión, más difícil de entender si no estás muy metido en las matemáticas, como creo que es el caso. También parece que te estaban dando ecuaciones para que la bola pase sobre la red exactamente a una cierta altura (¿?), pero, al menos aquí en este foro, lo que pedías era simplemente que fuera mayor o igual a un valor.

Si la gravedad atrayera 1cm/s a la pelota, y la pelota está en 100cm, entonces con mi fórmula ocurriría esto:
En 1s cayó 1cm.
En 2s cayó 1cm+2cm
En 3s cayó 3cm+3cm
En 4s cayó 6cm+4cm
En 5s cayó 10cm+5cm
¿Con la fórmula que me dices qué ocurriría?

Esos cálculos están mal. Como te había dicho, con tu fórmula sí estás aplicando una especie de "aceleración" pero no correctamente. Si la gravedad es 1 cm/s2,  entonces, si empezamos a contar en el momento en que la bola comienza a caer:

en 1 s, habrá caído 0.5 cm
en 2 s, habrá caído 2 cm
en 3 s, habrá caído 4.5 cm

porque la distancia s recorrida por un cuerpo con aceleración constante a (en este caso, la gravedad, o g), luego de t segundos es:

s = v0 * t + a * t2/2

donde v0 es la velocidad inicial. Como en tu ejemplo calculas el momento justo en que empieza a caer, v0 = 0, por lo que sólo queda: a * t2/2, y de ahí salen las distancias que te puse. Esas son las que te daría con la fórmula que yo te puse, y que en realidad es la misma que se usa en este fragmento de código que acabas de poner:

Código
  1. BallZ = BallZwhenstriked + AlexFuerzadetiros * Tiempotranscurridodeltiro * Senodelangulodeltiro;
  2. BallZ = BallZ - 0.01 * Tiempotranscurridodeltiro*Tiempotranscurridodeltiro /2;

Citar
Considerando que estás trabajando en 2d y midiendo las distancias de un modo más complejo que yo, primero te pediría que me digas cómo obtengo DistanciahastaDestinoX y DistanciahastaDestinoY.

Primero, corrijo un error de tecleo de mi mensaje anterior. Donde puse:

Citar
Nota que estamos combinando DistanciahastaDestinoX y DistanciahastaDestinoX en una sola dimensión,


Debería decir:

Citar
Nota que estamos combinando DistanciahastaDestinoX y DistanciahastaDestinoY en una sola dimensión,

Creo que era muy obvio, pero mejor aclarar.

Ahora, DistanciahastaDestinoX y DistanciahastaDestinoY son exactamente las variables que se supone que tú ya tienes, como pusiste en tu primer mensaje. Recuerda que como te mencioné ahí, cuando use tus nombres de variables, me estaré refiriendo a ellas desde la vista aérea. O sea, en cualquier ecuación que yo ponga, si aparecen nombres de variables de tu código, las debes poner tal cuál las tengas, sin necesidad de convertirlas.


Citar
Empecemos por eso o, si quieres, continúa donde la otra persona me dejó, te muestro lo que me parece más relevante del cálculo pero si crees que falta algo me puedes avisar.

Lo de revisar y arreglar lo de la otra persona sería una pérdida de tiempo para mí, dado que en mis otros dos mensajes ya está, me parece, casi todo lo necesario para implementar lo que quieres.

Citar
DistanciahastaRed no entiendo cómo está calculada.

Esto sí es conveniente explicarlo, dado es algo que omití porque, como te dije en el mensaje anterior, no sabía si ya lo estabas calculando. Va un ejemplo para entenderlo. Supongamos que la distancia hasta la red estuviera justo a la mitad del trayecto desde el jugador al destino (DistanciahastaDestinoXY). Entonces:

Código
  1. DistanciahastaRed = DistanciahastaDestinoXY * 0.5;

Y si en realidad la distancia hasta la red fuera 1/4 de la distancia al destino, multiplicarías por 0.25, etc. Así que necesitamos calcular esa razón (1/2, 1/4, etc.) y con ello obtenemos DistanciahastaRed. Dado que conocemos la distancia en Y hasta la red (BallY-300), y también la distancia en Y hasta el destino DistanciahastaDestinoY, si las divimos, conseguimos el valor necesitado. Así, en cada tiro:

DistanciahastaRed = DistanciahastaDestinoXY * Math.abs(BallY-300) / DistanciahastaDestinoY;

la parte en negrita será 0.5, 0.25, etc.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: Tachikomaia en 3 Mayo 2023, 16:35 pm
También parece que te estaban dando ecuaciones para que la bola pase sobre la red exactamente a una cierta altura (¿?), pero, al menos aquí en este foro, lo que pedías era simplemente que fuera mayor o igual a un valor.
Me entreveré porque hay 2 tipos de tiros: Rápido y profundo.

La diferencia se nota si el personaje no tiene tanta fuerza.

En el profundo, se intenta que la bola bote en lo más profundo del área de saque, por lo que, si el personaje no tiene suficiente fuerza (pero suficiente como para pasar la red), golpeará un poco hacia arriba, será como un globito, la bola pasará a una distancia considerable de la red.

En el rápido, se intenta que la bola llegue a la cancha rival lo más rápido posible, independientemente de si bota profundo o no, por lo que siempre que el personaje tenga suficiente fuerza como para pasar la red, pasará a la mínima altura posible (18.6).

Prefiero que los cálculos sean para el profundo, ya que si se saca hacia el centro con poca fuerza, botaría fuera del área de saque y tendría que corregir eso; primero quiero lo mínimo necesario, o más importante.

Citar
Esos cálculos están mal. Como te había dicho, con tu fórmula sí estás aplicando una especie de "aceleración" pero no correctamente. Si la gravedad es 1 cm/s2,  entonces, si empezamos a contar en el momento en que la bola comienza a caer:

en 1 s, habrá caído 0.5 cm
en 2 s, habrá caído 2 cm
en 3 s, habrá caído 4.5 cm

porque la distancia s recorrida por un cuerpo con aceleración constante a (en este caso, la gravedad, o g), luego de t segundos es:

s = v0 * t + a * t2/2

donde v0 es la velocidad inicial. Como en tu ejemplo calculas el momento justo en que empieza a caer, v0 = 0, por lo que sólo queda: a * t2/2, y de ahí salen las distancias que te puse.
Gracias por la explicación.

Citar
corrijo un error de tecleo (...) Creo que era muy obvio
Sí, no problem.

Gracias también por la explicación de DistanciahastaRed.

Bueno... ¿y qué hago en el código? ¿qué agrego, qué modifico o quito?


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: RayR en 5 Mayo 2023, 04:43 am
Me entreveré porque hay 2 tipos de tiros: Rápido y profundo.

La diferencia se nota si el personaje no tiene tanta fuerza.

En el profundo, se intenta que la bola bote en lo más profundo del área de saque, por lo que, si el personaje no tiene suficiente fuerza (pero suficiente como para pasar la red), golpeará un poco hacia arriba, será como un globito, la bola pasará a una distancia considerable de la red.

En el rápido, se intenta que la bola llegue a la cancha rival lo más rápido posible, independientemente de si bota profundo o no, por lo que siempre que el personaje tenga suficiente fuerza como para pasar la red, pasará a la mínima altura posible (18.6).

Prefiero que los cálculos sean para el profundo, ya que si se saca hacia el centro con poca fuerza, botaría fuera del área de saque y tendría que corregir eso; primero quiero lo mínimo necesario, o más importante.

Sí, esa parte está clara, la pelota no sólo debe pasar por encima de la red sino que además debe hacerlo a la menor altura posible. Pero "lo más bajo posible" es distinto de "exactamente".

Piensa bien qué es lo que quieres hacer, porque si arbitrariamente cambias las condiciones, no se llega a ningún lado. Como te dije, lo que te pusieron en el otro foro es para que la pelota pase exactamente a la mínima altura posible, y en ese caso, la velocidad no la puedes decidir tú, sino que se calcula con las ecuaciones que te dieron. Y esas velocidad resultante no tiene por qué corresponderse con la "fuerza" que tiene tu jugador. Es decir, no usan AlexFuerza para nada, sino que te imponen el valor que esa variable debe tener.

El método que yo te puse no tiene la restricción de que la pelota tenga que pasar exactamente a una altura, sino simplemente que lo haga sobre la red, y por eso no impone o "inventa" la fuerza, sino que la toma directamente de la que tú eliges (mi variable v0 es lo mismo que AlexFuerza) y lo que te da es el ángulo (o distribución de las velocidades, que es lo que pedías) o ángulos, pues pueden ser dos, con los que debe ser lanzada la pelota para que caiga en el destino deseado. Luego se verifica si alguno de esos ángulos pasa por encima de la red, y si ambos lo hacen, eliges el que convenga: el menor tendrá más velocidad "hacia adelante" y el mayor se elevará más. Sin embargo, también tiene sus limitaciones. Dado que no es nada flexible con la fuerza (toma exactamente el valor de AlexFuerza, que al menos yo entendí que era lo que pretendías), el tiro no necesariamente será el más óptimo, a diferencia del otro que te dieron, pero que no usa tu fuerza. No hay una única solución perfecta que cumpla todas las condiciones, por lo que antes que nada debes pensar cuál te parece más conveniente.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: Tachikomaia en 8 Mayo 2023, 18:27 pm
Sí, esa parte está clara, la pelota no sólo debe pasar por encima de la red sino que además debe hacerlo a la menor altura posible. Pero "lo más bajo posible" es distinto de "exactamente".
¿Cual es la diferencia?

Repito:
Código:
Si el jugador no tiene suficiente fuerza como para que la pelota pase la red,
   no debe pasar
sino si tiene suficiente fuerza pero debe lanzarla hacia arriba para que pique en lo profundo del área del saque, o para que bote ahí al menos,
   la lanza hacia arriba, puede que pase bastante por encima de la red
sino
   pasará casi rozando la red, a la mínima altura posible (pero por encima de la red), que exactamente determiné que es 18,6.

En el siguiente video puedes ver esos casos, pero no está bien porque la fuerza se reparte 100% en XY y luego también puede usarse 100% en Z o algo así, el código es un lío además.
https://drive.google.com/file/d/1jyrIyycu_joxlfIblj5IDEwZ_Y3giSPR/view?usp=share_link

Con fuerza 10 no hay problema (aunque no puede usarla toda creo, tendría que usar un golpe liftado o algo así, pero eso es otro tema).
Con fuerza 5 pasa un poco más arriba.
Con fuerza 2 pasa muy por arriba.
Con fuerza 1 no pasa la red aunque se apunte desde el centro hacia el centro.

Citar
lo que te pusieron en el otro foro es para que la pelota pase exactamente a la mínima altura posible, y en ese caso, la velocidad no la puedes decidir tú, sino que se calcula con las ecuaciones que te dieron. Y esas velocidad resultante no tiene por qué corresponderse con la "fuerza" que tiene tu jugador. Es decir, no usan AlexFuerza para nada, sino que te imponen el valor que esa variable debe tener.
Es porque expliqué mal o quien respondió no entendió. Creo que desde el inicio dije que quería que la fuerza dependiera del personaje, de una variable (eso es la condición 2 y está al comienzo de este tema), que por dónde pase es secundario (condición 3, es decir, que debe cumplirse pero sin que dejen de cumplirse las anteriores).

...

Por lo que dices tu método daría el resultado que quiero. Si además sirve para determinar 2 posibles tipos de tiro (profundo o veloz), mejor. Que el tiro no sea el más óptimo está bien, si el personaje no tiene suficiente fuerza no debe poderla usar de la nada ¿o es posible que con menos fuerza pueda hacer tiros mejores?


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: RayR en 9 Mayo 2023, 03:05 am
¿Cual es la diferencia?

Como te había dicho, las ecuaciones que estoy poniendo usan exactamente la fuerza que tu personaje tenga, de manera que cuando digo "lo más bajo posible", es lo más bajo posible con la fuerza disponible. Pudiera ser que no tengas la suficiente para pasar la pelota a exactamente 18.6 m al llegar a la red, pero sí a 19.5 m. En tal caso, si pidieras exactamente 18.6 m, la respuesta sería que es imposible. Si en cambio pides la menor altura posible (siempre que sea por encima de la red) se te daría el ángulo que la pasa a 19.5 m.

Citar
Repito:
Código:
...pero debe lanzarla hacia arriba para que pique en lo profundo del área del saque, o para que bote ahí al menos

Eso no estaba estaba originalmente, así que mi método no lo toma en cuenta. De todas formas creo es mejor que primero trates de hacer que funcione bien con las condiciones originales.

Citar
En el siguiente video puedes ver esos casos, pero no está bien porque la fuerza se reparte 100% en XY y luego también puede usarse 100% en Z o algo así, el código es un lío además.
https://drive.google.com/file/d/1jyrIyycu_joxlfIblj5IDEwZ_Y3giSPR/view?usp=share_link

Sin conocer bien todos los parámetros, como las coordenadas (¿y AlexAcc es la gravedad?), es difícil saber bien lo que pasa, pero en ninguno de los casos la fuerza se está repartiendo al 100% en XY. Como te había dicho anteriormente, la velocidad total no es la suma de las individuales sino:

v = raiz(vx2 + vy2).

De hecho, aún incorporando la velocidad en Z, no llega al 100% de la disponible. ¿Estás usando el método del otro foro?

Citar
Por lo que dices tu método daría el resultado que quiero. Si además sirve para determinar 2 posibles tipos de tiro (profundo o veloz), mejor.

Si te refieres a profundo y veloz tal como los definiste arriba, no. Ninguno de los dos tiros que obtengas hará que la pelota pique en el área de saque, porque, de nuevo, esa condición no estaba cuando escribí mis primeras dos respuestas. Con los dos posibles ángulos que te dan mis ecuaciones, la pelota cae directamente en el destino deseado en la cancha rival, simplemente uno es más "globeado" y otro más directo.

Citar
Que el tiro no sea el más óptimo está bien, si el personaje no tiene suficiente fuerza no debe poderla usar de la nada ¿o es posible que con menos fuerza pueda hacer tiros mejores?

Con mi método obtienes el tiro ideal usando exactamente la fuerza disponible. Sin embargo, en algunos casos, usando menos fuerza podrías conseguir tiros que pasen más bajo, es decir, más cercanos a la red (y obviamente, cumpliendo con tus otras condiciones), pero determinar esto complicaría las cosas, por lo que aquí también creo que es mejor que te enfoques en tratar de implementar correctamente mi método o el del otro foro.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: Tachikomaia en 9 Mayo 2023, 21:52 pm
Pudiera ser que no tengas la suficiente para pasar la pelota a exactamente 18.6 m al llegar a la red, pero sí a 19.5 m.
Ese caso sólo ocurriría si también la bola está muy alto y la debe golpear hacia abajo ¿no? Porque sino, si la puede elevar a 19.5 m también debería poderla elevar a 18.6 ¿no? Si es así, nos estamos entendiendo.

Citar
Eso no estaba estaba originalmente
En mi opinióbn sí, es la condición nro 5:
Citar
5- Las velocidades deben ser tales que la pelota caiga en cierto punto. Por ejemplo:
(https://i.ibb.co/52209nb/Sin-t-tulo.png)
https://foro.elhacker.net/programacion_general/ayuda_con_calculos_para_que_la_trayectoria_de_una_pelota_cumpla_ciertas_condiciones-t516487.0.html;msg2266250#msg2266250

Citar
Sin conocer bien todos los parámetros, como las coordenadas (¿y AlexAcc es la gravedad?), es difícil saber bien lo que pasa, pero en ninguno de los casos la fuerza se está repartiendo al 100% en XY. Como te había dicho anteriormente, la velocidad total no es la suma de las individuales sino:

v = raiz(vx2 + vy2).

De hecho, aún incorporando la velocidad en Z, no llega al 100% de la disponible. ¿Estás usando el método del otro foro?
Te comenté que el código de eso, con la cancha naranja y las letras, es un lío y lo hice hace mucho, 2012, así que no te puedo explicar mucho.

AlexAcc es la puntería del jugador (Acc = accuracy), la idea era que si es menos de 10 los tiros se pudieran desviar más entre menos sea el valor. Pero es 10 ahí y no programé del todo eso, así que nada hace.
La gravedad es 0.01 ahí también si mal no recuerdo (es difíciil porque no la definí en una variable ni siquiera como spin, gran error).

Lo de la suma lo entendí, pero en este método se hace eso que pusiste, es decir se reparte la fuerza en XY así como pusiste, pero luego se vuelve a usar toda la fuerza en Z si se necesita, pero entonces la fuerza se puede usar toda 2 veces, está mal.

El método está basado en algo que me dijeron hace años, y lo de Z lo hice yo, mal. No está basado en lo que me dijeron en el foro que te mostré.

Las medidas de la cancha también son distintas de las que uso ahora (cancha azul).
(https://i.ibb.co/6J91DGg/Tenis-del-2012-explicaci-n.png)

La mínima altura por la que debe pasar la pelota era distinta también, creo que 24.51.

Le pongo tantos comentarios * como pueda.
Código
  1. Pow = _level0.AlexPow;
  2. // * Considéralo una abreviación.
  3. Caso = "";
  4. W = 1;
  5. E = 1;
  6. // * No recuerdo qué hace eso, está relacionado con casos más adelante.
  7. // Efectos de la pelota en lv0.
  8. // Relacionando velocidades.
  9. _level0.BallZ = _level0.BallZ*-1;
  10. // * Este código está dentro de un objeto dentro de otro, un lío sí, y en tal caso, estar por encima del centro es estar a menos algo, por eso se hace negativo al número.
  11. _level0.BallZInicial = _level0.BallZ;
  12. _level0.BallX = _level0.AlexX+13.4;
  13. // * Esto es porque la pelota está un poco hacia la derecha del jugador, aquí se define recién. Como estaba dentro del jugador, no había sido necesario.
  14. _level0.DistanciaX = _level0.BallX-Destiny;
  15. // * Destiny es lo que ahora llamo DestinoX. Uno de los dos puntos señalados en la parte de arriba de la imagen. También se puede sacar hacia el centro, pero en el video no lo hice, no cambia mucho.
  16. Norma = Math.sqrt(374.6*374.6+_level0.DistanciaX*_level0.DistanciaX+_level0.BallZ*_level0.BallZ);
  17. // * 374.6 sería como la distancia Y. Como al sacar eso es constante, no lo puse como variable. Pero estos métodos los necesito también cuando el jugador haya sacado. Por ahora no fue necesario.
  18. _level0.BallYSpeed = 374.6/Norma*-Pow;
  19. _level0.BallZSpeed = _level0.BallZ/Norma*-Pow;
  20. // * El - es porque en este caso la bola irá hacia donde baja el Y y Z.
  21. // * Ahora empieza lo difícil de entender.
  22. // Calcula la distancia que recorrería antes de tocar el suelo.
  23. Abrev = (200*_level0.BallZSpeed-1)*(200*_level0.BallZSpeed-1);
  24. // * Abrev es abreviación. Distancia probablemente se refiere a Y solamente. Estas fórmulas las obtuve dando casos a un programa llamado Eureka; le das variables y él intenta encontrar una relación entre ellas.
  25. ShotTZ = Math.ceil(((200*_level0.BallZSpeed-1)+Math.sqrt(Abrev+800*_level0.BallZ))/2);
  26. Excess = -374.6+ShotTZ*Math.abs(_level0.BallYSpeed);
  27. if (Excess<0) {
  28. // Casos normales.
  29. Caso = Caso+"A";
  30. // Calcula cuánto caería por causa de la gravedad.
  31. ShotTY = Math.ceil(374.6/Math.abs(_level0.BallYSpeed));
  32. // Abrev as caída extra.
  33. Abrev = ShotTY*(ShotTY+1)/200;
  34. // Calcula la velocidad Z restándole la caída extra a la altura.
  35. _level0.BallZSpeed = (_level0.BallZ-Abrev)/Norma*-Pow;
  36. if (_level0.BallZSpeed<=0) {
  37. Caso = Caso+"B";
  38. // B
  39. // Calcula la distancia que recorrería antes de tocar el suelo.
  40. Abrev = (200*_level0.BallZSpeed-1)*(200*_level0.BallZSpeed-1);
  41. ShotTZ = Math.ceil(((200*_level0.BallZSpeed-1)+Math.sqrt(Abrev+800*_level0.BallZ))/2);
  42. Excess = -374.6+ShotTZ*Math.abs(_level0.BallYSpeed);
  43. if (Excess>=0) {
  44. // Va a W
  45. E = 0;
  46. }
  47. }
  48. if (E == 1) {
  49. Caso = Caso+"D";
  50. // D
  51. // Equilibrar fuerza.
  52. Norma = Math.sqrt(374.6*374.6*2+_level0.DistanciaX*_level0.DistanciaX);
  53. _level0.BallYSpeed = 374.6/Norma*-Pow;
  54. _level0.BallZSpeed = _level0.BallYSpeed*-1;
  55. // E
  56. Caso = Caso+"E";
  57. // Calcula la distancia que recorrería antes de tocar el suelo.
  58. Abrev = (200*_level0.BallZSpeed-1)*(200*_level0.BallZSpeed-1);
  59. ShotTZ = Math.ceil(((200*_level0.BallZSpeed-1)+Math.sqrt(Abrev+800*_level0.BallZ))/2);
  60. Excess = -374.6+ShotTZ*Math.abs(_level0.BallYSpeed);
  61. if (Excess<0) {
  62. W = 0;
  63. // ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  64. Caso = Caso+"ACAAAAAAAAAAAAAAAAAA";
  65. } else {
  66. Caso = Caso+"F";
  67. // F
  68. // Calcula cuánto caería por causa de la gravedad.
  69. ShotTY = Math.ceil(374.6/Math.abs(_level0.BallYSpeed));
  70. // Abrev as caída extra.
  71. Abrev = ShotTY*(ShotTY+1)/200;
  72. // Calcula la velocidad Z restándole la caída extra a la altura.
  73. _level0.BallZSpeed = ((_level0.BallZ-Abrev)/Norma)*-Pow;
  74. // Calcula la distancia que recorrería antes de tocar el suelo.
  75. Abrev = (200*_level0.BallZSpeed-1)*(200*_level0.BallZSpeed-1);
  76. ShotTZ = Math.ceil(((200*_level0.BallZSpeed-1)+Math.sqrt(Abrev+800*_level0.BallZ))/2);
  77. Excess = -374.6+ShotTZ*Math.abs(_level0.BallYSpeed);
  78. }
  79. }
  80. }
  81. if (W == 1) {
  82. Caso = Caso+"W";
  83. do {
  84. // Recalcular velocidad Y de modo que no haya exceso.
  85. _level0.BallYSpeed = _level0.BallYSpeed+Excess/ShotTZ;
  86. Excess = 0;
  87. // Puede causar q la pelota no pase la red (se calcula dónde pasa).
  88. TR = Math.ceil(253.6/Math.abs(_level0.BallYSpeed));
  89. Abrev = 0.005*(TR+1);
  90. ZR = _level0.BallZ+_level0.BallZSpeed*(TR+1)+Abrev-Abrev*(TR+1)-_level0.BallZSpeed;
  91. if (ZR<24.5) {
  92. Abrev = _level0.BallZSpeed;
  93. // Calcula velocidad Z de modo que pase encima de la red.
  94. _level0.BallZSpeed = TR*0.005+0.005-(_level0.BallZ-24.51)/TR;
  95. if (Abrev<0) {
  96. // Si velocidad Z era N.
  97. if (_level0.BallZSpeed<Abrev or _level0.BallZSpeed>0) {
  98. // ERROR: La fuerza aplicada hacia abajo aumentó.
  99. _level0.BallZSpeed = Abrev;
  100. break;
  101. }
  102. } else if (Abrev>0) {
  103. // Si velocidad Z era P.
  104. if (_level0.BallZSpeed>Abrev or _level0.BallZSpeed<0) {
  105. // ERROR: La fuerza aplicada hacia arriba aumentó.
  106. _level0.BallZSpeed = Abrev;
  107. break;
  108. }
  109. } else {
  110. // Si velocidad Z era 0.
  111. // La fuerza aplicada a Z ya no puede reducirse.
  112. break;
  113. }
  114. }
  115. // Puede causar exceso (calcular cuánto).
  116. Abrev = (200*_level0.BallZSpeed-1)*(200*_level0.BallZSpeed-1);
  117. ShotTZ = Math.ceil(((200*_level0.BallZSpeed-1)+Math.sqrt(Abrev+800*_level0.BallZ))/2);
  118. Excess = -374.6+ShotTZ*Math.abs(_level0.BallYSpeed);
  119. } while (Excess>0);
  120. }
  121. ShotTY = Math.ceil(374.6/Math.abs(_level0.BallYSpeed));
  122. // (*)
  123. _level0.BallXSpeed = -_level0.DistanciaX/ShotTY;
  124. _level0.BallZSpeedf = _level0.BallZSpeed;
  125. // * Eso es velocidadZ inicial, nombrada así nomás.
  126.  

(*): No recuerdo qué hice ni lo entiendo, pero sé que está mal. Es como que calculé cuántos frames iba a tardar la bola en llegar al destino, cuánto la gravedad iba a aumentar la velocidad de caída (recuerda que mi método de aplicar la gravedad era otro), y entonces yo sumaba eso a la velocidad Z hacia arriba, para que siempre pasara justito por donde debía, pero puse algunos casos para cuando el personaje tuviera poca fuerza, o algo así.
En fin, puedo intentar decirte cada valor en cada momento para intentar ver qué ocurre, pero ¿vale la pena? No creo.
Lo de ACAAAAAAAAAAAAAAA es que me faltaba algo ahí. Debido a lo confuso del código, en aquél entonces, lo dejé. Ya no programo TAN confuso xD

Citar
Si te refieres a profundo y veloz tal como los definiste arriba, no. Ninguno de los dos tiros que obtengas hará que la pelota pique en el área de saque, porque, de nuevo, esa condición no estaba cuando escribí mis primeras dos respuestas. Con los dos posibles ángulos que te dan mis ecuaciones, la pelota cae directamente en el destino deseado en la cancha rival, simplemente uno es más "globeado" y otro más directo.
Profundo significa que cae en el punto deseado, veloz que puede caer antes (aunque tiene la misma trayectoria en XY y debe pasar encima de la red); si dices que con tu método cae en el punto deseado es profundo, cae lejos de la red (considerando la distancia Y hacia ella) pero en el área de saque. Cuando ya no sea el saque, los tiros sí pueden caer más al fondo de la cancha, pero eso es simplemente que canbia el destino deseado, el método debería servir también. ¿Sabes más o menos las reglas del tenis?

Citar
en algunos casos, usando menos fuerza podrías conseguir tiros que pasen más bajo, es decir, más cercanos a la red (y obviamente, cumpliendo con tus otras condiciones)
No le veo la lógica a eso. Te muestro algunos casos a ver si me explicas.
(https://i.ibb.co/MgTB9bk/F2.png) (https://ibb.co/rQPdvg2)


(https://i.ibb.co/dpzPYMv/F3.png) (https://ibb.co/WzYkJ5X)


(https://i.ibb.co/qsX07R1/F4.png) (https://ibb.co/BZd4cgs)


(https://i.ibb.co/Xyt0cVW/F5.png) (https://ibb.co/WDf8msH)


Veo que estoy cometiendo un error. En la realidad, para que un golpe llegue más lejos, conviene pegarle un poco hacia arriba. Aquí parece que no. ¿Será porque la gravedad ahí es muy fuerte? Simular ahí el 0.01 es complicado. Usé 1 y mi método, pero no creo que eso último sea el problema. En fin, se supone que entre más fuerza se tenga más fuerza hacia adelante se puede usar, y por lo tanto menos fuerza hacia arriba es necesario hacer, sí hacia abajo, pero tener más fuerza no debería impedir que uno pueda golpear más hacia la red ¡al contrario! Por eso no te entiendo.

Citar
complicaría las cosas, por lo que aquí también creo que es mejor que te enfoques en tratar de implementar correctamente mi método o el del otro foro.
Pues dime paso a paso cómo es, lo aplico y te digo si tiene un problema, cual.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: RayR en 11 Mayo 2023, 03:29 am
Aquí vas a ver muchas cosas que parecen contrarias a la intuición, pero resultan claras una vez que se entiende bien el tema. Trataré de darte ejemplos breves para aclarar tus dudas, pero lo ideal es tener unas buenas bases de trigonometría y algo de física (mecánica, en concreto) para entenderlo al 100%.

Como recordatorio: el ángulo representa la distribución de velocidades. Como en tu programa se busca que la pelota avance (obviamente, no es aceptable tirar la pelota hacia atrás), mientras mayor sea el ángulo, habrá más velocidad hacia arriba y menos hacia adelante, o sea, la pelota se elevará más.

La principal confusión que veo que tienes es sobre la manera en que el ángulo influye en la distancia recorrida. No es válido decir que si le das más altura a la pelota, mayor será la distancia, ni tampoco lo opuesto. La realidad es que depende. Cuando el lanzamiento es muy bajo, hay mayor velocidad hacia adelante (horizontal), y se avanza más rápido, pero como la pelota está cerca del suelo, también cae rápido, así que no tiene tiempo de viajar mucho. Si el tiro es elevado, avanza hacia adelante más lentamente, pero tarda más en caer, lo que le da más tiempo para avanzar. Por lo tanto, si se quisiera que la pelota llegara lo más lejos posible, no debería ir ni muy elevada ni muy baja. Para cada tiro existe un ángulo que ofrece el mejor balance y da la mayor distancia posible con la fuerza disponible. Dicho de otra forma, si lo que se busca es recorrer una distancia específica, este es el ángulo que te permite lograrlo usando menos fuerza. No es tan simple decir cuál es este ángulo más eficiente, ya que depende de la altura y velocidad iniciales de la pelota, pero de cualquier forma no lo necesitas. Baste saber que ese ángulo existe, y que mientras más te alejes de él (ya sea hacia arriba o hacia abajo) menor será la eficiencia, y por lo tanto, mayor la cantidad de fuerza necesaria para recorrer una distancia d.

si la puede elevar a 19.5 m también debería poderla elevar a 18.6 ¿no?

Eso podría ser correcto si sólo interesara elevar la pelota, sin importar donde caiga ni nada más, pero aquí de lo que se trata es de que llegue a un punto específico (y se eleve a cierta altura al pasar por la red), lo cual hace que no sea tan simple, como expliqué arriba. Si se diera el caso de que para llegar al punto deseado y alcanzar una altura de 18.6 m al pasar la red, requirieras más fuerza de la disponible, lo que habría que hacer es intentar acercarse al ángulo más eficiente: si el ángulo que se usó es mayor que el óptimo, hay que hacer tiros más bajos; si es menor, hay que hacer tiros más altos. En este último caso, para llegar al destino buscado, un tiro más elevado requeriría menos fuerza que uno más bajo. Obviamente, no necesitas estar probando ángulos, ya que el método del otro foro y el de aquí te calculan directamente el que debes usar, pero el ejemplo sirve para ilustrar el punto.

Citar
En mi opinióbn sí, es la condición nro 5:
...
 Profundo significa que cae en el punto deseado, veloz que puede caer antes (aunque tiene la misma trayectoria en XY y debe pasar encima de la red); si dices que con tu método cae en el punto deseado es profundo, cae lejos de la red (considerando la distancia Y hacia ella) pero en el área de saque. Cuando ya no sea el saque, los tiros sí pueden caer más al fondo de la cancha, pero eso es simplemente que canbia el destino deseado, el método debería servir también. ¿Sabes más o menos las reglas del tenis?

Sí, me había confundido porque acababa de ver el video que pusiste, y como no me quedaba muy claro que sucedía, pensé que te referías a otra cosa.

Citar
En la realidad, para que un golpe llegue más lejos, conviene pegarle un poco hacia arriba.

...se supone que entre más fuerza se tenga más fuerza hacia adelante se puede usar, y por lo tanto menos fuerza hacia arriba es necesario hacer

Creo que eso ya quedó aclarado con lo anterior: son suposiciones que, aunque puedan sonar lógicas, no son del todo correctas. En ciertos cases se cumplen y en otros ocurre lo contrario.

Citar
Pues dime paso a paso cómo es, lo aplico y te digo si tiene un problema, cual.

Pues creo que ya lo había explicado al inicio, aunque supongo que pudiera ser algo confuso porque está repartido en dos mensajes. Ahora no tengo tiempo, pero cuando pueda pongo los pasos en uno sólo.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: RayR en 14 Mayo 2023, 21:21 pm
Aquí va el procedimiento resumido. Las explicaciones ya están en mis otros mensajes, y de hecho, aquí prácticamente me limité a copiar y pegar, además de cambiar algunos nombres de variables.

En todos los siguientes cálculos, h se refiere a la altura inicial de la pelota y v0 es la velocidad inicial o la fuerza del personaje.

Primero, conviene sacar aquí este resultado intermedio, pues sirve para determinar ciertas condiciones y  ahorrar cálculos:

Código:
Disc = v0 * v0 * v0 * v0 - (g * (g * DistanciahastaDestinoXY * DistanciahastaDestinoXY - 2 * v0 * v0 * h))

Si Disc < 0, no puedes hacer el tiro
Si Disc == 0, hay un solo angulo posible
Si Disc > 0, hay dos angulos

Se calcula el ángulo o ángulos (raiz es la raíz cuadrada):

Código:
theta = arctan((v0 * v0 + raiz(Disc)) / (g * DistanciahastaDestinoXY))
phi = arctan((v0 * v0 - raiz(Disc)) / (g * DistanciahastaDestinoXY))

Se calcula el tiempo que se tarda en llegar a la red:

Código:
DistanciahastaRed = DistanciahastaDestinoXY * abs(RedY - BallY) / abs(DistanciahastaDestinoY)
TiempoHastaRedTheta = (DistanciahastaRed) / (v0 * cos(theta))

Y si hay dos ángulos, lo mismo para el segundo:

Código:
TiempoHastaRedPhi = (DistanciahastaRed) / (v0 * cos(phi))

Luego se calcula la altura a la que pasan al llegar a la red. Esto es igual que como lo puse en mi primer mensaje, pero como ahí todavía suponía que la altura inicial era cero, no incluía la variable h. Así es como debería quedar:

Código:
AlturaEnRedTheta = h + v0 * sen(theta) * TiempoHastaRedTheta - (g * TiempoHastaRedTheta * TiempoHastaRedTheta) / 2
AlturaEnRedPhi = h + v0 * sen(phi) * TiempoHastaRedPhi - (g * TiempoHastaRedPhi * TiempoHastaRedPhi) / 2

Si ambos pasan por encima, elige el más alto o bajo, según prefieras. A ese ángulo elegido, lo llamaré a partir de aquí angulo, a secas.

Calculas las velocidades:

Código:
VelocidadAdelante = v0 * cos(angulo)
VelocidadArriba = v0 * sen(angulo)

// Esta variable es redundante, pero clarifica lo que se esta haciendo
VelocidadZ = VelocidadArriba

si (DistanciahastaDestinoX == 0)
   BallYSpeed = VelocidadAdelante
   BallXSpeed = 0
sino
   AnguloPendiente = arctan(DistanciahastaDestinoY / DistanciahastaDestinoX)
   BallXSpeed = VelocidadAdelante * cos(AnguloPendiente)
   BallYSpeed = VelocidadAdelante * sen(AnguloPendiente)

Todo lo anterior sólo lo necesitas hacer al inicio del tiro. Luego, en cada instante de tiempo que transcurra, se debe actualizar la posición de la pelota y dibujarla. Como desde el principio querías conocer las velocidades para cada dimensión, imagino que en cada iteración haces algo como esto:

Código:
BallX = BallX + VelocidadX
BallY = BallY + VelocidadY

Estos valores (coordenadas de la pelota) también se podrían obtener a partir de la ecuación para x que te puse al inicio de mi primer mensaje, y que calcula las posiciones en función del tiempo, pero si te es más simple hacerlo con las velocidades, lo puedes dejar así. Obviamente, si en la representación en pantalla la pelota va hacia arriba y a la izquierda, las velocidades en x e y deben ser restadas. En el caso de la altura (z), puesto que está sometida a una aceleración (la gravedad), la velocidad vertical está cambiando constantemente, así que no la puedes sacar de esa manera, sino que hay que hacerlo en función del tiempo. Aquí t se refiere al tiempo transcurrido:

Código:
BallZ = h + VelocidadZ * t - (g * t * t)/2

Por cierto, esto también se podría calcular con la fórmula para el movimiento con aceleración constante que te puse dos o tres mensajes atrás cuando preguntaste sobre la gravedad.

No estoy tomando en cuenta lo que pones en la condición 5, pero como dijiste más arriba, sólo sería cuestión de cambiar el destino.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: Tachikomaia en 15 Mayo 2023, 08:04 am
Miro el foro todos los días o casi, no entiendo cómo no vi tu mensaje antes :rolleyes:

Cuando el lanzamiento es muy bajo, hay mayor velocidad hacia adelante (horizontal), y se avanza más rápido, pero como la pelota está cerca del suelo, también cae rápido, así que no tiene tiempo de viajar mucho. Si el tiro es elevado, avanza hacia adelante más lentamente, pero tarda más en caer, lo que le da más tiempo para avanzar. Por lo tanto, si se quisiera que la pelota llegara lo más lejos posible, no debería ir ni muy elevada ni muy baja.
Pienso lo mismo pero en mis ejemplos no parece ocurrir. ¿No?

Citar
si lo que se busca es recorrer una distancia específica, este es el ángulo que te permite lograrlo usando menos fuerza
Debes que imaginar que el jugador es perfecto en cuanto a inteligencia y puntería y quiere que la bola caiga en cierto punto, para lo cual usará toda la fuerza que pueda (según la que tenga, en ese sentido no es perfecto), no la mínima necesaria; no hará globitos si puede hacer que el tiro sea rápido y pase cerca de la red. No sé si has entendido eso. Si tiene la fuerza suficiente, el tiro debería pasar cerca de la red, sino sí haría un globito por lo que has explicado arriba, porque si golpea muy hacia abajo no llega. Mira el video
https://drive.google.com/file/d/1jyrIyycu_joxlfIblj5IDEwZ_Y3giSPR/view
Entre más fuerza tenga más bajo pasa la bola, excepto cuando ni siquiera tiene suficiente fuerza como para hacerla pasar. O piensa que, si hará un smash, apuntará a un punto usando toda la fuerza que pueda , no la mínima necesaria.
https://www.youtube.com/watch?v=BLaHot9vIKo
2:44, pudo haber golpeado más suave ¡pero no es la idea!

...

¡Vaya ecuaciones! :o :rolleyes:

Me quedó así:
Código
  1. // Datos para determinar velocidades del tiro.
  2. DistanciahastaDestinoX = BallX-280.1;
  3. DistanciahastaDestinoY = BallY-180;
  4. DistanciahastaDestinoXY = Math.sqrt(DistanciahastaDestinoX*DistanciahastaDestinoX+DistanciahastaDestinoY*DistanciahastaDestinoY);
  5. // Se calcula el ángulo o ángulos.
  6. Parte = AlexFuerzadetiros*AlexFuerzadetiros*AlexFuerzadetiros*AlexFuerzadetiros;
  7. Disc = Parte-(Gravedad*(Gravedad*DistanciahastaDestinoXY*DistanciahastaDestinoXY-2*AlexFuerzadetiros*AlexFuerzadetiros*BallZ));
  8. // Si Disc < 0, no puedes hacer el tiro.
  9. // Si Disc == 0, hay un solo angulo posible.
  10. // Si Disc > 0, hay dos angulos.
  11. theta = Math.atan((AlexFuerzadetiros*AlexFuerzadetiros+Math.sqrt(Disc))/(Gravedad*DistanciahastaDestinoXY));
  12. phi = Math.atan((AlexFuerzadetiros*AlexFuerzadetiros-Math.sqrt(Disc))/(Gravedad*DistanciahastaDestinoXY));
  13. // Se calcula el tiempo que se tarda en llegar a la red.
  14. DistanciahastaRed = DistanciahastaDestinoXY*Math.abs(RedZ-BallZ)/Math.abs(DistanciahastaDestinoY);
  15. TiempoHastaRedTheta = (DistanciahastaRed)/(AlexFuerzadetiros*Math.cos(theta));
  16. if (Disc>0) {
  17.    // Si hay dos ángulos, se calcula el 2ndo.
  18.    TiempoHastaRedPhi = (DistanciahastaRed)/(AlexFuerzadetiros*Math.cos(phi));
  19.    // Se calcula la altura a la que pasa la bola al llegar a la red.
  20.    AlturaEnRedTheta = BallZ+AlexFuerzadetiros*Math.sin(theta)*TiempoHastaRedTheta-(Gravedad*TiempoHastaRedTheta*TiempoHastaRedTheta)/2;
  21.    AlturaEnRedPhi = BallZ+AlexFuerzadetiros*Math.sin(phi)*TiempoHastaRedPhi-(Gravedad*TiempoHastaRedPhi*TiempoHastaRedPhi)/2;
  22.    // Se elige el ángulo conque la bola pasa más bajo.
  23.    if (AlturaEnRedTheta<AlturaEnRedPhi) {
  24.        Angulo = AlturaEnRedTheta;
  25.    } else {
  26.        Angulo = AlturaEnRedPhi;
  27.    }
  28. } else {
  29.    Angulo = AlturaEnRedTheta;
  30. }
  31. // Cálculo de las velocidades.
  32. VelocidadAdelante = AlexFuerzadetiros*Math.cos(Angulo);
  33. VelocidadArriba = AlexFuerzadetiros*Math.sin(Angulo);
  34. // Esta variable es redundante, pero clarifica lo que se esta haciendo.
  35. VelocidadZ = VelocidadArriba;
  36. if (DistanciahastaDestinoX == 0) {
  37.    BallXSpeed = 0;
  38.    BallYSpeed = VelocidadAdelante*-1;
  39. } else {
  40.    AnguloPendiente = Math.atan(DistanciahastaDestinoY/DistanciahastaDestinoX);
  41.    BallXSpeed = VelocidadAdelante*Math.cos(AnguloPendiente)*-1;
  42.    BallYSpeed = VelocidadAdelante*Math.sin(AnguloPendiente)*-1;
  43. }
  44. // Datos para determinar posiciones de la pelota.
  45. Tiempotranscurridodeltiro = 0;
  46. BallXwhenstriked = BallX;
  47. BallYwhenstriked = BallY;
  48. BallZwhenstriked = BallZ;

El cálculo de las posiciones lo estoy haciendo en base al tiempo, así:
Código
  1. function Ballmoving () {
  2.    Tiempotranscurridodeltiro = Tiempotranscurridodeltiro+1;
  3.    BallX = BallXwhenstriked+BallXSpeed*Tiempotranscurridodeltiro;
  4.    BallY = BallYwhenstriked+BallYSpeed*Tiempotranscurridodeltiro;
  5.    BallZAnterior = BallZ;
  6.    BallZ = BallZwhenstriked+VelocidadZ*Tiempotranscurridodeltiro-(Gravedad*Tiempotranscurridodeltiro*Tiempotranscurridodeltiro)/2;
  7.    BallZSpeed = BallZ-BallZAnterior;
  8.    if (BallZ<=0) {
  9.        // Si la pelota llega al suelo, BallZSpeed se invierte con disminución según la cancha.
  10.        BallZ = 0;
  11.        BallZSpeed = BallZSpeed*Fuerzaderebotedepelota;
  12.        // Si BallZSpeed es menor que 0.01: Queda en 0.
  13.        if (BallZSpeed<0.01) {
  14.            BallZSpeed = 0;
  15.        }
  16.        // La pelots, al rozarse con el suelo, disminuye sus velocidades.
  17.        // BallXSpeed = BallXSpeed+Influenciadelrozamiento;
  18.        if (BallXSpeed>0) {
  19.            BallXSpeed = 0;
  20.        }
  21.        // BallYSpeed = BallYSpeed+Influenciadelrozamiento;
  22.        if (BallYSpeed>0) {
  23.            BallYSpeed = 0;
  24.        }
  25.    }
  26. }

No sé qué está mal.
https://drive.google.com/file/d/1vDabAavB-YZrNTW1s6YW7o7y-kSBzyj_/view?usp=share_link
¿Te digo algún dato que no haya dicho ahí, cual?

Ah, el tema del pique se me complica, mejor luego del pique vuelvo al método simple de sumar ¿no? Aunque la pelota bajará a distinta velocidad. Yo lo que hacía es que cuando tocaba el suelo la bola, a su velocidad Z se le hacía *-1 y se reducía un poco, pero ahora de momento no sé cómo hacerlo.
La bola que queda en la red o en pantalla no es un error, hago que aparezca para ver qué tan cerca de la red pasó.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: RayR en 17 Mayo 2023, 03:01 am
Pienso lo mismo pero en mis ejemplos no parece ocurrir. ¿No?

Pues es que si el método y la gravedad no son correctos, los resultados tampoco lo serán.

Citar
Debes que imaginar que el jugador es perfecto en cuanto a inteligencia y puntería y quiere que la bola caiga en cierto punto, para lo cual usará toda la fuerza que pueda (según la que tenga, en ese sentido no es perfecto), no la mínima necesaria; no hará globitos si puede hacer que el tiro sea rápido y pase cerca de la red. No sé si has entendido eso.

Claro. Pero el párrafo de donde sacaste esa frase es hipotético. Ya sé que no buscas la fuerza mínima necesaria, pero lo usé como ejemplo para explicar la relación entre el ángulo la y distancia recorrida.

En cuanto a tu código, tienes varios errores. Fíjate bien lo que te puse, y de ser necesario, ve las  explicaciones de mensajes anteriores, porque además te estás saltando algún paso. Por ejemplo, aquí:

Código:
DistanciahastaRed = DistanciahastaDestinoXY*Math.abs(RedZ-BallZ)/Math.abs(DistanciahastaDestinoY);

En vez de RedZ-BallZ va RedY - BallY.

Luego, como te comenté (y expliqué con más detalle en mi segundo mensaje), si Disc es negativo, no puedes hacer el tiro, no tienes la fuerza necesaria, así que ya ni siquiera tiene sentido calcular los ángulos y todo lo demás. En todo caso, podrías escoger un nuevo destino más cercano, como lo mencionaste en relación al punto 5, y repetir el procedimiento a ver si este sí lo puedes hacer.

Además, fíjate que después de calcular AlturaEnRedTheta y AlturaEnRedPhi puse:

Citar
Si ambos pasan por encima, elige el más alto o bajo, según prefieras

Pero tú ya directamente supones que ambos lo hacen y pasas a elegir el ángulo más bajo. Primero debes comprobar si alguno de los ángulos pasa por arriba de la red. Si sólo uno de los ángulos lo hace, obviamente lo tienes que usar, no hay otra opción. Únicamente si ambos pasan sobre la red, toca elegir el más bajo o alto. Y naturalmente, si ninguno lo consigue, toca aquí también elegir nuevo destino o lo que quieras.

Citar
Ah, el tema del pique se me complica, mejor luego del pique vuelvo al método simple de sumar ¿no?

Pues sí, podrías probar en ese caso tu método simple. Al final lo que estás haciendo es un juego y no una simulación perfecta, así que puede que con eso tengas un resultado aceptable.

En relación a lo anterior, este cálculo no es correcto:

Código:
    BallZSpeed = BallZ-BallZAnterior;

porque simplemente te daría la velocidad promedio a lo largo del último intervalo de tiempo, en este caso, el último segundo (porque creo que incrementas el tiempo un segundo a la vez, ¿no?), pero tú lo que buscas es el valor de la velocidad en el instante actual, que es distinto. La forma de hacerlo sería esta:

Código:
    BallZSpeed =  VelocidadZ - Gravedad * Tiempotranscurridodeltiro;

Una última cosa: supongo que estás usando escalas adecuadas, ¿no? Por ejemplo, suponiendo que quisieras modelar una cancha con longitud de 20 m, y que en el juego mida 400 pixels, esto significaría que cada metro equivale a 20 pixels (400 / 20 = 20). Si eliges arbitrariamente la gravedad y le pones 1 pixel/s2, por ejemplo, vas a tener resultados absurdos, porque eso significaría que la gravedad equivale a 1/20 m/s2 = .05 m/s2. ¡Más débil incluso que en la luna! Para tener resultados coherentes, debes elegir valores realistas para la gravedad, fuerza, altura inicial y altura de la red, y multiplicarlos por este factor de escala. Siguiendo con este ejemplo, sería: Gravedad = 9.8 m/s2 * 20; AlexFuerzadetiros = 25 m/s * 20; etc.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: Tachikomaia en 24 Mayo 2023, 08:43 am
He estado pensando en otras cosas o cansado, pero aquí vuelvo ;D

Fíjate bien lo que te puse, y de ser necesario, ve las  explicaciones de mensajes anteriores, porque además te estás saltando algún paso.
Vale, luego de leer tu post.

Citar
Por ejemplo, aquí:

Código:
DistanciahastaRed = DistanciahastaDestinoXY*Math.abs(RedZ-BallZ)/Math.abs(DistanciahastaDestinoY);

En vez de RedZ-BallZ va RedY - BallY.
Ok, asumí que RedY era la altura así que lo llamé RedZ, y cuando vi -BallY me confundí y lo cambié por BallZ, supongo que fue por eso. Me confunde que Y sea Z...

Citar
Luego, como te comenté (y expliqué con más detalle en mi segundo mensaje), si Disc es negativo, no puedes hacer el tiro, no tienes la fuerza necesaria, así que ya ni siquiera tiene sentido calcular los ángulos y todo lo demás.
¿Qué sucede si se calcula? Pensé que el tiro saldría corto ¿no ocurre eso? Si no se tiene suficiente fuerza igual debe haber un tiro, como si el personaje hubiera querido hacer un buen tiro. No tiene sentido que no se haga un tiro.

Citar
En todo caso, podrías escoger un nuevo destino más cercano, como lo mencionaste en relación al punto 5, y repetir el procedimiento a ver si este sí lo puedes hacer.
Sí ¿y si el más cercano tampoco sirve?

Citar
Además, fíjate que después de calcular AlturaEnRedTheta y AlturaEnRedPhi puse:
"Si ambos pasan por encima, elige el más alto o bajo, según prefieras"
Pero tú ya directamente supones que ambos lo hacen y pasas a elegir el ángulo más bajo. Primero debes comprobar si alguno de los ángulos pasa por arriba de la red. Si sólo uno de los ángulos lo hace, obviamente lo tienes que usar, no hay otra opción. Únicamente si ambos pasan sobre la red, toca elegir el más bajo o alto. Y naturalmente, si ninguno lo consigue, toca aquí también elegir nuevo destino o lo que quieras.
Pensé que tu método indicaba si pasaban o no.
...
Se me hizo líoso hacerlo, pero creo que está. También corregí, creo, que en vez de usar los ángulos usaba las alturas. ¿Disc qué abrevia o qué significa?

Citar
este cálculo no es correcto:
Código:
    BallZSpeed = BallZ-BallZAnterior;
porque simplemente te daría la velocidad promedio a lo largo del último intervalo de tiempo, en este caso, el último segundo (porque creo que incrementas el tiempo un segundo a la vez, ¿no?), pero tú lo que buscas es el valor de la velocidad en el instante actual, que es distinto. La forma de hacerlo sería esta:
Código:
    BallZSpeed =  VelocidadZ - Gravedad * Tiempotranscurridodeltiro;
Creo que eso me quedó sin borrar del método anterior, creo que no influye salvo en el pique, que aún no lo arreglé. Gracias igual, si llego a eso y no lo puedo resolver te consulto. Lo borro por ahora a ver.

Citar
Una última cosa: supongo que estás usando escalas adecuadas, ¿no?
Probablemente no, el personaje es muy bajo por ejemplo. En el juego original los saques se hacen por encima del alcance de la raqueta y no se nota, pero en mi caso son acordes al alcance y me parece un poco bajo. El juego original:
https://www.youtube.com/watch?v=fc0_P2IGgJ4
¿Crees que habrá mucha diferencia en las escalas con el mío? Que yo sepa lo único que hice fue que la cancha entrara toda en la pantalla y también parte del fondo y los laterales, ya que en el juego original hay como paredes invisibles que si la bola toca es punto :-\ (no se nota salvo casos muy poco probables). También achiqué un poco al personaje porque ahí pareciera que ocuparan demasiado de la cancha.

En mi juego la cancha mide 239.9 de ancho (sin contar el corredor de dobles) y 480 de largo. Ese .9 es por motivos que no comprendo ni sé arreglar (ni volveré a dedicar tiempo a intentarlo), pero es mínimo, debería ser 240. La altura de la red es de unos 17.4 (pero la bola debe pasar a 18.6 mínimo). En fin, puse la gravedad que me pareció agradable a mi vista, no creo que sea ni tan poca ni tanta, pero ahora que lo dices, si con tu método es menos intensa aunque se use el mismo número, puede que deba aumentarla.
En el juego la fuerza de los tiros depende del tiempo de preparación, la fuerza de brazos, piernas, calidad de la raqueta y cuánto se usó en darle efecto a la bola, no sé si algo más... No he pensado o consultado tanto sobre eso. No tiene sentido que te de más detalles de eso tampoco ¿no? Te digo porque me llama la atención el 25 que pusiste ¿a qué se debe?

No tengo mucho interés en que sea tan realista en cuanto a velocidades o tamaños (especialmente la bola, sino no la veo mucho), tengo pensado que haya gran variedad de campeonatos variando el tamaño de algunas cosas por ejemplo. En otros aspectos sí quiero que sea realista, como he explicado.

Bueno, reviso el código de principio a fin, lo comparo con lo que has puesto.

Pusiste:
Disc = v0 * v0 * v0 * v0 - (g * (g * DistanciahastaDestinoXY * DistanciahastaDestinoXY - 2 * v0 * v0 * h))

Puse:
Código
  1. Parte = AlexFuerzadetiros*AlexFuerzadetiros*AlexFuerzadetiros*AlexFuerzadetiros;
  2. Disc = Parte-(Gravedad*(Gravedad*DistanciahastaDestinoXY*DistanciahastaDestinoXY-2*AlexFuerzadetiros*AlexFuerzadetiros*BallZ));

Luego debido a los ifs es complicado poner parte por parte, lo haré más adelante; este es el código con las partes más relevantes de este contexto supongo:
Código
  1. Gravedad = 0.01;
  2. RedZ = 18.6;
  3. // Datos para determinar velocidades del tiro.
  4. DistanciahastaDestinoX = BallX-280.1;
  5. DistanciahastaDestinoY = BallY-180;
  6. // DistanciahastaRed = BallY-300;
  7. // DistanciahastaMinsafeBallZ = BallZ-18.6;
  8. DistanciahastaDestinoXY = Math.sqrt(DistanciahastaDestinoX*DistanciahastaDestinoX+DistanciahastaDestinoY*DistanciahastaDestinoY);
  9. // Se calcula el ángulo o ángulos.
  10. Parte = AlexFuerzadetiros*AlexFuerzadetiros*AlexFuerzadetiros*AlexFuerzadetiros;
  11. Disc = Parte-(Gravedad*(Gravedad*DistanciahastaDestinoXY*DistanciahastaDestinoXY-2*AlexFuerzadetiros*AlexFuerzadetiros*BallZ));
  12. if (Disc<0) {
  13.    // Fuerza insuficiente, si es posible habrá que acercar el destino.
  14.    TiroRealizable = "Fuerza insuficiente";
  15. } else {
  16.    DistanciahastaRed = DistanciahastaDestinoXY*Math.abs(RedZ-BallY)/Math.abs(DistanciahastaDestinoY);
  17.    // Le he llamado RedZ a lo que has llamado RedY.
  18.    // Se calcula el ángulo Z;
  19.    theta = Math.atan((AlexFuerzadetiros*AlexFuerzadetiros+Math.sqrt(Disc))/(Gravedad*DistanciahastaDestinoXY));
  20.    // Se calcula el tiempo que se tarda en llegar a la red.
  21.    TiempoHastaRedTheta = (DistanciahastaRed)/(AlexFuerzadetiros*Math.cos(theta));
  22.    // Se calcula la altura a la que pasa la bola al llegar a la red.
  23.    AlturaEnRedTheta = BallZ+AlexFuerzadetiros*Math.sin(theta)*TiempoHastaRedTheta-(Gravedad*TiempoHastaRedTheta*TiempoHastaRedTheta)/2;
  24.    if (Disc == 0) {
  25.        // Sólo hay 1 ángulo Z posible.
  26.        if (AlturaEnRedTheta>=18.6) {
  27.            // Si la bola pasa la red con ese ángulo, usarlo.
  28.            TiroRealizable = "1 ángulo, ok";
  29.            Angulo = theta;
  30.        } else {
  31.            TiroRealizable = "1 ángulo, imposible";
  32.            // Probar acercar destino supongo.
  33.            Angulo = "Ninguno";
  34.        }
  35.    } else {
  36.        // Disc>0, hay 2 angulos posibles, calcular el faltante.
  37.        phi = Math.atan((AlexFuerzadetiros*AlexFuerzadetiros-Math.sqrt(Disc))/(Gravedad*DistanciahastaDestinoXY));
  38.        TiempoHastaRedPhi = (DistanciahastaRed)/(AlexFuerzadetiros*Math.cos(phi));
  39.        AlturaEnRedPhi = BallZ+AlexFuerzadetiros*Math.sin(phi)*TiempoHastaRedPhi-(Gravedad*TiempoHastaRedPhi*TiempoHastaRedPhi)/2;
  40.        if (AlturaEnRedTheta>=18.6) {
  41.            if (AlturaEnRedPhi>=18.6) {
  42.                // Con ambos ángulos la bola pasa la red, usar el más bajo.
  43.                if (AlturaEnRedTheta<AlturaEnRedPhi) {
  44.                    Angulo = theta;
  45.                } else {
  46.                    Angulo = phi;
  47.                }
  48.            } else {
  49.                // Sólo sirve el 1er ángulo.
  50.                Angulo = theta;
  51.            }
  52.        } else if (AlturaEnRedPhi>=18.6) {
  53.            // Sólo sirve el 2ndo ángulo.
  54.            Angulo = phi;
  55.        } else {
  56.            // Ningún ángulo sirve.
  57.            Angulo = "Ninguno";
  58.            // Probar acercar destino supongo.
  59.        }
  60.    }
  61.    if (Angulo != "Ninguno") {
  62.        // Cálculo de las velocidades.
  63.        VelocidadAdelante = AlexFuerzadetiros*Math.cos(Angulo);
  64.        VelocidadArriba = AlexFuerzadetiros*Math.sin(Angulo);
  65.        // Esta variable es redundante, pero clarifica lo que se esta haciendo.
  66.        VelocidadZ = VelocidadArriba;
  67.        if (DistanciahastaDestinoX == 0) {
  68.            BallXSpeed = 0;
  69.            BallYSpeed = VelocidadAdelante*-1;
  70.        } else {
  71.            AnguloPendiente = Math.atan(DistanciahastaDestinoY/DistanciahastaDestinoX);
  72.            BallXSpeed = VelocidadAdelante*Math.cos(AnguloPendiente)*-1;
  73.            BallYSpeed = VelocidadAdelante*Math.sin(AnguloPendiente)*-1;
  74.        }
  75.        // Datos para determinar posiciones de la pelota.
  76.        Tiempotranscurridodeltiro = 0;
  77.        BallXwhenstriked = BallX;
  78.        BallYwhenstriked = BallY;
  79.        BallZwhenstriked = BallZ;
  80.    }
  81. }

Dijiste:
Si Disc < 0, no puedes hacer el tiro

Puse:
Código:
if (Disc<0) {
// Fuerza insuficiente, si es posible habrá que acercar el destino.
TiroRealizable = "Fuerza insuficiente";
} else {
Y que yo sepa nada ocurrirá ahí, en el caso de true. Lo de cambiar destino lo haré más adelante.

Dijiste:
Si Disc == 0, hay un solo angulo posible
Si Disc > 0, hay dos angulos
Esos casos son mi else, calculo 1 ángulo y luego si Disc>0 calculo el otro. Alteré un poco el orden de tu código pero creo que no hay problema.

Haces:
theta = arctan((v0 * v0 + raiz(Disc)) / (g * DistanciahastaDestinoXY))
DistanciahastaRed = DistanciahastaDestinoXY * abs(RedY - BallY) / abs(DistanciahastaDestinoY)
TiempoHastaRedTheta = (DistanciahastaRed) / (v0 * cos(theta))

Hice:
Código
  1. DistanciahastaRed = DistanciahastaDestinoXY*Math.abs(RedZ-BallY)/Math.abs(DistanciahastaDestinoY);
  2. // Le he llamado RedZ a lo que has llamado RedY.
  3. theta = Math.atan((AlexFuerzadetiros*AlexFuerzadetiros+Math.sqrt(Disc))/(Gravedad*DistanciahastaDestinoXY));
  4. TiempoHastaRedTheta = (DistanciahastaRed)/(AlexFuerzadetiros*Math.cos(theta));
  5. AlturaEnRedTheta = BallZ+AlexFuerzadetiros*Math.sin(theta)*TiempoHastaRedTheta-(Gravedad*TiempoHastaRedTheta*TiempoHastaRedTheta)/2;

Lo último te lo copié de esto:
AlturaEnRedTheta = h + v0 * sen(theta) * TiempoHastaRedTheta - (g * TiempoHastaRedTheta * TiempoHastaRedTheta) / 2

Luego lo que hago depende del caso como habías dicho:

Código
  1. if (Disc == 0) {
  2. // Sólo hay 1 ángulo Z posible.
  3. if (AlturaEnRedTheta>=18.6) {
  4. // Si la bola pasa la red con ese ángulo, usarlo.
  5. TiroRealizable = "1 ángulo, ok";
  6. Angulo = theta;
  7. } else {
  8. TiroRealizable = "1 ángulo, imposible";
  9. // Probar acercar destino supongo.
  10. Angulo = "Ninguno";
  11. }
  12. } else {
  13. // Disc>0, hay 2 angulos posibles, calcular el faltante.
  14. phi = Math.atan((AlexFuerzadetiros*AlexFuerzadetiros-Math.sqrt(Disc))/(Gravedad*DistanciahastaDestinoXY));
  15. TiempoHastaRedPhi = (DistanciahastaRed)/(AlexFuerzadetiros*Math.cos(phi));
  16. AlturaEnRedPhi = BallZ+AlexFuerzadetiros*Math.sin(phi)*TiempoHastaRedPhi-(Gravedad*TiempoHastaRedPhi*TiempoHastaRedPhi)/2;
  17. if (AlturaEnRedTheta>=18.6) {
  18. if (AlturaEnRedPhi>=18.6) {
  19. // Con ambos ángulos la bola pasa la red, usar el más bajo.
  20. if (AlturaEnRedTheta<AlturaEnRedPhi) {
  21. Angulo = theta;
  22. } else {
  23. Angulo = phi;
  24. }
  25. } else {
  26. // Sólo sirve el 1er ángulo.
  27. Angulo = theta;
  28. }
  29. } else if (AlturaEnRedPhi>=18.6) {
  30. // Sólo sirve el 2ndo ángulo.
  31. Angulo = phi;
  32. } else {
  33. // Ningún ángulo sirve.
  34. Angulo = "Ninguno";
  35. // Probar acercar destino supongo.
  36. }
  37. }
¿Todo bien?

Habías dicho:
Código:
phi = arctan((v0 * v0 - raiz(Disc)) / (g * DistanciahastaDestinoXY))
TiempoHastaRedPhi = (DistanciahastaRed) / (v0 * cos(phi))
AlturaEnRedPhi = h + v0 * sen(phi) * TiempoHastaRedPhi - (g * TiempoHastaRedPhi * TiempoHastaRedPhi) / 2

Yo ahí puse:
Código
  1. phi = Math.atan((AlexFuerzadetiros*AlexFuerzadetiros-Math.sqrt(Disc))/(Gravedad*DistanciahastaDestinoXY));
  2. TiempoHastaRedPhi = (DistanciahastaRed)/(AlexFuerzadetiros*Math.cos(phi));
  3. AlturaEnRedPhi = BallZ+AlexFuerzadetiros*Math.sin(phi)*TiempoHastaRedPhi-(Gravedad*TiempoHastaRedPhi*TiempoHastaRedPhi)/2;

Luego dices:
Código:
VelocidadAdelante = v0 * cos(angulo)
VelocidadArriba = v0 * sen(angulo)

// Esta variable es redundante, pero clarifica lo que se esta haciendo
VelocidadZ = VelocidadArriba

Puse:
Código:
if (Angulo != "Ninguno") {
// Cálculo de las velocidades.
VelocidadAdelante = AlexFuerzadetiros*Math.cos(Angulo);
VelocidadArriba = AlexFuerzadetiros*Math.sin(Angulo);
// Esta variable es redundante, pero clarifica lo que se esta haciendo.
VelocidadZ = VelocidadArriba;

Dices:
Código:
si (DistanciahastaDestinoX == 0)
   BallYSpeed = VelocidadAdelante
   BallXSpeed = 0
sino
   AnguloPendiente = arctan(DistanciahastaDestinoY / DistanciahastaDestinoX)
   BallXSpeed = VelocidadAdelante * cos(AnguloPendiente)
   BallYSpeed = VelocidadAdelante * sen(AnguloPendiente)

Puse:
Código:
if (DistanciahastaDestinoX == 0) {
BallXSpeed = 0;
BallYSpeed = VelocidadAdelante*-1;
} else {
AnguloPendiente = Math.atan(DistanciahastaDestinoY/DistanciahastaDestinoX);
BallXSpeed = VelocidadAdelante*Math.cos(AnguloPendiente)*-1;
BallYSpeed = VelocidadAdelante*Math.sin(AnguloPendiente)*-1;
}
Los *-1 los quito si veo que los tiros van para atrás o algo.

Los cambios en la pantalla por el movimiento los hago así:
Código:
Tiempotranscurridodeltiro = Tiempotranscurridodeltiro+1;
BallX = BallXwhenstriked+BallXSpeed*Tiempotranscurridodeltiro;
BallY = BallYwhenstriked+BallYSpeed*Tiempotranscurridodeltiro;
BallZ = BallZwhenstriked+VelocidadZ*Tiempotranscurridodeltiro-(Gravedad*Tiempotranscurridodeltiro*Tiempotranscurridodeltiro)/2;

Veo que habías dicho:
x = v0 * cos(θ) * t
y = v0 * sen(θ) * t - (g * t2)/2

Y más recientemente:
BallZ = h + VelocidadZ * t - (g * t * t)/2

Ahí me maree. BallZ lo tengo igual parece, lo otro no y como es la perspectiva 2d me confundo.

Bueno, pruebo el código, grabo video y demás y te muestro el resultado.
...
De momento me da errores gráficos no sé bien por qué (la pantalla se agranda o se achica, me ha pasado otras veces cuando se ordena modificar el tamaño de un objeto inexistente). He probado con distintas fuerzas y obtuve casos de fuerza insuficiente y de 2 ángulos pero que ninguno sirve. Agregué más estados de la variable TiroRealizable para ver eso. No sé, voy a probar quitar el código e irlo poniendo de a poco a ver cual es el problema. O pruebo desde la versión anterior mejor.
...
Ya arreglé el tema de los gráficos pero sólo obtengo casos de fuerza insuficiente si le pongo muy poca o casos de "2 ángulos pero ninguno sirve".
Por ejemplo:
Gravedad = 0.01
RedZ = 18.6
AlexFuerzadetiros = 2.975
AlexX = 488
AlexY = 548
DistanciahastaDestinoX = 240.9
DistanciahastaDestinoY = 368
DistanciahastaDestinoXY = 439.837253992883
Parte = 78.333562890625
Disc = 66.960524890625
DistanciahastaRed = 632.744136586501
theta = 1.31809820149062
TiempoHastaRedTheta = 850.689542137363
AlturaEnRedTheta = -1122.89688542468
phi = 0.150652307511496
TiempoHastaRedPhi = 215.123727738993
AlturaEnRedPhi = -90.2989548532666
TiroRealizable = "2 ángulos, pero ninguno sirve"
Angulo = "Ninguno"
BallXwhenstriked = 521
BallYwhenstriked = 548
BallZwhenstriked = 45.04

Medio supongo que tiene que ver con esas alturas negativas en la red, voy a revisar si hice algo mal ahí y si es el caso edito el post medio pronto, sino es que no sé.


Título: Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones.
Publicado por: Tachikomaia en 26 Mayo 2023, 11:51 am
Cambié BallY por BallZ y funciona bien ;-) salvo con mucha fuerza, pasa por debajo de la red y pica después de donde debe ¿quizá es por cómo calculos las posiciones? ¿o un error del Flash que uso?
Te muestro:
https://drive.google.com/file/d/1DjvvtvnTAwY5aiseW7afowmS0nZdFTwL/view?usp=drive_link

Una duda: ¿En qué casos sólo es posible 1 ángulo? Quisiera obtener alguno para asegurarme de que funcione bien también en esos casos.