AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Canvas- Problem mit Parabel zeichnen

Ein Thema von Blubbel · begonnen am 2. Nov 2011 · letzter Beitrag vom 2. Nov 2011
Antwort Antwort
Seite 3 von 3     123
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.554 Beiträge
 
Delphi 6 Enterprise
 
#21

AW: Canvas- Problem mit Parabel zeichnen

  Alt 2. Nov 2011, 14:51
Vllt. zeigst du mal den ganzen Code?

Worauf Bummi und auch ich hinauswollen, ist, dass das Round die ganze Zeit gar nicht sein muss. Es dient ja nur dazu, die Nachkommastellen loszuwerden, sprich aus den Real-Werten Integerwerte zu machen, als Koordinaten für das zeichnen. Statt Round hätte man also genausogut auch Trunc nehmen können und es sollte vor dem j reichen.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
3.898 Beiträge
 
Delphi 10.3 Rio
 
#22

AW: Canvas- Problem mit Parabel zeichnen

  Alt 2. Nov 2011, 14:55
Gib doch mal nen Wertetabelle aus...
  Mit Zitat antworten Zitat
Blubbel

Registriert seit: 6. Okt 2011
125 Beiträge
 
Delphi 2010 Professional
 
#23

AW: Canvas- Problem mit Parabel zeichnen

  Alt 2. Nov 2011, 14:59
Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Printers, Jpeg, phpUtils, ComCtrls, math;

type
  TForm1 = class(TForm)
    edtEingabe: TEdit;
    lblFX: TLabel;
    lbl_X: TLabel;
    btn_Zeichne: TButton;
    edt_Bx: TEdit;
    lbl_bx: TLabel;
    edt_C: TEdit;
    lbl_C: TLabel;
    Label2: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    edtFx: TEdit;
    edt_X: TEdit;
    edt_B: TEdit;
    edt_Cx: TEdit;
    btn_Zeichne1: TButton;
    btn_neu: TButton;
    btn_close: TButton;
    Label1: TLabel;
    Label3: TLabel;
    btnPrint: TButton;
    btnSave: TButton;
    SaveDialog1: TSaveDialog;
    PrintDialog1: TPrintDialog;
    TrackBar1: TTrackBar;
    PaintBox1: TPaintBox;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btn_ZeichneClick(Sender: TObject);
    procedure btn_Zeichne1Click(Sender: TObject);
    procedure btn_closeClick(Sender: TObject);
    procedure btn_neuClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure btnPrintClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    FFuncData: TphFuncData;
    procedure Draw(ACanvas: TCanvas; AScaleFactor: Integer; AFuncData: TphFuncData);
    procedure Reset;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  a,b,c: Real;

implementation

uses
  Types;

{$R *.dfm}

procedure TForm1.btnPrintClick(Sender: TObject);
var x,y:integer;
begin
  if PrintDialog1.Execute then
  begin
    Printer.BeginDoc;
    for x:=0 to Paintbox1.Height-1 do
    for y:=0 to Paintbox1.Width-1 do
    Printer.Canvas.Pixels[5*x,5*y]:=Paintbox1.Canvas.Pixels[x,y];
    Printer.EndDoc;
  end;
end;

procedure TForm1.btnSaveClick(Sender: TObject);
var
  Bitmap : TBitmap;
begin
  if SaveDialog1.Execute then
  begin
    Bitmap:=TBitmap.Create;
    Try
      Bitmap.Width:=PaintBox1.ClientWidth;
      Bitmap.Height:=PaintBox1.ClientHeight;
      BitBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height, PaintBox1.Canvas.Handle,0,0,SRCCOPY);
      Bitmap.SaveToFile(SaveDialog1.FileName + '.bmp');
    Finally
      Bitmap.Free;
    end;
  end;
end;

procedure TForm1.Draw(ACanvas: TCanvas; AScaleFactor: Integer; AFuncData: TphFuncData);
var
  lPoint: TPoint;
  lCount, lScale, i, j, y, x: Integer;
  lIndex: Integer;
