Rechteck mit quadratischer Spirale füllen

Azatoth

Mitglied
Hallo Leute,
ich habe folgendes Problem: Und zwar geht es darum ein Quadrat mit einer quadratischen Spirale zu füllen (siehe Zeichnung im Anhang).

Gegeben sind die X und Y Koordinaten (Untere linke Ecke) des Quadrats und die Größe (Höhe/Breite). Der Benutzer soll nun die Werte für den Außen- und Innenabstand eingeben um die Spirale zu erstellen. Die Spirale soll immer von Außen (Links oben) beginnen.

Kennt vielleicht irgend jemand einen Algorithmus oder hätte jemand eine Idee wie man das elegant bewerkstelligen könnte?
 

Anhänge

  • Fuellung.JPG
    Fuellung.JPG
    29,3 KB · Aufrufe: 37
Hi

Vllt. hab ich einen Denkfehler, aber wenn die Spirale immer links oben beginnt,
ist die Angabe vom Punkt 1 überflüssig.
Den kann man sich aus den anderen Sachen ausrechnen.

Annahme:
X-Achse: Nach Rechts wirds größer
Y-Achse: Nach unten wirds größer
Computermäßig.
C++:
/*Für Koordianten*/
struct coord
{
    int x;
    int y;
};

/*Zeichnet Linie von a bis b*/
void line(struct coord a, struct coord b)
{
    /*hier einfügen*/
}

/*Hauptfunktion
p2 usw. ist auf die Nummern im Bild bezogen*/
void spirale(int p2, int p3, struct coord p4, int p5, int p6)
{
    struct coord c1, c2, c3, c4;
    char side = 0; /*Welche der vier "Himmelsrichtungen" gerade dran ist*/

    /*Spiralbereich*/
    c1 = p4;
    c1.x += p2;
    c1.y += p2 - p5;
    c2 = p4;
    c2.x += p6 - p2;
    c2.y -= p2;

    while(1)
    {
        if(side == 0)
        {
             c3.x = c1.x;
             c3.y = c1.y - p3;
             c4.x= c1.x;
             c4.y = c2.y;
             c1.x += p3;
        }
        else if(side == 2)
        {
             c3.x = c2.x;
             c3.y = c1.y;
             c4.x= c2.x;
             c4.y = c2.y + p3;
             c2.x -= p3;
        }
        else if(side == 1)
        {
             c3.x = c1.x - p3;
             c3.y = c2.y;
             c4.x= c2.x;
             c4.y = c2.y;
             c2.y -= p3;
        }
        else if(side == 3)
        {
             c3.x = c2.x + p3;
             c3.y = c1.y;
             c4.x= c1.x;
             c4.y = c1.y;
             c1.y += p3;
        }

        line(c3, c4);
        if((side % 2) == 0 && (c2.x - c1.x) < p3) break;
        if((side % 2) == 1 && (c2.y - c1.y) < p3) break;
        side = (side + 1) % 4;
    }
}
Nicht kompiliert, nicht getestet, nicht schön und sicher noch verbesserbar.

Gruß
 
Zuletzt bearbeitet:
Zurück