Thema: Delphi TCanvas : Sinuskurve

Einzelnen Beitrag anzeigen

Benutzerbild von isilive
isilive

Registriert seit: 15. Okt 2008
Ort: Österreich
192 Beiträge
 
Delphi 2009 Professional
 
#6

Re: TCanvas : Sinuskurve

  Alt 20. Dez 2009, 22:25
Hab mir erlaubt deinen Code mal etwas einzurücken, damit man ihn besser lesen kann.

Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
var h,j,x,e1,e2,e3,e4:integer;
      a,b,c,d,y:real;
begin
    FOR j:=1 to 300 do
      begin
      form1.canvas.pixels[30,30+j]:=clblack;
        if j<=20 then
          begin
          form1.Canvas.Pixels[30-j,30+j]:=clblack;
          form1.Canvas.Pixels[50-j,50-j]:=clblack;
          end;
      end;
    for h:=1 to 550 do
      begin
      form1.canvas.pixels[20+h,320]:=clblack;
        if h<=20 then
          begin
          form1.canvas.pixels[570-h,320+h]:=clblack;
          form1.canvas.pixels[570-h,320-h]:=clblack;
          end;
      end;
      val(edit1.Text,a,e1);
      val(edit2.Text,b,e2);
      val(edit3.Text,c,e3);
      val(edit4.Text,d,e4);
      if (e1<>0) and (e2<>0) and (e3<>0) and (e4<>0) then
          application.MessageBox('Falsche Eingabe','Fehler',MB_ok)
        else
          for x:=30 to 550 do
            begin
              y:=a*sin(b*x + c)+d;
              form1.Canvas.Pixels[30+round(100*y),320]:=clblack;
            end;
end;
Im Endeffekt geht es ja nur um diese Zeilen:
Delphi-Quellcode:
for x:=30 to 550 do
  begin
    y:=a*sin(b*x + c)+d;
    form1.Canvas.Pixels[30+round(100*y),320]:=clblack;
  end;
Wie Wolfgang und Namenlozer schon richtig geschrieben haben, muss du dir nur überlegen wie du
1) ein umgerechnetes x zum Einsetzten in die Formel kriegst
2) y skalieren muss damit das Ergebnis passt
3) hast du in Pixels [x,y] etwas stehen das ich nicht verstehe, das kann so nicht stimmen

Denkanstoss:
Delphi-Quellcode:
for x := 30 to 550 do
  begin
    x2 := x / faktor // (weil ich in die sinusformel nicht pixel sondern meinen normalen Wertebereich einsetze
    y := sin(x2);
    y := 100 - (y * streckfaktor); // damit die sinuskurve auch höher als 1 pixel wird
    canvas.pixels [x,y] := clBlack;
  end
Gibt immer noch eine pixelige Kurve aber sollte funzen. Wenn du cool bist dann kommst du auf den Faktor nicht durch probieren sondern durch nachdenken.
Weiters muss du aus y einen integer machen bevor du ihn in canvas.pixels verwendest. ZB so: canvas.pixels [x,round(y)] := clBlack;

Warum euer Lehrer euch nicht canvas.lineto verwenden lässt kann ich zwar nicht nachvollziehen, aber egal. Weiters könnte man noch andenken für x kleinere Schritte als 1 zu nehmen, dann würden auch entsprechend mehr Punkte erscheinen.
Stefan
Jedoch kann die referenzbasierte Implementierung des Standard-Objektmodells in Kombination mit den komplexen syntaktischen Dereferenzierungsregeln bei einer objektorientierten API wie ein Stolperstein wirken.
  Mit Zitat antworten Zitat