begin
  ACanvas.Brush.Style:= bsSolid;
  ACanvas.Brush.Color:= clWhite;
  ACanvas.FillRect(ACanvas.ClipRect);
                //X-Achse
  ACanvas.TextOut(0,0, RectToStr(ACanvas.ClipRect));
  ACanvas.MoveTo(0, GetHeight(ACanvas.ClipRect) div 2); //Graph
  ACanvas.LineTo(GetWidth(ACanvas.ClipRect), GetHeight(ACanvas.ClipRect) div 2);
  //Mittelpunkt ausrechnen
  lPoint:= GetCenter(ACanvas.ClipRect);
  //Scalierungswert festlegen

  //Mittelpunkt bis Rechts - X-Achse
  i:= lPoint.X;
  lCount:= 0;
  lScale:= AScaleFactor;
  while i < ACanvas.ClipRect.Right do
  begin
    inc(i,lScale);
    inc(lCount,1);

    DrawGridCaption(ACanvas, Point(i, lPoint.Y), 0, IntToStr(lCount));
  end;

  //Mittelpunkt bis Links der X-Achse
  i:= lPoint.X;
  lScale:= AScaleFactor;
  lCount:= 0;
  while i > ACanvas.ClipRect.Left do
  begin
    dec(i, lScale);
    dec(lCount, 1);

    DrawGridCaption(ACanvas, Point(i, lPoint.Y), 2, IntToStr(lCount));
  end;

  //Y-Achse Von Mittelpunkt nach unten
  lPoint:= GetCenter(ACanvas.Cliprect);
  lScale:= AScaleFactor;
  i:=lPoint.Y;
  lCount:= 0;
  while i < ACanvas.ClipRect.Bottom do
  begin
    inc(i, lScale);
    inc(lCount, -1);

    DrawGridCaption(ACanvas, Point(lPoint.X, i), 1, IntToStr(lCount));
  end;

  //Y-Achse von Mittelpunkt nach oben
  lPoint:= GetCenter(ACanvas.Cliprect);
  lScale:= AScaleFactor;
  i:=lPoint.Y;
  lCount:= 0;
  while i > ACanvas.ClipRect.Top do
  begin
    dec(i, lScale);
    dec(lCount, -1);

    DrawGridCaption(ACanvas, Point(lPoint.X, i), 3, IntToStr(lCount));
  end;
       //Y-Achse
  ACanvas.MoveTo(GetWidth(ACanvas.ClipRect) div 2, 0); //Graph
  ACanvas.LineTo(GetWidth(ACanvas.ClipRect) div 2, GetHeight(ACanvas.ClipRect));

  for lIndex := 0 to high(AFuncData) do
  begin
    case round(AFuncData[lIndex][0]) of
      0:
      begin
        for i := 0 to GetWidth(ACanvas.ClipRect) do
        begin
          x:=(i - (GetWidth(ACanvas.ClipRect) div 2)) div GetScaleValue(TrackBar1.Position);
          y:=round(CalcX2(x));
          j:=round(GetHeight(ACanvas.ClipRect) div 2) - y * GetScaleValue(TrackBar1.Position);
          ACanvas.Pixels[i, j]:=clblue;

          OutputDebugString(PChar(IntToStr(x) +'x'+ IntToStr(y)));
        end;
      end;
      1:
      begin
// for i := 0 to high - 1 do //?????????????????????????
        begin
          //CalcX2(a * sqr (x) + b * x + c)
          ACanvas.Pixels[i,j]:=clblue;
        end;
      end;
      2:
      begin
// for i := 0 to high -1 do //????????????????????????
        begin
          //CalcX2(a * sqr (x + b) + c);
          ACanvas.Pixels[i,j]:=clblue;
        end;
      end;
    end;
  end;
end;

