![]() |
Transparente Polygone zeichnen
Liste der Anhänge anzeigen (Anzahl: 2)
Hi Zusammen,
In meiner Datenbank befinden sich >10000 Polygone (jedes Polygon kann sich in Color und Style unterscheiden). Alle Polygone möchte ich gerne mit Transparenz (unabhängig von der ausgelesenen Reihenfolge) zeichnen. Aktuell bekomme ich leider nur folgendes Ergebnis Hier werden früh gezeichnete Polygone nur überzeichnet. Anhang 45730 Anhang 45731 Gewünschtes Resultat jedoch: Hat jemand einen Tipp?
Code:
Danke und Grüße
Bitmap.Transparent := True;
Bitmap.TransparentColor := clWhite; ... BitMap.canvas.brush.color := Random BitMap.canvas.brush.style:= Random ... MyCanvas.Canvas.Polygon(polygon); Jacks |
AW: Transparente Polygone zeichnen
|
AW: Transparente Polygone zeichnen
|
AW: Transparente Polygone zeichnen
Zitat:
|
AW: Transparente Polygone zeichnen
Zitat:
Egal wie man sich dreht und wendet: Du brauchst eine Z-Order, wenn du ein immer klar definiertes immer gleiches Ergebnis haben willst. |
AW: Transparente Polygone zeichnen
Hier mal eine alte Routine von mir:
Delphi-Quellcode:
Wahrscheinlich nicht das allerschnellste (Polygone rendern ist sowieso eine Wissenschaft für sich), aber tut seinen Job.
procedure FillPolygonAlpha(Vertices: TVertexList; Dest: TBitmap;
Color: TColor); type TIntegerArray = array of integer; var x,y: integer; i,j: integer; PixelPtr: PColor; BasePixelPtr: PColor; ColorPartR, ColorPartG, ColorPartB, ColorA: Byte; Breakpoints: TIntegerArray; function GetBreakpoints(Row: integer; XOffset: integer): TIntegerArray; var Pt1, Pt2: TPoint; PtOld, PtNew: TPoint; Count: integer; i: integer; procedure QuickSort(var SortList: TIntegerArray; L, R: Integer); var I, J: Integer; P, T: Integer; begin repeat I := L; J := R; P := Sortlist[(L + R) div 2]; repeat while SortList[i] < P do Inc(I); while SortList[j] > P do Dec(J); if I <= J then begin T := SortList[I]; SortList[I] := SortList[J]; SortList[J] := T; Inc(I); Dec(J); end; until I > J; if L < J then QuickSort(SortList, L, J); L := I; until I >= R; end; begin PtOld := Vertices.Last; Count := 0; SetLength(Result, Vertices.Count); for i := 0 to Vertices.Count - 1 do begin PtNew := Vertices[i]; if PtNew.Y > PtOld.Y then begin Pt1 := PtOld; Pt2 := PtNew; end else begin Pt1 := PtNew; Pt2 := PtOld; end; if ((PtNew.Y < Row) = (Row <= PtOld.Y)) and ((XOffset-Pt1.X)*(Pt2.Y-Pt1.Y) < (Pt2.X-Pt1.X)*(Row-Pt1.Y)) then begin Result[Count] := trunc(Pt2.X * (Row-Pt1.y) / (Pt2.Y-Pt1.Y) + Pt1.X * (Pt2.Y-Row) / (Pt2.Y-Pt1.Y)); inc(Count); end; PtOld := PtNew; end; SetLength(Result,Count); if length(Result)>=1 then Quicksort(Result,0,high(Result)); end; begin if Vertices.Count < 3 then exit; Dest.PixelFormat := pf32Bit; ColorA := Color shr 24; ColorPartR := Muldiv(GetRValue(Color), ColorA,255); ColorPartG := Muldiv(GetGValue(Color), ColorA,255); ColorPartB := Muldiv(GetBValue(Color), ColorA,255); for y := EnsureRange(Vertices.BoundingBox.Top, 0, Dest.Height-1) to EnsureRange(Vertices.BoundingBox.Bottom, 0, Dest.Height-1) do begin BasePixelPtr := Dest.ScanLine[y]; x := Vertices.BoundingBox.Left; BreakPoints := GetBreakpoints(y,x-1); i := 0; while i <= high(Breakpoints) do begin PixelPtr := BasePixelPtr; inc(PixelPtr, EnsureRange(Breakpoints[i], 0, Dest.Width-1)); for j := EnsureRange(Breakpoints[i], 0, Dest.Width) to EnsureRange(Breakpoints[i+1], 0, Dest.Width-1) do begin PixelPtr^ := ColorPartR + Muldiv(PixelPtr^ and $00FF0000 shr 16,255-ColorA,255) shl 16 or ColorPartG + Muldiv(PixelPtr^ and $0000FF00 shr 8,255-ColorA,255) shl 8 or ColorPartB + Muldiv(PixelPtr^ and $000000FF,255-ColorA,255); inc(PixelPtr); end; inc(i,2); end; end; end; TVertexList ist so deklariert:
Delphi-Quellcode:
Die Implementierung kann man sich denken. Wenn man keine Klasse dafür verwenden will, kann man die Routine natürlich auch leicht auf
TVertexList = class
public property Items[Index: integer]: TPoint read GetItem write SetItem; default; { ... } property BoundingBox: TRect read FBoundingBox; end;
Delphi-Quellcode:
oder so anpassen, aber dazu bin ich jetzt zu faul. Man müsste aber nur drei, vier Stellen ändern.
array of TPoint
|
AW: Transparente Polygone zeichnen
Vielen Dank,
ich verwende XE2. Habe nun das ganze mit Direct2D umgesetzt. Hätte nun erwartet, wenn ich alle Polygone mit einer Deckkraft von 50% zeichne, bekomme ich mein gewünschtes Ergebnis. Ist leider nicht so! :( :lol: Zitat:
|
AW: Transparente Polygone zeichnen
Was willst du denn genau erreichen? Es kommt halt immer auf die Reihenfolge an in der du zeichnest.
Wenn deine einzige Anforderung ist, dass es immer gleich aussieht kannst du ja notfalls einfach per Datenbank-ID sortieren. Falls das nicht ausreicht musst du wie bereits erwähnt die Z-Werte speichern. |
AW: Transparente Polygone zeichnen
Zitat:
|
AW: Transparente Polygone zeichnen
Zitat:
Werde nun meine Datenbank nach Ebenen sortieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 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