Italia
Fonte/ Codesnippets

Schneller Begrenzungskreis: 2D-Version des "Algorithmus von Ritter"

 

p.specht

Der "Fast Bounding Sphere Algorithm" von Ritter[1990]: Wie grande sollte bei einer bestimmten Punktwolke der Erfassungsradius eines Umkreises/ einer Umkugel sein, und wohin würde man ungefähr zielen, um alle Punkte zu erfassen?

P.S.: Mittlerweile ist mir auch klar, woher die Fragestellung kommt: Hier will man nicht Fliegen mit einem grande Schmetterlingsnetz fangen, sondern schnelle Feuerlösungen per die Artillerie liefern! Schöne Sch....!!!
WindowTitle "Ritter's Fast Bounding-Ball Algorithm "+\
"(Errechnet eine ziemlich kleine Punktwolken-umfassende Kugel, hier in 2D,"+\
" im Schnitt 5% bis 20% größer als Minimalsphäre, aber sehr schnell!"
' <TransCoded to XProfan 11, (CL) CopyLeft 2014-07 by P. Specht@gmx.at>
' <Source: http:'geomalgorithms.com/a08-_containers.html#fastBall%28%29>
' Theory: https://en.wikipedia.org/wiki/Bounding_sphere
' =====================================================================
' Copyright 2001 softSurfer, 2012 Dan Sunday
' This code may be freely used and modified for any purpose providing that this
' copyright notice is included with it. SoftSurfer makes no warranty for this code,
' and cannot be held liable for any real or imagined damage resulting from its use.
' Users of this code must verify correctness for their application.
' <The Program is> based on the algorithm given by [Jack Ritter, 1990].
' ====================================================================================
' <ASSUMPTIONS ON AVAILABLE VECTOR MATH OVERRIDDEN BY SIMPLE XPROFAN MATH>
' Result: Ball (2D: Circle) B with Center and Radius <Remarks <..> by P.Specht>
'=====================================================================================
' TESTSYSTEM mit n& Punkten:
var n&=12:dec n&
'=====================================================================================
DECLARE BCenterX!,BCentery!,BRadius!' Übergabevariablen, global definiert
Declare Px![n&],Py![n&],i&
WindowStyle 24:Font 2:Randomize:Window 0,0-%maxx,%maxy-40
var xh&=width(%hwnd)/2:var yh&=height(%hwnd)/2

REPEAT

    Px![]=xh&*0.75+rnd(xh&/2):Py![]=yh&*1.5-rnd(xh&/2)
    CLS:usepen 0,5,255:whileloop 0,n&:i&=&Loop:line Px![i&],Py![i&] - Px![i&]+1,Py![i&]:endwhile
    FastBall Px![],Py![],n&
    Usepen 0,2,rgb(0,0,255):usebrush 0,rgb(0,255,0)
    Ellipse BCenterX!-BRadius!,BCenterY!+BRadius! - BCenterX!+BRadius!,BCenterY!-BRadius!
    waitinput 10000

until %key = 27

END

proc FastBall

    parameters Px![],Py![],n&
    ' (based on the algorithm given by [Jack Ritter, 1990])
    declare Cx!,Cy!,rad!,rad2!' Center of ball, radius and radius squared
    declare xmin!, xmax!, ymin!, ymax!' bounding box extremes
    declare Pxmin&,Pxmax&,Pymin&,Pymax&' index of  P[] at box extreme
    declare i&,dPxx!,dPxy!,dPyx!,dPyy!,dx2!,dy2!,dist!,dist2!,dPx!,dPy!
    ' Find a large diameter to start with
    xmin!=10^50:xmax!=-1*10^50:ymin!=10^50:ymax!=-1*10^50:Pxmin&=0:Pxmax&=0:Pymin&=0:Pymax&=0

    whileloop 0,n&:i&=&Loop

        if Px![i&]<xmin!: xmin!=Px![i&]:Pxmin&=i&:endif

            if Px![i&]>xmax!: xmax!=Px![i&]:Pxmax&=i&:endif

                if Py![i&]<ymin!: ymin!=Py![i&]:Pymin&=i&:endif

                    if Py![i&]>ymax!: ymax!=Py![i&]:Pymax&=i&:endif

                    endwhile

                    :::::::Usepen 0,1,rgb(0,0,255):usebrush 0,rgb(0,255,0)
                    :::::::rectangle Px![Pxmin&],Py![Pymin&] - Px![Pxmax&],Py![Pymax&]
                    cx!=(Px![Pxmin&]+Px![Pxmax&])/2
                    cy!=(Py![Pymin&]+Py![Pymax&])/2
                    rad2!=sqr(cx!-Px![Pxmin&])
                    case rad2!<sqr(cy!-Py![Pymin&]):rad2!=sqr(cy!-Py![Pymin&])
                    rad!=sqrt(rad2!)
                    :::::::usepen 0,9,0:line cx!,cy! - cx!+1,cy!
                    ' Now check that all points P[i] are inside the Ball
                    ' and if not, expand the ball just enough to include them
                    ' Vector dP; float dist, dist2;

                    whileloop 0,n&:i&=&Loop

                        dPx!=Px![i&]-Cx!
                        dPy!=Py![i&]-Cy!
                        dist2!=sqr(dPx!)+sqr(dPy!)'= norm2(dP);
                        case dist2!<=rad2!:continue' P[i] is inside the ball already
                        ' P[i] not in ball, so expand ball  to include it:
                        dist!=sqrt(dist2!)
                        rad!=(rad!+dist!)/2' enlarge radius just enough
                        rad2!=sqr(rad!)
                        Cx!=Cx!+((dist!-rad!)/dist!)*dPx!' shift Center toward P[i]
                        Cy!=Cy!+((dist!-rad!)/dist!)*dPy!

                    Endwhile

                    Bcenterx!=Cx!:Bcentery!=Cy!:BRadius!=rad!

                Endproc

 
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
11.05.2021  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

685 Views

Untitledvor 0 min.
Ernst21.07.2021
p.specht18.07.2021
Uwe ''Pascal'' Niemeier13.06.2021
R.Schneider28.05.2021
Di più...

Themeninformationen

Dieses Thema hat 1 subscriber:

p.specht (1x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie