AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Canvas - gleichschenkliches gefülltes Dreieck
Thema durchsuchen
Ansicht
Themen-Optionen

Canvas - gleichschenkliches gefülltes Dreieck

Ein Thema von stahli · begonnen am 30. Mai 2015 · letzter Beitrag vom 1. Jun 2015
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Canvas - gleichschenkliches gefülltes Dreieck

  Alt 30. Mai 2015, 20:12
Ja das ist schon richtig.
Man könnte aber die rechte Linie genau so runden wie die linke (also spiegeln).

Natürlich weiß die Polygon-Funktion nicht, dass man das als Betrachter als sinnvoll erachten würde.

Vielleicht wird eine Linie links+unten nach rechts+oben auch generell anders auf- und abgerundet als in der anderen Richtung.


Also ich kann akzeptieren wenn man sagt, "die Standard-Polygon-Funktion kann diesen Sonderfall nicht explizit behandeln", auch wenn das zu einem besseren Ergebnis führen würde.
So wird es wohl liegen...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#2

AW: Canvas - gleichschenkliches gefülltes Dreieck

  Alt 30. Mai 2015, 20:18
Du kannst ja mal mit dieser Procedure rumspielen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Canvas - gleichschenkliches gefülltes Dreieck

  Alt 30. Mai 2015, 21:26
Bei LineTo fehlt ja auch das letzte Pixel, aber ich hätte gedacht, daß somit nur beim letzen Punkt einer PolyLine das selbe Problem auftritt und es sich bei einem Polygon aufhebt, da dort der letzte Punkt eh dort ist, wo sich schon der erste Punkt hingemalt hatte.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Canvas - gleichschenkliches gefülltes Dreieck

  Alt 30. Mai 2015, 21:44
Hallo, dein Dreieck ist vollkommen korrekt, auch wenn es nicht so aussieht.
Wenn man sich nur mal die Endpunkte noch mit einzeichnet, dann fällt es bestimmt besser auf, daß es wirklich stimmt.

Delphi-Quellcode:
procedure TForm5.FormPaint(Sender: TObject);
var
  X, Y, S, I, J, K: Integer;
  A: array[0..2] of TPoint;
begin
  X := 20;
  Y := 20;
  S := 3;

  A[0] := Point(X - S, Y - S);
  A[1] := Point(X + S, Y - S);
  A[2] := Point(X, Y + S {+ 1});

  for I := Low(A) to High(A) do
    for J := -1 to +1 do
      for K := -1 to +1 do
        Canvas.Pixels[A[I].X + J, A[I].Y + K] := clRed;

  Canvas.Pen.Color := clBlue;
  Canvas.Polygon(A);
end;
Die Zeichenfunktion der rechten Linie ist natürlich andersrum. (von oben nach unten ... von unten nach oben)
Links von oben aus jeweils Zwei runter und dann Eines nach rechts.
Und Rechts jeweils Zwei nach oben und Eines nach rechts.

Passt also ganz genau dazu, wie du es auch zeichnen wolltest.
Bei einer geraden Anzahl (siehe Auskommentiertes) passt es wohl besser zusammen, für diesen Fall der 2:1-Steigung = 2x.
Angehängte Grafiken
Dateityp: png Unbenannt.png (528 Bytes, 3x aufgerufen)
Dateityp: png Unbenannt1.png (638 Bytes, 3x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (30. Mai 2015 um 22:00 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: Canvas - gleichschenkliches gefülltes Dreieck

  Alt 30. Mai 2015, 23:18
@stahli

Zu dem Problem. Das liegt in dem Verständnis was eine Canvas-Linie ist. Um die zu verstehen muss man ein Schritt zurück treten. Denkt man nicht darüber nach was eine Canvas-Linie eigentlich ist, denkt man vorschnell, dass es eine mit einem 1-Pixel gezeichnete Linie ist, von Punkt A nach Punkt B. Ist sie aber nicht.

Im Grunde ist es eine mit einem Pinsel der Stärke x-Pixel gezeichnete Linie. Und Pinsel der Breite x ist immer in der Form berechnet. Intern mit Nachkommastellen. Guck was Perlsau oben über den Kreis geschrieben hat. Jeder Pixel ist im Grunde ein berechneter Kreis. Der kleinste Kreis ist ein Pixel breit. Er sieht quadratisch aus, ist aber ein berechneter Kreis. D. h. am Anfang und Ende eine Linie, selbst wenn sie ein Pixel breit ist, ist ein Halbkreis. Ist der Pinsel 1-Pixel breit, sieht der Halbkreis wie ein Quadrat aus, ist aber ein Halbkreis.

Und nun muss man einen Schritt zurück treten und sich angucken was das alles ist. So rechteckig das für uns auch aussieht, es ist alles mit Nachkommastellen berechnet. Du hast von Punkt A nach Punkt B 5-Pixel weit gezeichnet. Intern kann die Position B aber ein Wert mit Dezimalstellen sein.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Canvas - gleichschenkliches gefülltes Dreieck

  Alt 30. Mai 2015, 23:40
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.
Angehängte Grafiken
Dateityp: png dreieck2.png (596 Bytes, 59x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Canvas - gleichschenkliches gefülltes Dreieck

  Alt 31. Mai 2015, 00:22
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.
Angehängte Grafiken
Dateityp: png Dreieck_4px_und_1px_B.PNG (2,8 KB, 10x aufgerufen)

Geändert von Popov (31. Mai 2015 um 00:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Canvas - gleichschenkliches gefülltes Dreieck

  Alt 31. Mai 2015, 00:25
Nichtmal "austricksen" lässt sich die Zeichenroutine.
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)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Canvas - gleichschenkliches gefülltes Dreieck

  Alt 31. Mai 2015, 00:39
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 07:03 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