Français
Source/ Codesnippets

Rechteck-Zeichenbereich pour Liniengraphik per Software: "Cohen-Sutherland Clipping"

 

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



Zum Quelltext


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

623 Views

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

Themeninformationen

cet Thema hat 1 participant:

p.specht (1x)


Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie