Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Punkt in Canvas Koordinatensystem zeichnen (https://www.delphipraxis.net/180122-punkt-canvas-koordinatensystem-zeichnen.html)

nadery 24. Apr 2014 12:56

Punkt in Canvas Koordinatensystem zeichnen
 
http://forum.delphi-treff.de/index.p...threadID=59561 Crosspost

Wie setzte ich einen Punkt in ein mit Canvas gezeichnetes Koordinatensystem?

Die Koordinaten sollen aus zwei Edit Feldern entnommen werden.

Ich hatte an sowas hier Gedacht...

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;
Nur fängt er bei TextOut vom Absolut punkt der ganzen Image an und nicht vom Koordinatensystem selbst.
Die Y-Koordinate von TextOut geht ja auch immer nach unten und nicht nach oben?

Jemand ne bessere Idee als das mit TextOut zu machen oder ein Vorschlag wie ich es mit TextOut machen kann?

Danke

DeddyH 24. Apr 2014 13:01

AW: Punkt in Canvas Koordinatensystem zeichnen
 
Soll ich Dir die einfache Addition noch einmal erklären, oder willst Du erst noch in 3 anderen Foren fragen?

himitsu 24. Apr 2014 13:08

AW: Punkt in Canvas Koordinatensystem zeichnen
 
Code:
9 8 7 6 5 4 3 2 1 0    <= echte Koordinaten im Canvas
      0 1 2 3 4 5      <= dein virtuelles Koordinatensystem
Wenn du jetzt was in die 4 reinmalen willst, wie kommt man dann wohl auf die 2 des Canvas?


Erstes Beispiel mit einer 1:1-Skalierung ... eventuell muß Diese auch noch mit eingerechnet werden.
Code:
9 8 7 6 5 4 3 2 1 0    <= echte Koordinaten im Canvas
      0 2 4 6 8        <= dein virtuelles Koordinatensystem mit 2 Schritten pro Pixel

Bjoerk 24. Apr 2014 14:57

AW: Punkt in Canvas Koordinatensystem zeichnen
 
Letzter Versuch:
Delphi-Quellcode:
var
  Groesse, Gewicht: double;
  P: TPoint;
  C: char;
begin
  C := 'X';
  Groesse := StrToFloatDef(Edit1.Text, 0);
  Gewicht := StrToFloatDef(Edit2.Text, 0);
  P := Point(GetX(Groesse), GetY(Gewicht));
  P.X := P.X - Image1.Canvas.TextWidth(C) div 2;
  P.Y := P.Y - Image1.Canvas.TextHeight(C) div 2;
  Image1.Canvas.TextOut(P.X, P.Y, C);
end;
Jetzt frag mich bitte bitte bitte nicht wo die GetX und GetY herkommen..

nadery 24. Apr 2014 15:40

AW: Punkt in Canvas Koordinatensystem zeichnen
 
Doch leider kein Schimmer :-/

hab das mal im zusammenhang mit set und get functions gehört..

p80286 24. Apr 2014 16:01

AW: Punkt in Canvas Koordinatensystem zeichnen
 
Nun, da ich nicht alles verfolgt habe gehe ich davon aus, daß Groesse und Gewicht in die zu deinem Koordinatensystem passenden x und y Werten übersetzt werden.
Wobei natürlich auch der senkrechte und waagerechte Versatz mit berücksichtigt werden kann/sollte/muß.
An diese Stelle wird dan ein "X" geschrieben.

Hat was die Idee

Gruß
K-H

Popov 24. Apr 2014 16:06

AW: Punkt in Canvas Koordinatensystem zeichnen
 
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;

Bjoerk 24. Apr 2014 16:19

AW: Punkt in Canvas Koordinatensystem zeichnen
 
Zitat:

Zitat von nadery (Beitrag 1256787)
Doch leider kein Schimmer :-/

Dann schau halt bitte mal nach was ich vorgestern in dem oben von dir verlinkten Thread unter #9 und #32 gepostet habe? Ich mein, ich will dir das nicht aufschwatzen. Ist nur eine von vielen Möglichkeiten..

nadery 24. Apr 2014 16:25

AW: Punkt in Canvas Koordinatensystem zeichnen
 
Bjoerk hab vielen dank es funktioniert auf deine Art nur ob ich das auch alles erklären kann :p

andere frage kann ich von der der jetzigen Unit Edit Felder von der ersten ansprechen, weil wen ich davor Form1 schreibe sagt er mir er kennt sie nicht.

Popov 24. Apr 2014 17:02

AW: Punkt in Canvas Koordinatensystem zeichnen
 
nadery, in welcher Klasse gehst du und wie lange hast du inzwischen Delphi (Lazarus) Unterricht?

Nichts böses, ich frage das nur um dein Kenntnisstand abschätzen zu können.

Bjoerk 24. Apr 2014 17:05

AW: Punkt in Canvas Koordinatensystem zeichnen
 
Schonmal irgendwo gesehen? :)

