AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Zeichnen auf Canvas und ZOrder bzw. Übermalen
Thema durchsuchen
Ansicht
Themen-Optionen

Zeichnen auf Canvas und ZOrder bzw. Übermalen

Ein Thema von EWeiss · begonnen am 2. Apr 2015 · letzter Beitrag vom 2. Apr 2015
Antwort Antwort
Seite 1 von 3  1 23      
EWeiss
(Gast)

n/a Beiträge
 
#1

Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 03:36
Kennt der Canvas beim zeichnen keine ZOrder?
Jetzt zeichne ich schon auf ein Bitmap und ist immer noch Müll!
Ich zeichne alles in der richtigen Reihenfolge trotzdem sind die Linien über den Kreisen und nicht drunter.

Delphi-Quellcode:
procedure TGraph.Draw;
begin

  Bitmap.Canvas.Font.Color := clblack;
  Bitmap.Canvas.Pen.Width := 1;
  PrepareScale;

  If Physics.D <> 0 then
  begin
    // Linie an der das Pendel (Ball) hängt
    Bitmap.Canvas.Pen.Color := clblack;
    Bitmap.Canvas.MoveTo(xxc(Physics.x0), yyc(Physics.y0));
    Bitmap.Canvas.LineTo(xxc(Physics.x1), yyc(Physics.y1));
  end;

  Bitmap.Canvas.Brush.Style:= bsSolid;
  Bitmap.Canvas.brush.Color := clblack;
  Bitmap.Canvas.Pen.Width := 5;
  // Center Punkt
  DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics.x0), yyc(Physics.y0), round(Physics.r0 * xFact));

  // Ball
  Bitmap.Canvas.brush.Color := clred;
  Bitmap.Canvas.Pen.Width := 2;
  DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics.x1), yyc(Physics.y1), round(Physics.r1 * xFact));

  // vom Bitmap auf das Canvas kopieren
  BitBlt(PaintFrame.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, srccopy);
end;
gruss

Geändert von EWeiss ( 2. Apr 2015 um 05:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Zeichnen auf Canvas und ZOrder

  Alt 2. Apr 2015, 04:18
Nein, natürlich nicht.

Wozu sollte eine 2-dimensionale Zeichenfläche (wie ein Blatt Papier) eine dritte Dimension behandeln?
Und wenn doch, warum dann nicht auch die Vierte, Fünfte und Sechste?

Wer zuletzt malt, der malt zuletzt,
aber hab jetzt keine Ahnung was DrawEllipseFromCenter macht.



Die übermalten Bälle sind nicht zufällig Bälle, die schon vor Aufruf der Draw-Funktion auf dem Bitmap drauf sind?
$2B or not $2B

Geändert von himitsu ( 2. Apr 2015 um 04:22 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 04:43
Zitat:
Die übermalten Bälle sind nicht zufällig Bälle, die schon vor Aufruf der Draw-Funktion auf dem Bitmap drauf sind?
Nö!
Warum sollten Sie?
Und zufällig schon gar nicht.
Wie du im Code ersehen kannst.
DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics.x1), yyc(Physics.y1), round(Physics.r1 * xFact));

Dabei ist es uninteressant was DrawEllipseFromCenter macht.
Wenn ich eine Linie zeichne und anschließend einen Ball, auf dem die Linie zur hälft liegt (Normaler weise dahinter)
Dann sollte die Linie eigentlich nicht sichtbar sein Oder?
Denn schließlich zeichne ich die Linie zuerst.

Bitmap.Canvas.brush.Color := clred;

Ist die Farbe vielleicht Transparent und nicht deckend so das man die Linie noch sieht?
Wobei wie man sehen kann der Style Solid ist
Bitmap.Canvas.Brush.Style:= bsSolid;
Zitat:
Wozu sollte eine 2-dimensionale Zeichenfläche (wie ein Blatt Papier) eine dritte Dimension behandeln?
Zumindest ist ein Strich den ich mit einer anderen satten Farbe übermale nicht mehr sichtbar.

Sieh Bild.
Alle Linien müssten eigentlich unsichtbar sein innerhalb des roten Ball's da dieser zuletzt gezeichnet wird.

gruss

