Autor |
Beitrag |
AXMD
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Sa 05.03.05 14:04
Moin moin !
Irgendwie sind mir meine Zeigerdiagramme noch zu pixelig - und unschön flackern tun sie auch, wenn sie neu gezeichnet werden. Obwohl DoubleBuffering des Panels auf dem die PaintBox liegt beim Start auf true gestellt wird. Wär nett, wenn mir jemand sagen könnte wie ich das Flackern wegbekomme .
Außerdem wär sowas wie leichtes Antialiasing nicht schlecht. Hab bereits im Forum gesucht, aber nur einen Link zu einem Code aus dem SDC von Horst Kniebusch gefunden, der extrem langsam ist. Jemand eine bessere Idee für's Antialising? Muss nicht weiß Gott wie aufwendig sein, soll nur nicht ganz so pixelig aussehen.
Thx
AXMD
|
|
Lossy eX
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Sa 05.03.05 15:10
Also ich benutze für DoubleBuffering immer ein - zwie zusätzliches Bitmaps und unterdrücke die WM_ERASEBKGND. Damit habe ich bisher noch nie Probleme gehabt.
Und zum Thema Antialising. Also je nachdem würde dir da wohl empfehlen auf OpenGL umzusteigen. Das hat dann noch den Vorteil, dass es auch Hardwarebeschleunigt ist. Kann aber sein, dass du zu viel von Hand zeichnen musst. Dann isses natürlich eher nachteilig als vorteilhaft. Anderfalls meine ich, das die Graphics32 / G32 Komponenten so etwas können. Weiß es aber nicht 100%tig.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
matze.de
Beiträge: 576
Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
|
Verfasst: Sa 05.03.05 16:40
guck mal hier bei den schweizern: Antialising
mfg matze
_________________ si tacuisses, philosophus mansisses.
|
|
AXMD
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Sa 05.03.05 18:48
Bei den Schweizern hab ich schon geschaut. Daher hatte ich ja die langsame Routine
AXMD
|
|
retnyg
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Sa 05.03.05 18:55
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
delfiphan
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 06.03.05 03:11
Linien zeichnen mit Kantenglättung, sowas hab ich mal gemacht. Ist mit Pixels[X,Y] programmiert, also sofern nicht top Performance gefragt ist wirds reichen Für deine Zeiger reicht es alle male.
Wenn du die Prozedur willst, werd ich sie posten.
|
|
AXMD
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 06.03.05 10:35
delfiphan hat folgendes geschrieben: | Linien zeichnen mit Kantenglättung, sowas hab ich mal gemacht. Ist mit Pixels[X,Y] programmiert, also sofern nicht top Performance gefragt ist wirds reichen Für deine Zeiger reicht es alle male.
Wenn du die Prozedur willst, werd ich sie posten. |
Ja bitte . Sieht nämlich ganz schön hässlich aus, wenn überall solche Zacken rausstehen
AXMD
|
|
delfiphan
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 06.03.05 11:58
Okidoki, OpenGl ist sicher einiges schneller, aber hier ist sie:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88:
| procedure SLineTo(Canvas : TCanvas; X2,Y2 : Integer); Var dx, dy, X, Y, E, R, L, dT, dB, X1, Y1 : Integer; MainColor : TColor; S : Boolean; procedure Swap(var A, B : Integer); Var T : Integer; begin T := A; A := B; B := T; end; function Blend(const Color : TColor; I : Integer) : TColor; Type RGB = record R, G, B, A : byte; end; begin RGB(Result).R := (RGB(MainColor).R*I+RGB(Color).R*(2*L-I)) div 2 div L; RGB(Result).G := (RGB(MainColor).G*I+RGB(Color).G*(2*L-I)) div 2 div L; RGB(Result).B := (RGB(MainColor).B*I+RGB(Color).B*(2*L-I)) div 2 div L; RGB(Result).A := 0; end; begin with Canvas do begin X1 := PenPos.X; Y1 := PenPos.Y; dx := X2 - X1; dy := Y2 - Y1; if (dx=0) or (dy=0) then begin LineTo(X2,Y2); exit; end; MoveTo(X2,Y2); if abs(dy) > abs(dx) then begin Swap(dx,dy); Swap(X1,Y1); Swap(X2,Y2); S := True; end else S := False; if dx < 0 then begin Swap(X1,X2); Swap(Y1,Y2); dx := -dx; dy := -dy; end; if dy < 0 then begin R := -1; dy := -dy; end else R := 1; Y := Y1; E := 0; L := Round(Sqrt(dx*dx+dy*dy)); MainColor := Pen.Color; For X := X1 to X2 do begin dT := L-2*E; dB := L+2*E; if dT > L then begin if S then Pixels[Y-R,X] := Blend(Pixels[Y-R,X],dT-L) else Pixels[X,Y-R] := Blend(Pixels[X,Y-R],dT-L); dT := L; end; if dB > L then begin if S then Pixels[Y+R,X] := Blend(Pixels[Y+R,X],dB-L) else Pixels[X,Y+R] := Blend(Pixels[X,Y+R],dB-L); dB := L; end; if (dT >= 0) and (dB >= 0) then if S then Pixels[Y,X] := Blend(Pixels[Y,X],dT+dB) else Pixels[X,Y] := Blend(Pixels[X,Y],dT+dB); inc(E, dy); if E*2 >= dx then begin Y := Y + R; dec(E, dx); end; end; end; end; |
|
|
AXMD
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 06.03.05 12:05
Danke dir vielmals ! Sieht schon super aus
AXMD
|
|
wdbee
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: So 06.03.05 12:12
AXMD hat folgendes geschrieben: | Moin moin !
- und unschön flackern tun sie auch |
Schau mal in der Delphihilfe zu TControl.ControlStyle: csOpaque.
Wenn das Steuerelement die ganze Zeichenfläche überdeckt, werden unnötige Hintergrund-Zeichnenbefehle wohl unterdrückt. Vieleicht reicht das ja schon.
|
|
AXMD
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 06.03.05 12:18
Ich glaub heute ist nicht mein Tag
Delphi-Quelltext 1:
| PaintBox1.ControlStyle := csOpaque; |
ergibt
Zitat: | [Fehler] cmpxmain.pas(772): Inkompatible Typen: 'TControlStyle' und 'Enumeration' |
AXMD
|
|
delfiphan
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 06.03.05 12:23
|
|
AXMD
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 06.03.05 12:30
|
|
AXMD
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 06.03.05 13:37
Hat vielleicht irgendjemand eine Routine, die Ellipsen glättet? Die Linien funktionieren dank delfiphans Routine super. Das Flckerproblem wurde auch behoben - nur die geglättete Ellipse wär noch das Tüpfelchen auf dem i
AXMD
|
|
delfiphan
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 06.03.05 14:26
So, hab dir was ähnliches wie Canvas.Ellipse mit Kantenglättung per PM geschickt. Also das ganze funktioniert mehr oder weniger per Brute-Force, deswegen getrau ich mich fast nicht den Code hier zu posten
|
|
retnyg
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: So 06.03.05 14:31
brute-force ist immer gut
die gemeinde wartet auf deinen code, delfiphan...
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
delfiphan
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 06.03.05 14:48
Grml... Okay hmmm, aber ich weise explizit darauf hin, dass diese Prozedur in keiner Weise schnell ist! Ich hab das nu mal kurz auf die Beine gestellt, und mit Brute-Force programmiert, da die Geschwindigkeit nebensächlich ist.
Zur Anwendung: SEllipse(Canvas, MittelpunktX, MittelPunktY, RadiusX, RadiusY);
Die Prozedur ist also nicht gleich in der Anwendung wie Canvas.Ellipse(left,top,right,bottom)!
Flache Ellipsen (0 Pixel) können damit nicht gezeichnet werden, dann gibt es eine Division durch Null.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| Procedure SEllipse(Canvas: TCanvas; CX, CY, RX, RY : Integer); Const SuperSample = 16; Var X, Y : Integer; SX, SY : Integer; L : Integer; MainColor : TColor; function Blend(const Color : TColor; E : Extended) : TColor; Type RGB = record R, G, B, A : byte; end; begin RGB(Result).R := Trunc(RGB(MainColor).R*E+RGB(Color).R*(1-E)); RGB(Result).G := Trunc(RGB(MainColor).G*E+RGB(Color).G*(1-E)); RGB(Result).B := Trunc(RGB(MainColor).B*E+RGB(Color).B*(1-E)); RGB(Result).A := 0; end; begin with Canvas do begin MainColor := Pen.Color; For X := 0 to RX+1 do For Y := 0 to RY+1 do begin L := 0; if ((RX<=2) or (RY<=2)) or ((X*X/Sqr(RX-2)+Y*Y/Sqr(RY-2)>=1) and (X*X/Sqr(RX+2)+Y*Y/Sqr(RY+2)<=1)) then begin For SX := 0 to SuperSample-1 do For SY := 0 to SuperSample-1 do begin if (Sqr(X+SX/SuperSample)/Sqr(RX-0)+Sqr(Y+SY/SuperSample)/Sqr(RY-0)>1) and (Sqr(X+SY/SuperSample)/Sqr(RX+1)+Sqr(Y+SY/SuperSample)/Sqr(RY+1)<1) then inc(L); end; Pixels[CX+X,CY+Y] := Blend(Pixels[CX+X,CY+Y], L/SuperSample/SuperSample); Pixels[CX+X,CY-Y] := Blend(Pixels[CX+X,CY-Y], L/SuperSample/SuperSample); Pixels[CX-X,CY+Y] := Blend(Pixels[CX-X,CY+Y], L/SuperSample/SuperSample); Pixels[CX-X,CY-Y] := Blend(Pixels[CX-X,CY-Y], L/SuperSample/SuperSample); end; end; end; end; |
//Edit: kleiner Bugfix...
Zuletzt bearbeitet von delfiphan am So 06.03.05 14:59, insgesamt 1-mal bearbeitet
|
|
AXMD
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 06.03.05 14:50
Gut, ich habs jetzt eingebaut . Sieht super aus.
Danke nochmal
AXMD
|
|
torud
Hält's aus hier
Beiträge: 4
|
Verfasst: Do 06.09.07 12:14
Titel: Ich würde dazu gern wissen
wie ich denn noch die Pen.Width mit übergeben kann, denn ich benötige Linien, die breiter als 1 Pixel sind. Ich habe schon versucht die PixelBreite vorher im Canvas zu setzen, aber das half auch nichts. Könnte man die procedure nochmals dahingehend anpassen, dass die gleich von der vorher eingestellten Canvas.Pen.Width übernommen wird?
Das wäre echt Klasse...
Danke Tom
|
|
delfiphan
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Di 11.09.07 22:25
Für Kantenglättung: Schau dir GdiPlus an.
|
|
|