f(x) = Y1 + (Y2 - Y1) / (X2 - X1) * (X - X1)

Die GetX stellt aus den Punktepaaren 160cm/91PixelX 200cm/584PixelX und die GetY aus den Punktepaaren 120kg/91PixelY 40kg/310PixelY die Funktionsgleichungen auf. GetX ist also eine f(cm Körpergröße) und GetY eine f(kg Körpergewicht) bezogen auf den Funktionsbereich GetRect in Pixel.

Würde eher die Variablen Groeese und Gewicht in Form2 deklarieren und in einer property zur Verfügung stellen sonst bekommst du eine Zirkularität rein.

Delphi-Quellcode:
  TForm2 = class(TForm)
   ..
  private
    FGroesse, FGewicht: double;
  public
    property Groesse: double read FGroesse write FGroesse;
    property Gewicht: double read FGewicht write FGewicht;
  end;
Innerhalb von TForm2 verwendest du FGroesse, FGewicht (F wie Feld).

und in unit1:
Delphi-Quellcode:
  Form2.Groesse := StrToFloatDef(Edit1.Text, 0);
  Form2.Gewicht := StrToFloatDef(Edit2.Text, 0);

nadery 24. Apr 2014 17:39

AW: Punkt in Canvas Koordinatensystem zeichnen
 
Nach meiner Ausbildung im Einzelhandel, wollte ich das Fachabi noch machen und konnte aufgrund abgeschlossener Ausbildubg verkürzen sprich ich durfte direkt in die 12.Klasse und die einzige Fachrichtung, wo es noch platz gab war Wirtschaftsinformatik, somit weniger als 1 Jahr Lazarus...

Popov 24. Apr 2014 21:51

AW: Punkt in Canvas Koordinatensystem zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das Problem an der Aufgabe ist nicht, dass sie sonderlich kompliziert ist - sie ist sogar relativ einfach, man muss nur einen Punkt irgendwo plazieren - das Komplexe an der Aufgabe, wenn überhaupt, ist das Diagramm. Zuerst muss man die Koordinatenlinien zeichnen. Das bedeutet, man muss Pixel zählen. Diese Werte kann man direkt in die Schleifen setzten, was auch zum Ziel führt, oder als Konstanten speichern. Der nächste Punkt ist den Punkt auf dem Diagramm setzten. Hier könnte man wieder Pixel zählen oder es "richtig" machen, d. h. ein Koordinatensystem erstellen mit einem Nullpunkt für X und Y. Die Grafik ist dann nur ein Ausschnitt des Koordinatensystems.

Alternativ kann man sich verbeigen und versuchen seinen Punkt auf der Grafik zu setzten.

Ein Tipp von mir: berechne die Position von dem Nullpunkt für X und Y. Es ist egal ob es außerhab der Grafik ist. Du kannst dich dann ab der Position absolut richten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz