PDA

Ver la Versión Completa : darle movimiento a este grafico


cristian bravo
09-05-2004, 07:15:14
hola como estan, yo aca medio complicado por que tengo este codigo y quiero que la funcion que grafico se mueva (osile) que se vea el recorido de la onda y no se como hacerlo alguno de ustedes podria darme una mano porfa se los agradeseria aca esta el codigo para que me digan lo malo y correcciones y me den sus ideas grax..


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls, ExtCtrls, ExtDlgs, Menus, Math;
type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Button2: TButton;
Button3: TButton;
SavePictureDialog1: TSavePictureDialog;
Label4: TLabel;
Label5: TLabel;
Button4: TButton;
OpenPictureDialog1: TOpenPictureDialog;
Label6: TLabel;
Edit3: TEdit;
Button5: TButton;
Edit2: TEdit;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var xi, yi, i, n, xn, h, a: Integer;
f: double;
begin
f := StrToFloat(Edit3.Text);
n := Round(StrToFloat(Edit1.Text));
a := Round(StrToFloat(Edit2.Text))*10;
xn:= 540;
Image1.Canvas.Pen.Color := clRed;
for i:= 0 to xn do
begin
yi:=Round(a*sin(f*DegToRad(i))+100);
Image1.Canvas.Pixels[i+n,200-yi]:= clRed;
Image1.Canvas.Pixels[i+n+1,200-yi]:= clRed;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
application.Terminate;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
archivo: TEXTFILE;
begin
if SavePictureDialog1.Execute then
begin
Image1.Picture.SaveToFile( SavePictureDialog1.FileName);
GetNamePath ;
assignfile(archivo,SavePictureDialog1.FileName + '.txt');
Rewrite(archivo);
WriteLN(archivo,Trim(Edit1.Text) );
//WriteLN(archivo,Trim(Edit2.Text) );
WriteLN(archivo,Trim(Edit3.Text) );
CloseFile(archivo) ;
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
archivo: TEXTFILE;
aux,aux2,aux3:String;
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
assignfile(archivo,OpenPictureDialog1.FileName + '.txt');
Reset(archivo);
ReadLN(archivo,aux);
Edit1.Text:=aux;
ReadLN(archivo,aux2);
// Edit2.Text:=aux2;
ReadLN(archivo,aux3);
Edit3.Text:=aux3;
CloseFile(archivo) ;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
Image1.Picture.Bitmap.LoadFromFile('limpiar.bmp');
end;
end.

marcoszorrilla
09-05-2004, 12:41:22
Lo primero como es tu primer mensaje en el foro te doy la bienvenida.

Convendría que le pegaras un vistazo a la Guía de estilo de los Foros, con ello verás las normas mínimas, el cumplimiento de las mismas redunda en un mejor funcionamiento de éstos y el obtener respuestas más rápidas.

Puedes pulsar en el botón editar de tu mensaje y colocarle las etiquetas Vb, en tu caso convendría que pusieras delante de tu código la etiqueta [ Delphi]
y al final[ /Delphi]

De esta manera tu código sería mucho más legible.

Si lo que deseas es que cada punto de la onda se vaya dibujando lentamente, creo que con un Bmp no lo vas a lograr, quizás tuvieras que utilizar funciones para escribir puntos directamente en el Canvas.

Un Saludo.

Amilius
09-05-2004, 18:04:19
procedure TForm1.Button5Click(Sender: TObject);
begin
Image1.Picture.Bitmap.LoadFromFile('limpiar.bmp');
end; :eek:

Bueno la verdad mejor si creas y recuperas una vez el gráfico de "fondo" ( que supongo es visualmente muy agradable ) al crear el form y lo liberas en el onDestroy.

Para que tu gráfico se vea oscilando debes sincronizar el periodo de la onda con múltiplos del ancho de tu área gráfica, de lo contrario el efecto será de onda desplazándose.

Si realmente quieres que te ayuden con el código tienes que dar nombres muy significativos a tus variables:

aux,aux2,aux3:String;
var xi, yi, i, n, xn, h, a: Integer;

A nadie le gusta tener que revisar codigo ajeno para saber que hacen esos "aux" y las otras variables de la segunda línea: no importa que se usen (tan horrorosamente abreviadas :P ) en matemáticas, en programación tienes libertad de utilizar más caracteres :) y te recomiendo que los uses: especialmente en las partes más complicadas del código para darle mayor significado.

cristian bravo
10-05-2004, 02:31:41
sorry por lodos los errores y por la poca cortesia de mi parte, espero que mejorar en adelnte, lo sierto es que hase 2 semanas que e comensado con delphi y no cacho mucho por eso pregunto sobre esto por que no e encantrado mucho sobre el movimiento en delphi les agradeseria que pudieran ser algo mas explicativos porfa.

sorry por lo de las variables es que no e estado muy creativo y e estado medio complicado tratando de hacer esto para la siguiente sere algo mas explicativo grax.

PD: algo de codifo mo me vendria nada mal si es que no les molesta porfis

Amilius
10-05-2004, 18:41:20
No tengo ejemplos puntuales para este tipo de graficación (ondas), pero:

* Para graficar la onda: es mejor usar el MoveTo() para el primero punto y luego una serie de LineTo(). El pixels es un tanto lento. Un objeto TTimer sería bueno para la animación y en su OnTimer ejecutar un repaint() de un TPaintBox donde en su evento onPaint dibujes un Tbitmap conteniendo la onda graficada:
* En un Tbitmap preparas la imagen (en su canvas aplicas los moveTo(), LineTo(), etc) y luego aplicas un .draw de este TBitmap en el canvas del PaintBox: obtienes una animación sin parpadeos.


+ Y un tip mas: Si aún tienes algo de parpadeo:

with self do//self es el control que contiene el gráfico
ControlStyle:=ControlStyle+[csOpaque];

OJO que esto es más recomendado para formularios donde sólo tienes el area gráfica y nada más: como en un juego, o un form donde sólo muestres el gráfico de las ondas.

P.D.

En lugar de: application.Terminate;

un: close(); generalmente es más recomendado.