Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#7

AW: Punkt in Canvas Koordinatensystem zeichnen

  Alt 24. Apr 2014, 16:06
Zuerst etwas zum Thema Lesbarkeit von Qellcodes:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  LVGroesse:integer;
  LVGewicht:integer;
begin
With image1.Canvas do
begin
LVGroesse:= strtoint(Edit1.Text);
LVGewicht:=strtoint(Edit2.Text);
TextOut(LVGroesse,LVGewicht,'X');
end;
end;
Es hat sich so eingebürgert (es gibt Sprachen da soll es ohne gar nicht funktionieren, wie z.B. Phyton), dass man Blöcke einrückt. Dadurch erkennt man was zu was gehört. Bei so einem kurzen Code geht es noch, aber irgendwann wird es unübersichtlich und man verbraucht die Hälfte der Zeit damit den Code im Kopf zu strukturieren.
Delphi-Quellcode:
begin
  With image1.Canvas do
  begin
    LVGroesse:= strtoint(Edit1.Text);
    LVGewicht:=strtoint(Edit2.Text);
    TextOut(LVGroesse,LVGewicht,'X');
  end;
end;
Zu der Frage. Die Koordinaten der Leinwand in Delphi (also Canvas) liegen oben links, also klein ist links und oben, größer wird es nach rechts unten. Will man in einem Koordinatensystem zeichnen, muss man die Y Werte von dem Koordinatensystem abziehen, X dazu addieren.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  BildWeite, BildHoehe, KoordinateX0, KoordinateY0, X, Y: Integer;
begin
  //Bildbreite und -Höhe ermitteln. Die Koordinalten 0/0 sind links oben
  BildWeite := Canvas.ClipRect.Right - Canvas.ClipRect.Left;
  BildHoehe := Canvas.ClipRect.Bottom - Canvas.ClipRect.Top;

  //Das Koordinatenkreuz (Annahme: Mitte vom Bild)
  KoordinateX0 := BildWeite div 2;
  KoordinateY0 := BildHoehe div 2;

  Canvas.MoveTo(0, KoordinateY0);
  Canvas.LineTo(BildWeite, KoordinateY0);
  Canvas.MoveTo(KoordinateX0, 0);
  Canvas.LineTo(KoordinateX0, BildHoehe);

  //Position vertikal 70 und horizontal 50 in der Koordinate setzten
  //Hier reicht es den Wert zum Koordinatenkreuz (Nullpunkt X) dazu zu addieren
  X := KoordinateX0 + 70;
  //Hier muss der Wert vom Koordinatenkreuz (Nullpunkt Y) abgezogen werden
  Y := KoordinateY0 - 50;
  Canvas.Pixels[X, Y] := clBlack;
end;
Hier ein Beispiel mit Sinus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  BildWeite, BildHoehe, KoordinateX0, KoordinateY0, X, Y,
  i: Integer;
  FaktorX, FaktorY: Real;
begin
  //Bildbreite und -Höhe ermitteln. Die Koordinalten 0/0 sind links oben
  BildWeite := Canvas.ClipRect.Right - Canvas.ClipRect.Left;
  BildHoehe := Canvas.ClipRect.Bottom - Canvas.ClipRect.Top;

  //Das Koordinatenkreuz (Annahme: Mitte vom Bild)
  KoordinateX0 := BildWeite div 2;
  KoordinateY0 := BildHoehe div 2;

  Canvas.MoveTo(0, KoordinateY0);
  Canvas.LineTo(BildWeite, KoordinateY0);
  Canvas.MoveTo(KoordinateX0, 0);
  Canvas.LineTo(KoordinateX0, BildHoehe);

  //Faktoren passen die Werte an die Leinwand an, da zB Sin max 1 liefert, was nur ein Pixel wäre
  FaktorX := BildWeite / (2 * Pi);
  FaktorY := KoordinateY0 / SIN(Pi / 2);

  for i := Round(-Pi * FaktorX) to Round(Pi * FaktorX) do
  begin
    X := KoordinateX0 + i;
    Y := KoordinateY0 - Round(Sin(i / FaktorX) * FaktorY);
    Canvas.Pixels[X, Y] := clBlack;
  end;
end;
  Mit Zitat antworten Zitat