procedure TForm1.Reset;
begin
  SetLength(Self.FFuncData, 0);
  Draw(PaintBox1.Canvas, GetScaleValue(TrackBar1.Position), Self.FFuncData);

  TrackBar1.Position := 0;
  edtEingabe.Text := '';
  edt_Bx.Text := '';
  edt_C.Text := '';
  edtFx.Text := '';
  edt_X.Text := '';
  edt_B.Text := '';
  edt_Cx.Text := '';
end;

procedure TForm1.btn_closeClick(Sender: TObject);
begin
 Form1.Close;
end;

procedure TForm1.btn_ZeichneClick(Sender: TObject);
var
  i,j:Integer;
  x,y: Real;
begin
  a:= StrToFloatDef(edtEingabe.Text, 0);
  b:= StrToFloatDef(edt_Bx.Text, 0);
  c:= StrToFloatDef(edt_C.Text, 0);
  i:=0;

  for i := 0 to GetWidth(PaintBox1.Canvas.ClipRect) do
  begin
    x:=(i - (GetWidth(PaintBox1.Canvas.ClipRect) div 2) / GetScaleValue(TrackBar1.Position));
    y:= (a * sqr (x) + (b * x) + c); //???????????????????????????????????????????
    j:=round((GetHeight(PaintBox1.Canvas.ClipRect) div 2) - y * GetScaleValue(TrackBar1.Position));
    PaintBox1.Canvas.Pixels[i,j]:=clblue;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(Self.FFuncData, high(FFuncData) +2);
  SetLength(Self.FFuncData[high(FFuncData)], 1);

  Self.FFuncData[high(FFuncData)][0] := 0;

  Draw(PaintBox1.Canvas, GetScaleValue(TrackBar1.Position), Self.FFuncData);
end;

procedure TForm1.btn_neuClick(Sender: TObject);
begin
  Paintbox1.Canvas.Rectangle(0,0,width,height);
  Reset;
end;

procedure TForm1.btn_Zeichne1Click(Sender: TObject);
var
  i,j:Integer;
  x,y: Real;
begin
  a:= StrToFloatDef(edt_X.Text, 0);
  b:= StrToFloatDef(edt_B.Text, 0);
  c:= StrToFloatDef(edt_Cx.Text, 0);
  i:=0;

  for i := 0 to GetWidth(PaintBox1.Canvas.ClipRect) do
  begin
    x:= (i-(GetWidth(PaintBox1.Canvas.ClipRect) div 2)) / GetScaleValue(TrackBar1.Position);
    y:= (a * sqr (x + b) + c);
    j:= round((GetHeight(PaintBox1.Canvas.ClipRect) div 2) - y * GetScaleValue(TrackBar1.Position));
    PaintBox1.Canvas.Pixels[i,j]:=clred;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  self.Reset;

  Draw(PaintBox1.Canvas, GetScaleValue(TrackBar1.Position), Self.FFuncData);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Draw(PaintBox1.Canvas, GetScaleValue(TrackBar1.Position), Self.FFuncData);
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  Draw(PaintBox1.Canvas, GetScaleValue(TrackBar1.Position), Self.FFuncData);
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Draw(PaintBox1.Canvas, GetScaleValue(TrackBar1.Position), Self.FFuncData);
end;

end.




unit phpUtils;

interface

uses
  Windows, SysUtils,Types, Graphics, Dialogs, math;

type
  TphFuncParams = array of real;
  TphFuncData = array of TphFuncParams;


  function GetWidth(AValue: TRect): Integer;
  function GetHeight(AValue: TRect): Integer;
  function RectToStr(AValue: TRect): String;
  function GetCenter(AValue: TRect): TPoint;
  function DrawGridCaption(ACanvas: TCanvas; APoint: TPoint; APos: Integer; AText: String): Boolean;
  function GetScaleValue(APos: Integer): Integer;

  function CalcX2(AXValue: real): real;

