Español
Fuente/ Codesnippets

Rechteck-Zeichenbereich para Liniengraphik por Software: "Cohen-Sutherland Clipping"

 

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 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
11.04.2021  
 



Zum Quelltext


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

620 Views

Untitledvor 0 min.
p.specht24.11.2021
N.Art23.07.2021
Glubbfan19.06.2021
Uwe ''Pascal'' Niemeier13.06.2021
Más...

Themeninformationen

Dieses Thema ha 1 subscriber:

p.specht (1x)


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie