Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-11-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Lightbulb Dibujar Elipse y Parábola pixel a pixel

Conociendo las fórmulas matemáticas de la construcción de una Elipse, me preguntaba como dibujarlo pixel por pixel, es decir empezar en cierto lugar, recorrer según su fórmula, y terminar en el mismo punto donde empezó.

Imagino que, para mostrarlo debo realizarlo con un TTimer, pero mi pregunta va dirigida más a conocer aquella ruta de construcción (dibujado) de esa Elipse, ya que requiero hacer mover un objeto por esa trayectoria, algo así como el movimiento de un Planeta alrededor del Sol por así decirlo, pero necesito saber en que coordenada de la Elipse se encuentra el planeta.
Responder Con Cita
  #2  
Antiguo 19-11-2006
JF Sebastian JF Sebastian is offline
Miembro
 
Registrado: oct 2006
Posts: 108
Poder: 18
JF Sebastian Va por buen camino
puedes hacerlo facilmente mediante coordenadas polares tomando como variable independiente el angulo ro algo asi como:

txy(a,0);
pd;
for i := 0 to 360 step 2 do
begin
ro := sqrt(a^2*b^2/(b^2*cos(i)^2+a^2*sin(i)^2));
txy(ro*cos(i),ro*sin(i));
end;


Esta tomado de un interprete que me hice para el trazado de perfiles metalicos mediante graficos de tortuga, pero te puede dar una idea de como hacerlo.

Saludos
Responder Con Cita
  #3  
Antiguo 19-11-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
No tengo Delphi a mano, lo probaré en casa. Solo viendo así el código: ¿y como detectar una posición (las coordenadas) en ese trazado en una TImage? Como dije mi objetivo es hacer mover un objeto por la ruta (alrededor) de elipse, y en algún momento necesitaré saber donde se encuentra el objeto en esa TIMage.

Última edición por Deiv fecha: 19-11-2006 a las 18:08:36.
Responder Con Cita
  #4  
Antiguo 19-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Según entendí lo que tu quieres son las coordenadas de la elipse y con ellas poder hacer lo que quieras, dibujar la elipse o mover un objeto siguiendo esa trayectoria. Sea como sea, aquí te dejo una función, que pasándole como parámetros x1,y1,x2,y2 (que tienen el mismo significado que en la función de dibujo) y el ángulo entre 0 y 2pi nos devuelve las coordenadas del punto correspondiente de la elipse.

Código Delphi [-]
function EllipsePoint(X1,Y1,X2,Y2: Integer; Angulo: Double): TPoint;
var
  Cx,Cy,A,B: Double;
begin
  A:= abs(X2-X1)/2;
  B:= abs(Y2-Y1)/2;
  Cx:= (X1+X2)/2;
  Cy:= (Y1+Y2)/2;
  Result.X:= Trunc(Cx + A * cos(Angulo));
  Result.Y:= Trunc(Cy - B * sin(Angulo));
end;

Por ejemplo si queremos dibujar la elipse:
Código Delphi [-]
var
  i: integer;
  P: TPoint;
begin
  P:= EllipsePoint(10,10,300,100,0);
  Canvas.MoveTo(P.X,P.Y);
  for i:= 1 to 360 do
  begin
    P:= EllipsePoint(10,10,300,100,(Pi*i)/180);
    Canvas.LineTo(P.X,P.Y);
  end;
end;

O si queremos mover un botón a lo largo de la trayectoria:
Código Delphi [-]
var
  i: integer;
  P: TPoint;
begin
  for i:= 0 to 360 do
  begin
    P:= EllipsePoint(10,10,300,100,(Pi*i)/180);
    Button1.Left:= P.X;
    Button1.Top:= P.Y;
    Application.ProcessMessages;
    Sleep(10);
  end;
end;
Responder Con Cita
  #5  
Antiguo 19-11-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Thumbs down

Vuelvo de casa después de implementar la orientación de JF Sebastian,
Pues lo he dibujado así con el código de abajo, imagino que deben ser las matemáticas, pero este me dibuja solo un cuadrante de la Elipse en el TIMage (cuadrante IV)
Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
var
  x,y,radio:extended;
  P1,P2,a,b,angulo:integer;
begin
    radio:= 40;
    a:=5;
    b:=2;
    for angulo:= 1 to 360 do
      begin
        x := radio*a*cos(angulo);
        y := radio*b*sin(angulo);
        P1:= StrToInt(FloatToStr(int(x)));
        P2:= StrToInt(FloatToStr(int(y)));
        Image1.Canvas.Pixels[P1,P2]:= clBlue;
      end;
      //Image1.Repaint;