implementation

  function CalcX2(AXValue: real): real;
  begin
    result:= Power(AXValue, 2)
  end;


  function GetScaleValue(APos: Integer): Integer;
  begin
    Result:= ((APos + 10) + 1) * 10;
  end;

  function GetWidth(AValue: TRect): Integer;
  begin
    Result:= (AValue.Right - AValue.Left);
  end;

  function GetHeight(AValue: TRect): Integer;
  begin
    Result:= (AValue.Bottom - AValue.Top);
  end;

  function RectToStr(AValue: TRect): String;
  begin
    Result:= IntToStr(GetWidth(AValue)) + 'x' + IntToStr(GetHeight(AValue));
  end;

  function GetCenter(AValue: TRect): TPoint;
  begin
    Result.X := (GetWidth(AValue) div 2);
    Result.Y := (GetHeight(AValue) div 2);
  end;

  function DrawGridCaption(ACanvas: TCanvas; APoint: TPoint; APos: Integer; AText: String): Boolean;
  begin
    Result:= false;

    if Assigned(ACanvas) and (AText <> '') then
    begin
      case APos of
        0:
        begin
          ACanvas.TextOut(APoint.X-3, APoint.Y+5, AText);

          ACanvas.MoveTo(APoint.X, APoint.Y - 5);
          ACanvas.LineTo(APoint.X, APoint.Y + 5);

          Result:= true;
        end;
        1:
        begin
          ACanvas.TextOut(APoint.X+5, APoint.Y-3, AText);

          ACanvas.MoveTo(APoint.X - 5, APoint.Y);
          ACanvas.LineTo(APoint.X + 5, APoint.Y);

          Result:= true;
        end;
        2:
        begin
          ACanvas.TextOut(APoint.X-3, APoint.Y+5, AText);

          ACanvas.MoveTo(APoint.X, APoint.Y - 5);
          ACanvas.LineTo(APoint.X, APoint.Y + 5);

          Result:= true;
        end;
        3:
        begin
          ACanvas.TextOut(APoint.X+5, APoint.Y-3, AText);

          ACanvas.MoveTo(APoint.X - 5, APoint.Y);
          ACanvas.LineTo(APoint.X + 5, APoint.Y);

          Result:= true;
        end;
      end;
    end;
  end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)
Online

Registriert seit: 29. Mai 2002
37.277 Beiträge
 
Delphi 2006 Professional
 
#24

AW: Canvas- Problem mit Parabel zeichnen

  Alt 2. Nov 2011, 15:08
Pack das Berechnen der Punkte mal in eine eigene Klasse. Dann kann man das auch besser debuggen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.554 Beiträge
 
Delphi 6 Enterprise
 
#25

AW: Canvas- Problem mit Parabel zeichnen

  Alt 2. Nov 2011, 15:26
Hier in der Funktion haste das round zumindest nur beim j:=...

Delphi-Quellcode:
procedure TForm1.btn_Zeichne1Click(Sender: TObject);
var
  i,j:Integer;
  x,y: Real;
begin
  a:= StrToFloatDef(edt_X.Text, 0);
  b:= StrToFloatDef(edt_B.Text, 0);
  c:= StrToFloatDef(edt_Cx.Text, 0);
  i:=0;

  for i := 0 to GetWidth(PaintBox1.Canvas.ClipRect) do
  begin
    x:= (i-(GetWidth(PaintBox1.Canvas.ClipRect) div 2)) / GetScaleValue(TrackBar1.Position);
    y:= (a * sqr (x + b) + c);
    j:= round((GetHeight(PaintBox1.Canvas.ClipRect) div 2) - y * GetScaleValue(TrackBar1.Position));
    PaintBox1.Canvas.Pixels[i,j]:=clred;
  end;
end;
Ralph
  Mit Zitat antworten Zitat
Blubbel

Registriert seit: 6. Okt 2011
125 Beiträge
 
Delphi 2010 Professional
 
#26

AW: Canvas- Problem mit Parabel zeichnen

  Alt 2. Nov 2011, 15:49
@ jumpy

ja ich weiß ich habe ja, um alle graphen die gezeichnet wurden auch zoomen zu können, ein array angelegt. deswegen ja round.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf