| |
|
|
p.specht
| Graue Haare entstanden chez qui Umsetzung aus C++: Im Demoprogramm volonté qui Endpunkte qui Linien im Hauptteil jeweils via Zufallsgenerator défini. Liegen cet Punkte mais oui c'est ca sur- ou bien nebeneinander (ou bien lediglich 1 pixel Unterschied), wurde dans qui Innenschleife qui Abbruchbedingung ("Geclippte ligne number liegt eh bien komplett im innern des Sichtfenster-Rechtecks") nie plus erreicht. cela C++ Vorbild lieferte chez qui Division de deux Integervariablen nämlich automatisch une Integer-Wert zurück. XProfan-11.2a free versucht chez Verwendung qui herkömmlichen Division mais, oui c'est ca trop son et liefert une Floatwert - qui Ursache pour cela merkwürdige Fehlerverhalten. Pour Ersatz des / Operators par qui veraltete Funktion @div&(a&,b&) bzw. par cela \ - Integerdivisionszeichen funktioniert eh bien alles. intéressant wäre une Beschleunigung mittels Inline-Assemblercode. So bleibt es seulement une Demo. Gruss
P.S.: il y a mittlerweile viel schnellere, hardwareunterstützte procéder, qui sog. "Saturation-Arithmetik"!
' Cohen-Sutherland Clipping Demo
' aucun la responsabilité, Verwendung sur eigene péril!
' P. Specht 2011-01 pour Paule´s PC Forum
' Anmerkung: il y a inzwischen bereits viel schnellere Algorithmen!
Def %CLIPLEFT 1' Binär 0001
Def %CLIPRIGHT 2' 0010
Def %CLIPLOWER 4' 0100
Def %CLIPUPPER 8' 1000
Def %TRUE 1
Def %FALSE 0
Proc ClipLine
var K1%=0
var K2%=0
declare dx&,dy&
dx&=x2&-x1&
dy&=y2&-y1&
y1test
y2test
' Boucle pour Cohen/Sutherland, qui maximum 2 fois par wird
tandis que K1% OU K2%
rtn% = %TRUE
si K1% & K2% : rtn% = %FALSE : BREAK : endif
si K1%
si K1% & %CLIPLEFT
y1& = y1& + (XMin&-x1&)*dy&\dx&
x1& = XMin&
elseif K1% & %CLIPRIGHT
y1& = y1& + (XMax&-x1&)*dy&\dx&
x1& = XMax&
endif
si K1% & %CLIPLOWER
x1& = x1& + (YMin&-y1&)*dx&\dy&
y1& = YMin&
elseif K1% & %CLIPUPPER
x1& = x1& + (YMax&-y1&)*dx&\dy&
y1& = YMax&
endif
K1% = 0
y1test
endif
si K1% & K2% : rtn% = %FALSE : BREAK : endif
si K2%
si K2% & %CLIPLEFT
y2& = y2& + (XMin&-x2&)*dy&\dx&
x2& = XMin&
elseif K2% & %CLIPRIGHT
y2& = y2& + (XMax&-x2&)*dy&\dx&
x2& = XMax&
endif
si K2% & %CLIPLOWER
x2& = x2& + (YMin&-y2&)*dx&\dy&
y2& = YMin&
elseif K2% & %CLIPUPPER
x2& = x2& + (YMax&-y2&)*dx&\dy&
y2& = YMax&
endif
K2% = 0
y2test
endif
Endwhile
return rtn%
ENDPROC
proc y1test
si y1&<YMin&
K1% = %CLIPLOWER
elseif y1& > YMax&
K1% = %CLIPUPPER
endif
si x1& < XMin&
K1% = K1% | %CLIPLEFT
elseif x1&>XMax&
K1% = K1% | %CLIPRIGHT
endif
endproc
proc y2test
si y2&<YMin&
K2% = %CLIPLOWER
elseif y2&>YMax&
K2% = %CLIPUPPER
endif
si x2&<XMin&
K2% = K2% | %CLIPLEFT
elseif (x2&>XMax&)
K2% = K2% | %CLIPRIGHT
endif
endproc
'INIT
Déclarer XMax&,YMax&,XMin&,YMin&,rtn%
Déclarer x1&,y1&,x2&,y2&,colo&
RANDOMIZE
Titre de la fenêtre "Cohen/Sutherland Clipping Demo"
Fenêtre Style 4 | 8 | 16
'MAIN
WHILE 1
XMin& = Tour(300)
YMin& = Tour(200)
XMax& = XMin& + Tour(500)
YMax& = YMin& + Tour(250)
CLS
colo&=rgb(rnd(256),rnd(256),rnd(256))
USEP 0,3,colo&
rectangle XMin&,YMin& - XMax&,YMax&
'imprimer XMin&,YMin&,XMax&,YMax&
WhileLoop 1000
x1& = rnd(Width( %HWnd))
y1& = rnd(Height(%Hwnd))
x2& = rnd(Width( %HWnd))
y2& = rnd(Height(%Hwnd))
colo&=rgb(rnd(256),rnd(256),rnd(256))
USEP 3,1,colo&
Line x1&,y1& - x2&,y2&
si ClipLine()
USEP 0,3,colo&
Line x1&,y1& - x2&,y2&
endif
Endwhile
ENDWHILE
FIN
|
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 11.04.2021 ▲ |
|
|
|