| |
|
|
p.specht
| Graue Haare entstanden en Umsetzung de C++: Im Demoprogramm voluntad el Endpunkte el Linien en el Hauptteil jeweils via Zufallsgenerator definiert. Liegen esta Punkte aber genau encima- oder nebeneinander (oder lediglich 1 pixel Diferencia), wurde en el Innenschleife el Abbruchbedingung ("Geclippte Linie liegt nun komplett en el innern des Sichtfenster-Rechtecks") nie mehr erreicht. Das C++ Vorbild lieferte en Division de zwei Integervariablen nämlich automáticamente una Integer-Valor zurück. XProfan-11.2a free intenta en Verwendung el herkömmlichen Division aber, genau a ser y liefert una Floatwert - el Ursache para el merkwürdige Fehlerverhalten. Nach Ersatz des / Operators por el veraltete Función @div&(a&,b&) o. por el \ - Integerdivisionszeichen funktioniert nun alles. Interessant wäre una Beschleunigung mittels Inline-Assemblercode. So restos lo sólo una Demo. Gruss
P.S.: Lo son mittlerweile viel schnellere, hardwareunterstützte Verfahren, el sog. "Saturation-Arithmetik"!
' Cohen-Sutherland Clipping Demo
' Keine Haftung, Verwendung en propio Gefahr!
' P. Pájaro carpintero 2011-01 para Paule´s PC Foro
' Anmerkung: Lo son inzwischen ya 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
declarar dx&,dy&
dx&=x2&-x1&
dy&=y2&-y1&
y1test
y2test
' Bucle después de Cohen/Sutherland, el máximo 2 veces durchlaufen se
mientras que K1% O K2%
rtn% = %TRUE
if K1% & K2% : rtn% = %FALSE : BREAK : endif
if K1%
if K1% & %CLIPLEFT
y1& = y1& + (XMin&-x1&)*dy&\dx&
x1& = XMin&
elseif K1% & %CLIPRIGHT
y1& = y1& + (XMax&-x1&)*dy&\dx&
x1& = XMax&
endif
if 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
if K1% & K2% : rtn% = %FALSE : BREAK : endif
if K2%
if K2% & %CLIPLEFT
y2& = y2& + (XMin&-x2&)*dy&\dx&
x2& = XMin&
elseif K2% & %CLIPRIGHT
y2& = y2& + (XMax&-x2&)*dy&\dx&
x2& = XMax&
endif
if 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
volver rtn%
ENDPROC
proc y1test
if y1&<YMin&
K1% = %CLIPLOWER
elseif y1& > YMax&
K1% = %CLIPUPPER
endif
if x1& < XMin&
K1% = K1% | %CLIPLEFT
elseif x1&>XMax&
K1% = K1% | %CLIPRIGHT
endif
ENDPROC
proc y2test
if y2&<YMin&
K2% = %CLIPLOWER
elseif y2&>YMax&
K2% = %CLIPUPPER
endif
if x2&<XMin&
K2% = K2% | %CLIPLEFT
elseif (x2&>XMax&)
K2% = K2% | %CLIPRIGHT
endif
ENDPROC
'INIT
Declarar XMax&,YMax&,XMin&,YMin&,rtn%
Declarar x1&,y1&,x2&,y2&,colo&
RANDOMIZE
Título de la ventana "Cohen/Sutherland Clipping Demo"
Ventana de Estilo 4 | 8 | 16
'MAIN
WHILE 1
XMin& = Rnd(300)
YMin& = Rnd(200)
XMax& = XMin& + Rnd(500)
YMax& = YMin& + Rnd(250)
CLS
colo&=rgb(rnd(256),rnd(256),rnd(256))
USEP 0,3,colo&
rectangle XMin&,YMin& - XMax&,YMax&
'imprimir 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&
if 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 ▲ |
|
|
|