Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   MoveTo/LineTo (https://www.delphipraxis.net/184585-moveto-lineto.html)

brechi 8. Apr 2015 09:55

MoveTo/LineTo
 
Ich bin gerade ein wenig verwundert ueber LineTo / Polyline. Diese zeichnen die Linie nicht bis zum angegeben Punkt sondern hoeren einen Pixel vorher auf. War das schon immer so, oder liegt das an einstellungen (Windows7 / canvas.Pen / Grafikkarte etc.) ?


Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var
  x: Integer;
begin
  x := 2;
  // Fadenkreuz zu kurz
  Canvas.MoveTo(100 - x, 100);
  Canvas.LineTo(100 + x, 100);

  Canvas.MoveTo(100, 100 - x);
  Canvas.LineTo(100, 100 + x);

  // vollständiges Fadenkreuz
  Canvas.MoveTo(150 - x, 150);
  Canvas.LineTo(150 + x, 150);
  Canvas.LineTo(150 - x, 150);

  Canvas.MoveTo(150, 150 - x);
  Canvas.LineTo(150, 150 + x);
  Canvas.LineTo(150, 150 - x);
end;

himitsu 8. Apr 2015 10:05

AW: MoveTo/LineTo
 
Ja, das ist schon immer so.

Tipp:
Delphi-Referenz durchsuchenTCanvas.LineTo :roll:
Zitat:

Use LineTo to draw a line from PenPos up to, but not including the point (X,Y).




PS: In den letzten 30 Tagen gab es schonmal einen Thread, bezüglich dem Zeichnen auf das Canvas.

So, du malst auf die Form und jetzt rate mal, was passiert, wenn irgendwer (Windows, der Button oder ein anderes Programm, was mal über deiner Form lag) deine Form dazu bringt sich neu zu malen ... genau, Deines ist wieder weg. :stupid:

> TPaintBox und/oder OnPaint

brechi 8. Apr 2015 10:08

AW: MoveTo/LineTo
 
Du hast meine Frage nicht verstanden.

himitsu 8. Apr 2015 10:12

AW: MoveTo/LineTo
 
Beim zweiten Lesen schon.

Aber nicht nochmal hochschauen. Hatte es zwischenzeitlich heimlich geädert.

brechi 8. Apr 2015 10:19

AW: MoveTo/LineTo
 
Hab mir die msdn fuer Polyline angeschaut, da stands nicht drin. Embarcadero hats von LineTo ausm msdn ubernommen, da stehts drin. Ist also gelöst.

Btw. das betrifft auch Canvas.Ellipse etc.

himitsu 8. Apr 2015 10:23

AW: MoveTo/LineTo
 
Ein Polygon kann man als viele LineTo betrachten.
Da wäre es natürlich "sinnlos", wenn die Verbindungspunkte doppelt gezeichnet würden. :stupid:


Aber ja, ich fände es auch schöner, wenn man LineTo sagen könnte, es solle doch alles zeichnen.
(wie das im FMX implementiert ist ... k.A.)
Bei einer 1-Pixel breiten Linie könnte man noch ein Pixel anhängen (einzeln auf X,Y draufmalen).

brechi 8. Apr 2015 10:31

AW: MoveTo/LineTo
 
Edit:
Man kann den vorletzten Punkt nochmal zeichnen (als letzten) dann geht das denke ich auch mit dickeren Linien.


Ich bekomm es aber z.B. nicht hin einen symmetrischen 2-Pixel breiten Kreis zu zeichnen:


Delphi-Quellcode:
  Canvas.Pen.Width := 1;
  x := 2;
  Canvas.MoveTo(150 - x, 150);
  Canvas.LineTo(150 + x, 150);
  Canvas.LineTo(150 - x, 150);

  Canvas.MoveTo(150, 150 - x);
  Canvas.LineTo(150, 150 + x);
  Canvas.LineTo(150, 150 - x);

  x := 5;
  Canvas.Pen.Width := 2;
  Canvas.Brush.Style := bsClear;
  Canvas.Ellipse(150 - x, 150 - x, 150 + x + 1, 150 + x + 1);

Popov 8. Apr 2015 11:57

AW: MoveTo/LineTo
 
Das Fadenkreuz bekommst du schon hin, nur solltest du MoveTo immer zurückstellen

Delphi-Quellcode:
  Canvas.MoveTo(100, 100);
  Canvas.LineTo(100 - x, 100);
  Canvas.MoveTo(100, 100);
  Canvas.LineTo(100 + x, 100);
  Canvas.MoveTo(100, 100);
  Canvas.LineTo(100, 100 - x);
  Canvas.MoveTo(100, 100);
  Canvas.LineTo(100, 100 + x);
Wieso gibt es aber Probleme wenn man es normal macht? Ich denke das Problem liegt am Pinsel, denn auch wenn du nur eine 1 Pixel breite Linie zeichnest, wird es intern vermutlich (ich weiß es nicht, es erscheint mir nur logisch) mit einem 1 Pixel breitem Pinsel gezeichnet. Und der wird evtl. berechnet, wodurch sich Rundungsfehler ergeben können.

Bjoerk 8. Apr 2015 12:34

AW: MoveTo/LineTo
 
Meines Wissens zeichnet LineTo bis zum Pixel (im Gegensatz zu Rectangle und Co.)?

Edit: Mit LineTo können Sie eine Line von PenPos zum Punkt (X,Y) ziehen. Der Zielpunkt selbst gehört jedoch nicht mehr zur Linie. LineTo ändert den Wert von PenPos in (X,Y). Die Linie wird mit dem aktuellen Stift gezeichnet. Anmerkung: Wenn der aktuelle Stift nicht den Stil psSolid hat, wird die Linie mit dem Hintergrund gezeichnet, den der aktuelle Pinsel vorgibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 Uhr.

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