Geändert von EWeiss (11. Jul 2019 um 16:43 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 07:18
Hast du mal Pen.Mode mal eingestellt?
Delphi-Quellcode:
begin
  with canvas do
  begin
    Pen.Width := 5;
    Pen.Mode := pmMergePenNot; //<<<---

    Brush.Color := clRed;
    Brush.Style := bsSolid;

    MoveTo(0, 0);
    LineTo(200, 200);

    Ellipse(0, 0, 200, 200);
  end;
end;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 07:22
Hast du mal Pen.Mode mal eingestellt?
Delphi-Quellcode:
begin
  with canvas do
  begin
    Pen.Width := 5;
    Pen.Mode := pmMergePenNot; //<<<---

    Brush.Color := clRed;
    Brush.Style := bsSolid;

    MoveTo(0, 0);
    LineTo(200, 200);

    Ellipse(0, 0, 200, 200);
  end;
end;
Werde das mal mit dem alten Projekt testen.
Habe es jetzt auf GDI+ umgestellt.

Delphi-Quellcode:
procedure TGraph.Draw;
begin
  PrepareScale;

  graphics := TGPGraphics.Create(Bitmap.Canvas.Handle);
  graphics.SetSmoothingMode(SmoothingModeAntiAlias);

  Pen := TGPPen.Create(MakeColor(255, 0, 0, 0));
  path := TGPGraphicsPath.Create;
  brush := TGPSolidBrush.Create(MakeColor(255, 0, 0, 0));

  // Pendel Linie
  If Physics.D <> 0 then
    graphics.DrawLine(Pen, xxc(Physics.x0), yyc(Physics.y0), xxc(Physics.x1), yyc(Physics.y1));

  // Pendel Center Punkt
  DrawEllipseFromCenter(path, xxc(Physics.x0), yyc(Physics.y0), round(Physics.r0 * xFact));

  graphics.DrawPath(pen, path);
  graphics.FillPath(brush, path);

  // Pendel (Ball)
  path.Reset;
  Pen.SetColor(MakeColor(255, 0, 0, 0));
  brush.SetColor(MakeColor(255, 255, 0, 0));

  DrawEllipseFromCenter(path, xxc(Physics.x1), yyc(Physics.y1), round(Physics.r1 * xFact));

  graphics.DrawPath(pen, path);
  graphics.FillPath(brush, path);

  // vom Bitmap auf das Canvas kopieren
  BitBlt(PaintFrame.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, srccopy);

  Pen.Free;
  path.Free;
  brush.Free;
  graphics.Free;
end;
Damit geht es wie es soll.. Qualität siehe Anhang.
Danke!

gruss

Geändert von EWeiss (11. Jul 2019 um 16:43 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 07:34
Mit

FImage.Canvas.Pen.Mode := pmMergePenNot;
Sehe ich jetzt nicht mehr den Hintergrund (Linie) vom Grauen Kreis.
Aber immer noch die Linie auf dem Ball.

Delphi-Quellcode:
procedure TGraph.Draw;
begin
  FImage.Canvas.Font.Color := clblack;
  FImage.Canvas.Pen.Mode := pmMergePenNot;

  PrepareScale;
  
  // Die Linie ist noch auf dem Ball sichtbar.
  If Physics.D <> 0 then
  begin
    FImage.Canvas.Pen.Color := clblack;
    FImage.Canvas.MoveTo(xxc(Physics.x0), yyc(Physics.y0));
    FImage.Canvas.LineTo(xxc(Physics.x1), yyc(Physics.y1));
  end;

  FImage.Canvas.Brush.Style:= bsSolid;
  FImage.Canvas.brush.Color := clblack;
  FImage.Canvas.Pen.Width := 5;

  DrawEllipseFromCenter(FImage.Canvas, xxc(Physics.x0), yyc(Physics.y0), round(Physics.r0 * xFact));

  FImage.Canvas.brush.Color := clred;
  FImage.Canvas.Pen.Width := 2;
  DrawEllipseFromCenter(FImage.Canvas, xxc(Physics.x1), yyc(Physics.y1), round(Physics.r1 * xFact));

  FImage.Canvas.Pen.Width := 1;

end;
gruss

Geändert von EWeiss (11. Jul 2019 um 16:43 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#7

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 09:36
Dabei ist es uninteressant was DrawEllipseFromCenter macht.
Ja eben nicht.

Wenn ich eine Linie zeichne und anschließend einen Ball, auf dem die Linie zur hälft liegt (Normaler weise dahinter)
Dann sollte die Linie eigentlich nicht sichtbar sein Oder?
Denn schließlich zeichne ich die Linie zuerst.
Den Ball zeichnest Du in DrawEllipseFromCenter und daher könnte dort der Fehler liegen.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 09:45
Zitat:
Den Ball zeichnest Du in DrawEllipseFromCenter und daher könnte dort der Fehler liegen.
Warum bist du da so sicher, wenn ich sage das es uninteressant ist?
Dort wird nur der Mittelpunkt ermittelt und Ellipse(R) ausgeführt nicht mehr.
Alles andere ist in Draw.

Die zeichnen Operationen sind bereits schon in Draw festgelegt bevor ich den Ball Zeichne.

Delphi-Quellcode:
FImage.Canvas.brush.Color := clred;
FImage.Canvas.Pen.Width := 2;
gruss

Geändert von EWeiss ( 2. Apr 2015 um 09:51 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#9

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 10:31
Zitat:
Den Ball zeichnest Du in DrawEllipseFromCenter und daher könnte dort der Fehler liegen.
Warum bist du da so sicher, wenn ich sage das es uninteressant ist?
Dort wird nur der Mittelpunkt ermittelt und Ellipse(R) ausgeführt nicht mehr.
Alles andere ist in Draw.
Ich bin mir ja nicht sicher, deshalb steht dort auch "könnte".

Da in der Draw keine Kreise gezeichnet werden, müssen diese ja in "DrawEllipseFromCenter" gezeichnet werden.
Und da Du uns diese verheimlichst können wir auch nicht sehen, was darin oder was nicht passiert.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 11:04
Zitat:
Und da Du uns diese verheimlichst können wir auch nicht sehen, was darin oder was nicht passiert.
Wie oft muss ich jetzt noch darauf rumreiten.
Wenn ich sage es ist uninteressant das ist das so.. und fertig.

Wie lange wollen wir jetzt darüber debattieren.
Es steht in keinen Bezug zu meinem Problem.
Wenn ich eine Linie zeichne und einen Kreis darüber lege sollte die Linie überdeckt werden.

Geht wohl nicht mit Boardmitteln daher bin ich auf GDI+ ausgewichen.
Hat sich also erledigt.

gruss

Geändert von EWeiss ( 2. Apr 2015 um 11:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:09 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