domingo, 5 de janeiro de 2014

Delphi...

Ajudar Charles a fazer Zoom, baba
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, ExtCtrls, StdCtrls, Equations;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    edFunction: TEdit;
    Label2: TLabel;
    edXmin: TEdit;
    Label3: TLabel;
    edXmax: TEdit;
    Label4: TLabel;
    edYmin: TEdit;
    Label5: TLabel;
    edYmax: TEdit;
    Panel1: TPanel;
    PaintBox1: TPaintBox;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    pnGreen: TPanel;
    pnRed: TPanel;
    procedure edXminExit(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FLastError : string;
    FMathParser : TMathParser;
    FXReal : extended;
    FXImag : extended;
    procedure Redraw;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.edXminExit(Sender: TObject);
begin
  Redraw;
end;

procedure TForm1.Redraw;
begin
  PaintBox1.Invalidate;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
const resolution = 1000;
var dx : extended;
    y : extended;
    xmin : extended;
    xmax : extended;
    ymin : extended;
    ymax : extended;
    cx, cy : integer;
begin
  { Toda a pintura ocorre aqui }
  with PaintBox1.Canvas do
  begin
    try
      { preparação do math parser com a equação digitada }
      with FMathParser do
      begin
        Equacoes.Clear;
        Equacoes.Add('funcao',edFunction.Text);
        if not AvaliarEquacoes then
          raise Exception.Create('Erro de sintaxe na equação');
      end;

      { limpa a área gráfica }
      FillRect(ClientRect);

      xmin := StrToFloat(edXmin.Text);
      xmax := StrToFloat(edXmax.Text);
      ymin := StrToFloat(edYmin.Text);
      ymax := StrToFloat(edYmax.Text);

      FXReal := xmin; { x indica o ponto atual que está sendo plotado }
      dx := (xmax-xmin) / resolution; { dx é o passo que a cordenada x usará como incremento }

      { varre a cordenada x de xmin até xmax, calculando para cada ponto x o y correspodendente }
      Pen.Color := clLime;
      while FXReal <= xmax do
      begin
        { cálculo da cordenada Y correspondente ao X atual }
        y := FMathParser.Equacoes[0].Computar([]).a;

        { conversão das cordenadas reais em cordenadas de tela }
        cx := Round( (FXReal - xmin) / (xmax - xmin) * PaintBox1.ClientWidth );
        cy := Round( (ymax - y) / (ymax - ymin) * PaintBox1.ClientHeight );

        { plotagem do segmento de reta que une o ponto atual ao ponto anterior }
        if FXReal = xmin then
          MoveTo( cx, cy )
        else
          LineTo( cx, cy );

        { incremento da cordendada X }
        FXReal := FXReal + dx;
      end;
      pnGreen.Visible := True;
      pnRed.Visible := False;

    except
      { em caso de falha, apenas deixa de pintar o gráfico }
      on ex: Exception do
      begin
        FLastError := ex.message;
        pnGreen.Visible := False;
        pnRed.Visible := True;
      end;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  { Criação do componente para processamento de equações }
  FXImag := 0; { não trabalharemos com números complexos nesse programa }
  FXReal := 0;
  FMathParser := TMathParser.Create(Self);
  { cria uma variável 'x' no math parser, para ser usada na plotagem }
  FMathParser.Variaveis.Add(
    'x',                 { nome da variável }
    @FXReal,             { endereço da parte real da variável }
    @FXImag );      { endereço da parte imaginária da variável }
end;

end.
Postar um comentário