AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MoveTo/LineTo

Ein Thema von brechi · begonnen am 8. Apr 2015 · letzter Beitrag vom 8. Apr 2015
Antwort Antwort
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#1

MoveTo/LineTo

  Alt 8. Apr 2015, 10:55
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: MoveTo/LineTo

  Alt 8. Apr 2015, 11:05
Ja, das ist schon immer so.

Tipp:
Delphi-Referenz durchsuchenTCanvas.LineTo
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.

> TPaintBox und/oder OnPaint
$2B or not $2B

Geändert von himitsu ( 8. Apr 2015 um 11:11 Uhr)
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#3

AW: MoveTo/LineTo

  Alt 8. Apr 2015, 11:08
Du hast meine Frage nicht verstanden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: MoveTo/LineTo

  Alt 8. Apr 2015, 11:12
Beim zweiten Lesen schon.

Aber nicht nochmal hochschauen. Hatte es zwischenzeitlich heimlich geädert.
$2B or not $2B
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#5

AW: MoveTo/LineTo

  Alt 8. Apr 2015, 11:19
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: MoveTo/LineTo

  Alt 8. Apr 2015, 11:23
Ein Polygon kann man als viele LineTo betrachten.
Da wäre es natürlich "sinnlos", wenn die Verbindungspunkte doppelt gezeichnet würden.


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).
$2B or not $2B
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#7

AW: MoveTo/LineTo

  Alt 8. Apr 2015, 11:31
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);

Geändert von brechi ( 8. Apr 2015 um 11:38 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#8

AW: MoveTo/LineTo

  Alt 8. Apr 2015, 12:57
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.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: MoveTo/LineTo

  Alt 8. Apr 2015, 13:34
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.

Geändert von Bjoerk ( 8. Apr 2015 um 16:00 Uhr) Grund: Edit
  Mit Zitat antworten Zitat
Antwort Antwort


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:19 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