Ver Mensaje Individual
  #4  
Antiguo 09-12-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Reputación: 22
andres1569 Va por buen camino
Hola:

Lo normal es que si un objeto se mueve a intervalos muy cortos, es decir de uno o dos pixeles, no se aprecie demasiado por el ojo humano ese movimiento Sólo Vertical - Sólo Horizontal; otra cosa es si avanzase, por ejemplo 10 ó más pixels sobre un solo eje.

Si el ángulo no es de 45º, siempre habrá un eje sobre el que se desplace más pixels que sobre el otro, parecido a como se dibujan las líneas en una cuadrícula (dibuja una línea con el Paint, haz un zoom grande y verás eso con claridad).

Otra cosa es cómo calcules las posiciones sucesivas que debe avanzar cada vez el objeto. Supongamos que quieres mover un objeto desde un punto PIni a otro PFin, y quieres que entre dichas posiciones transcurran 10 pasos, por ejemplo.

En este ejemplo, deberías seguir más o menos este algoritmo:
Código:
procedure Muevete (PIni, PFin: TPoint; Steps: Integer);
var
  DeltaX, DeltaY, i : Integer;
  NewPos : TPoint;
begin
  DeltaX := PFin.X - PIni.X;
  DeltaY := PFin.Y - PIni.Y;
  for i:=1 to Steps do
  begin
    NewPos.X := PIni.X + MulDiv (i, DeltaX, Steps);
    NewPos.Y := PIni.Y + MulDiv (i, DeltaY, Steps);
    Dibujate (NewPos);
  end;
end;
Con la función MulDiv (en windows.pas) trabajamos con Integers de forma más rápida para operaciones tipo regla de tres, como ésta, que nos permite calcular la posición correspondiente a cada eje en el paso (Step) correspondiente, teniendo en cuenta que no tiene por qué avanzar los mismos pixels en X o en Y en un paso que en otro, y sin necesidad de recurrir a operaciones con números reales.

Espero que te sirva.

PD: Añadir que si quisieras forzar que el mínimo intervalo de movimiento fuera siempre de 1 pixel, en ese caso en vez de tomar el valor Steps de la lista de parámetros, lo podrías calcular tú mismo. Después de haber calculado los Deltas, haces esto:

if Abs(DeltaX) > Abs(DeltaY) then Steps := Abs(DeltaX)
else Steps := Abs(DeltaY);

De esta forma, el eje sobre el que se da el mayor desplazamiento, sólo se desplazará 1 píxel como máximo, y sobre el otro habrá pasos en que se desplace 1 pixel y en otros 0 pixels.
__________________
Guía de Estilo

Última edición por andres1569 fecha: 09-12-2003 a las 19:18:49.
Responder Con Cita