end;
Como dije solo me dibuja el IV cuadrante, debe ser que me estoy ubicando mal en el TImage; otra cosa, el Timer no me dibuja muy bien los pixels, pareciera que lo hiciese como un Random, ¿alguna sugerencia?

Es un problemita no tener conexión Internet en casa, siempre me valgo de un CyberCafe, y estoy leyendo en este momento el código de Seoane, lo probaré regresando, y luego responderé, bueno?.
Responder Con Cita
  #6  
Antiguo 20-11-2006
JF Sebastian JF Sebastian is offline
Miembro
 
Registrado: oct 2006
Posts: 108
Poder: 18
JF Sebastian Va por buen camino
tienes que pasar los grados a radianes entre otras cosas...
Responder Con Cita
  #7  
Antiguo 20-11-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Thumbs up

He revisado el código de Seoane, y...... sinceramente es lo que necesitaba, agradecerte una vez mas "Salvador Allende" ("Salvador Seoane")
Gracias.
Responder Con Cita
  #8  
Antiguo 03-11-2016
Tuvan Tuvan is offline
Registrado
NULL
 
Registrado: nov 2016
Posts: 3
Poder: 0
Tuvan Va por buen camino
Gracias

Vengo siguiendo un tema que llevo en la universidad por varios casos como este en el foro y siempre me encuentro con las respuestas de Seoane te doy gracias amigo sabiendo que llevas tiempo sin actividad, tus respuestas me han dado mucha ayuda.
Es lo que buscaba, con esto termino de entender lo que estudiaba.
Gracias de nuevo
Responder Con Cita
  #9  
Antiguo 03-11-2016
Tuvan Tuvan is offline
Registrado
NULL
 
Registrado: nov 2016
Posts: 3
Poder: 0
Tuvan Va por buen camino
Cita:
Empezado por seoane Ver Mensaje
Según entendí lo que tu quieres son las coordenadas de la elipse y con ellas poder hacer lo que quieras, dibujar la elipse o mover un objeto siguiendo esa trayectoria. Sea como sea, aquí te dejo una función, que pasándole como parámetros x1,y1,x2,y2 (que tienen el mismo significado que en la función de dibujo) y el ángulo entre 0 y 2pi nos devuelve las coordenadas del punto correspondiente de la elipse.

Código Delphi [-]
function EllipsePoint(X1,Y1,X2,Y2: Integer; Angulo: Double): TPoint;
var
  Cx,Cy,A,B: Double;
begin
  A:= abs(X2-X1)/2;
  B:= abs(Y2-Y1)/2;
  Cx:= (X1+X2)/2;
  Cy:= (Y1+Y2)/2;
  Result.X:= Trunc(Cx + A * cos(Angulo));
  Result.Y:= Trunc(Cy - B * sin(Angulo));
end;

Por ejemplo si queremos dibujar la elipse:
Código Delphi [-]
var
  i: integer;
  P: TPoint;
begin
  P:= EllipsePoint(10,10,300,100,0);
  Canvas.MoveTo(P.X,P.Y);
  for i:= 1 to 360 do
  begin
    P:= EllipsePoint(10,10,300,100,(Pi*i)/180);
    Canvas.LineTo(P.X,P.Y);
  end;
end;

O si queremos mover un botón a lo largo de la trayectoria:
Código Delphi [-]
var
  i: integer;
  P: TPoint;
begin
  for i:= 0 to 360 do
  begin
    P:= EllipsePoint(10,10,300,100,(Pi*i)/180);
    Button1.Left:= P.X;
    Button1.Top:= P.Y;
    Application.ProcessMessages;
    Sleep(10);
  end;
end;

Me ha salido de maravilla el codigo, pero ahora esta es la situacion, quiero hacer lo mismo que el botón pero lo he cambiado por un Timage

Sólo me faltaria marcar la ruta por la que pasa con una linea e irla marcando poco a poco con sleep.

La finalidad de mi animación es dibujar un patrón aleatorio de posibles elipses pero soy un poco malo en trigonométria, espero puedan ayudarme
Responder Con Cita
  #10  
Antiguo 28-11-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por IrvaIva Ver Mensaje
...
Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración

Recuerda poner los tags al código fuente, ejemplo:



Gracias
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como obtener el color de un pixel ilichhernandez Gráficos 11 02-11-2006 16:40:00
pasar imagen pixel a pixel gulder Gráficos 7 26-06-2005 03:10:45
Pixel en un form aladelta Gráficos 1 02-12-2004 13:56:41
Obtener posicion X,Y de un pixel en un TImage diegofhernando Varios 3 17-12-2003 16:03:23
¿ Cual es la mejor forma de implementar una Pizarra con Sockets? pixel a pixel ? sase Internet 1 22-10-2003 17:23:50


La franja horaria es GMT +2. Ahora son las 01:25:47.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi