Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Canvas - gleichschenkliches gefülltes Dreieck (https://www.delphipraxis.net/185320-canvas-gleichschenkliches-gefuelltes-dreieck.html)

stahli 30. Mai 2015 23:40

AW: Canvas - gleichschenkliches gefülltes Dreieck
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, das ist schon klar. Dass der Canvas Pixel darstellt ist ja bekannt.

Ich hätte mir gewünscht, dass das Dreieck so aussieht, wie im Anhang.
Das wäre ja auch nicht unlogisch.

Ok, dann muss man das vermutlich explizit als Anforderung berücksichtigen.


@himitsu

Dein Beispiel sieht gut aus. Aber größere Dreiecke können auch besser dargestellt werden.

Popov 31. Mai 2015 00:22

AW: Canvas - gleichschenkliches gefülltes Dreieck
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von stahli (Beitrag 1303673)
Ja, das ist schon klar. Dass der Canvas Pixel darstellt ist ja bekannt.

Das ist das was du verstanden hast? Hm, wo waren Pixel das Thema? Das mit dem Pinsel hast du aber verstanden?

Hier noch mal was ich meinte. Dieses Dreieck (siehe Anhang) besteht aus zwei übereignender liegenden Dreiecken. Beide haben die gleichen Koordinate, nur hat das eine einen Pinsel der Breit 4 Pixel, das andere einen Pinsel der Breite 1 Pixel.

Sie sind nicht symmetrisch, obwohl die Koordinate identisch sind. Also wenn du verstanden hast, dass ich dir sagen wollte, dass Canvas Pixel darstellen kann, dann weiß ich was du verstanden hast.


//Edit:
Andere Grafik eingefügt. Sie zeigt besser was ich meine.

himitsu 31. Mai 2015 00:25

AW: Canvas - gleichschenkliches gefülltes Dreieck
 
Nichtmal "austricksen" lässt sich die Zeichenroutine. :stupid:
Delphi-Quellcode:
  Canvas.MoveTo(A[0].X, A[0].Y);
  Canvas.LineTo(A[1].X, A[1].Y);
  Canvas.LineTo(A[2].X, A[2].Y);

  Canvas.MoveTo(A[0].X, A[0].Y);
  Canvas.LineTo(A[2].X, A[2].Y);
Da bleibt dann wohl nur selber malen. (Pixel für Pixel)

Luckie 31. Mai 2015 00:39

AW: Canvas - gleichschenkliches gefülltes Dreieck
 
Oder um es mal laienhaft auszudrücken: Bei eine schrägen Linie mit der Stärke ein Pixel springen die Pixel eben etwas hin und her. Bei einer längeren und oder breiteren Linie fällt es nicht so stark auf, wenn man nicht gerade mit der Nase vorm Bildschirm hängt. Um den Effekt etwas abzuschwächen gibt es die Kantenglättung oder Antialiasing. Das funktioniert aber nur wenn die Linie entsprechen breit ist. Bei der Stärke von einem Pixel kann die Kantenglättung auch nichts mehr reißen.

Aber die Grafik ist doch nur 5x5 Pixel groß. Da kann man doch die Pixel einzeln setzen. Wenn du mehrere Grafiken zeichnen willst, dann hinterleg sie als "Zeichenvorschrift" in einer entsprechenden Datenstruktur. Oder binde entsprechende Bitmaps als Ressource ein.

Popov 31. Mai 2015 01:09

AW: Canvas - gleichschenkliches gefülltes Dreieck
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal gezeichnet:

stahli 31. Mai 2015 10:05

AW: Canvas - gleichschenkliches gefülltes Dreieck
 
Ich danke Euch.

Die Pinselstärke habe ich mal gedanklich ausgenommen, da die hier nicht relevant ist.

Letztlich gibt es Algorithmen für Linien, die ein Pixel (das rechnerisch bei 3,5 liegen würde) auf 3 oder auf 4 setzen.
Das ist logisch.

Dass es mir als Betrachter lieber wäre das untere auf 3 und das obere auf 4 zu setzen, kann die Polygon-Funktion ja nicht wissen.

Dazu müsste ich eben eine GleichschenklichesDreieck-Funktion schreiben oder benutzen (oder fixe Bitmaps oder Pfade).

Insofern schließe ich mich hier Luckie komplett an.


Ich war nur zunächst von dem etwas unschönen Ergebnis überrascht und dachte, ich müsste vielleicht noch einen bestimmten Endpunkt festlegen oder so. Oder dass ein anderer Fehler vorlag.

Jetzt sehe ich, dass "mein spezielles" Wunschpolygon mit der Standardfunktion so nicht zu erreichen ist.
Also lasse ich es so oder entscheide mich irgendwann für eine genauere Lösung.

himitsu 31. Mai 2015 11:18

AW: Canvas - gleichschenkliches gefülltes Dreieck
 
Der Algo müsste praktisch einen Mittelpunkt berechnen und von diesem Punkt aus gesehn alle Punkte eher aufrunden, als abzurunden. (mit Bankers-Round würde das ganze noch unvorhersehbarer und sieht gleich anders aus, nur weil man das Bild um 1-2 Pixel verschiebt)

Popov 31. Mai 2015 11:31

AW: Canvas - gleichschenkliches gefülltes Dreieck
 
Zitat:

Zitat von stahli (Beitrag 1303696)
Die Pinselstärke habe ich mal gedanklich ausgenommen, da die hier nicht relevant ist.

Indirekt schon. Das ist eigentlich das was ich versuche die ganze Zeit rüberzubringen. Wäre LineTo eine Funktion die immer eine 1-Pixel breite Linie zeichnet, wäre die Interne Berechnung der Line evtl. anders. Vermutlich würde man dann einer anderen Berechnungslogik folgen und schräge Linien wären symmetrisch. Aber LineTo ist eine Funktion die immer mit einem Pinsel der Stärke X zeichnet, bei der die Breite 1-Pixel nur der kleinste Wert ist.

Dejan Vu 1. Jun 2015 07:06

AW: Canvas - gleichschenkliches gefülltes Dreieck
 
Mit dem Bresenham-Algorithmus wäre das vermutlich nicht passiert. Der wird aber wohl nicht angewandt, weil es schnellere Algorithmen gibt, aber sicher bin ich mir hier nicht. Die Vorgehensweise bei dem Algorithmus ist jedenfalls so, das alle Linien zunächst auf den Bereich (x>0, y>0, Steigung < 1) normalisiert werden und dadurch eigentlich gleiche Linien herauskommen müssten.

http://de.wikipedia.org/wiki/Bresenham-Algorithmus

Grundsätzlich ist es ja so:
Um eine Linie von (0,0) nach (1,2) zu zeichnen kann man so vorgehen
(0,0)-(1,1)-(1,2): Erst schräg nach oben dann nach rechts
(0,0)-(0,1)-(1,2): Erst nach rechts, dann nach schräg oben

Beide Pfade sind komplett gleichwertig. Wenn ein Algorithmus nun für eine Linie (0,0)-(1,2) die Variante #1 wählt, aber von (1,2)-(0,0) die Variante #2 hätte man schon eine Asymmetrie.

Nicht umsonst ist das Rendern von Fonts im Pixelbereich so schwer und gelingt kaum so, das die Buchstaben dann noch symmetrisch sind. Es geht halbwegs, aber dazu sind die einzelnen Buchstaben mit so.g. 'Hints' versehen, die dem Renderer z.B. sagen, das bei dem Dreicke die linke und rechte Schräge Linie symmetrisch sein sollen, und dann kann er das entsprechend rendern.

Ob intern in der Canvas-Paint.Methode mit Nachkommastellen gearbeitet wird, wage ich zu bezweifeln.

stahli 1. Jun 2015 08:16

AW: Canvas - gleichschenkliches gefülltes Dreieck
 
Danke. Das klingt plausibel und ist (auch für mich) verständlich. :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 Uhr.
Seite 2 von 2     12   

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