Startseite < Informatik < Algorithmen Datenstrukturen / Software-Engineering / Programmiersprachen < Compiler Interpreter / Java C/C++ POV-Ray < POV-Ray-Koordinaten POV-Ray-Schachspiel POV-Ray-Zauberwürfel < [ DRUCK , 2004 , 2005 , 2006 , 2007 , 2008 , 2009 ] POV-Ray-Zauberwürfel-Tests / Pons Asinorum Six Spot Cube in a Cube > > LaTeX > / Künstliche Intelligenz > Schach Privates / Inhalt >
POV-Ray-Zauberwürfel-Tests
Das Testen des POV-Ray-Framework ist zugleich ein Tutorium für den Zauberwürfel.
Vorwort Vorwort zum Frameworktest
Softwaretests
Auf vorliegender Webseite wird das POV-Ray-Zauberwürfel-Framework ausgiebig getestet.

Abgrenzend muss ich noch betonen, dass es sich hier nur um visuelle Kontrolle handelt und nicht um automatisierte Tests. Falls Sie sich für automatisierte Tests interessieren sollten, finden Sie sicherlich brauchbare Informationen unter Verifikation.
Zauberwürfel-Tutorium
Ich nutze die Gelegenheit, um neben den Softwaretests ein Tutorium für Anfänger zu machen: Wie bekomme ich einen verdrehten Zauberwürfel wieder hin, ohne ihn mit einem Schraubenzieher zerlegen zu müssen — nehmen Sie doch ein Werkzeug! :-)
Bitte um Rückmeldung!
Wenn ich Sie dazu bringen sollte, Ihren Zauberwürfel auszupacken, um ihn zu lösen, dann lassen Sie es mich doch bitte wissen: info@stefan-baur.de
Tutorium Zauberwürfel-Tutorium für Anfänger
Lösungsansätze für den Zauberwürfel
Es gibt zwei sinnvolle Herangehensweisen den Zauberwürfel zu lösen: Die Einen sagen, man solle stets die kürzeste Lösung finden, die Anderen sagen, man löst den Würfel am Besten nach Schema F:
  1. Erst die obere Ebene,
  2. dann die mittlere Ebene,
  3. dann die untere Ebene und fertig!
Ich persönlich bin hier für den zweiten Ansatz, der erste Ansatz wäre A*.
Lösung der ersten Ebene
Sicherlich haben auch Sie schon einmal die erste Ebene des Zauberwürfels gelöst — gut, denn davon gehe ich aus. :-)
Lösung der zweite Ebene
Zur Lösung der zweiten Ebene benötigen Sie nicht mehr als drei Drehsequenzen wie folgt:
1. Drehsequenz zur Lösung der 2. Ebene

2. Drehsequenz zur Lösung der 2. Ebene

3. Drehsequenz zur Lösung der 2. Ebene

Lösung der dritten Ebene
Zur Lösung der dritten Ebene benötigen Sie nicht mehr als vier Drehsequenzen wie folgt:
1. Drehsequenz zur Lösung der 3. Ebene
Vertauschen zweier Eckwürfel.
2. Drehsequenz zur Lösung der 3. Ebene
Nur die Ausrichtung dreier Eckwürfel ändern.
3. Drehsequenz zur Lösung der 3. Ebene
Drei Kantenwürfel wechseln ihre Position.
4. Drehsequenz zur Lösung der 3. Ebene
Drei Kantenwürfel wechseln ebenso ihre Position.
Preisfrage
Welche Farben hat das kleine schwarze Atom?
Tests Framework-Test
Voraussetzung
Für den Softwaretest des POV-Ray-Zauberwürfel-Framework benötigt man fast alle Dateien, die auf der Seite POV-Ray-Zauberwürfel zu finden sind.
Softwaretests
An dieser Stelle mache ich es mir auch ganz einfach, aber effektiv! Ich zeige zu jedem Animationsfilm des obigen Tutoriums die Quelldatei an.
develop.cube.ani.test03.pov
#include "develop.pov"
#include "develop.mirrors.pov"

#include "cube.pov"

#include "develop.tags.pov"

/* Würfel */

#declare TeachingCube = array[3][3][3];

Cube_Config(TeachingCube,

        CreateAtom3(TA, TagXN, TagYP, TagZN),
        CreateAtom2(TA,        TagYP, TagZN),
        CreateAtom3(TA, TagXP, TagYP, TagZN),
        CreateAtom2(TA, TagXN, TagYP       ),
        CreateAtom1(TA,        TagYP       ),
        CreateAtom2(TA, TagXP, TagYP       ),
        CreateAtom3(TA, TagXN, TagYP, TagZP),
        CreateAtom2(TA,        TagYP, TagZP),
        CreateAtom3(TA, TagXP, TagYP, TagZP),

        Atom,
        CreateAtom1(TA, TagZN),
        Atom,
        Atom,
        Atom,
        CreateAtom1(TA, TagXP),
        Atom,
        Atom,
        Atom,

        Atom,
        CreateAtom2(TA, CreateTag(TZN, -y), CreateTag(TXP, -z)),
        Atom,
        Atom,
        Atom,
        Atom,
        Atom,
        Atom,
        Atom)

// INI: 0 <= clock <= 3

Cube_R_(TeachingCube, 0.3, 0.45, clock)
Cube_D (TeachingCube, 0.5, 0.65, clock)
Cube_R (TeachingCube, 0.7, 0.85, clock)
Cube_D (TeachingCube, 0.9, 1.05, clock)
Cube_R_(TeachingCube, 1.1, 1.25, clock)
Cube_D_(TeachingCube, 1.3, 1.45, clock)
Cube_D_(TeachingCube, 1.5, 1.65, clock)
Cube_R (TeachingCube, 1.7, 1.85, clock)
Cube_D_(TeachingCube, 1.9, 2.05, clock)
Cube_R_(TeachingCube, 2.1, 2.25, clock)
Cube_D_(TeachingCube, 2.3, 2.45, clock)
Cube_R (TeachingCube, 2.5, 2.65, clock)

Cube_Show(TeachingCube)
1. Drehsequenz zur Lösung der 2. Ebene

develop.cube.ani.test04.pov
#include "develop.pov"
#include "develop.mirrors.pov"

#include "cube.pov"

#include "develop.tags.pov"

/* Würfel */

#declare TeachingCube = array[3][3][3];

Cube_Config(TeachingCube,

        CreateAtom3(TA, TagXN, TagYP, TagZN),
        CreateAtom2(TA,        TagYP, TagZN),
        CreateAtom3(TA, TagXP, TagYP, TagZN),
        CreateAtom2(TA, TagXN, TagYP       ),
        CreateAtom1(TA,        TagYP       ),
        CreateAtom2(TA, TagXP, TagYP       ),
        CreateAtom3(TA, TagXN, TagYP, TagZP),
        CreateAtom2(TA,        TagYP, TagZP),
        CreateAtom3(TA, TagXP, TagYP, TagZP),

        Atom,
        CreateAtom1(TA, TagZN),
        Atom,
        Atom,
        Atom,
        CreateAtom1(TA, TagXP),
        Atom,
        Atom,
        Atom,

        Atom,
        Atom,
        Atom,
        Atom,
        Atom,
        CreateAtom2(TA, CreateTag(TZN, +x), CreateTag(TXP, -y)),
        Atom,
        Atom,
        Atom)

// INI: 0 <= clock <= 3

Cube_F (TeachingCube, 0.3, 0.45, clock)
Cube_D_(TeachingCube, 0.5, 0.65, clock)
Cube_F_(TeachingCube, 0.7, 0.85, clock)
Cube_D_(TeachingCube, 0.9, 1.05, clock)
Cube_F (TeachingCube, 1.1, 1.25, clock)
Cube_D (TeachingCube, 1.3, 1.45, clock)
Cube_D (TeachingCube, 1.5, 1.65, clock)
Cube_F_(TeachingCube, 1.7, 1.85, clock)
Cube_D (TeachingCube, 1.9, 2.05, clock)
Cube_F (TeachingCube, 2.1, 2.25, clock)
Cube_D (TeachingCube, 2.3, 2.45, clock)
Cube_F_(TeachingCube, 2.5, 2.65, clock)

// Die blaue Seite etwas in Richtung des Betrachters drehen

object { Cube_Show(TeachingCube) rotate <0.0, 18.0, 0.0> }
2. Drehsequenz zur Lösung der 2. Ebene
Würfel kann auch gedreht werden.
develop.cube.ani.test05.pov
#include "develop.pov"
#include "develop.mirrors.pov"

#include "cube.pov"

#include "develop.tags.pov"


// Alles in einem Makro kapseln

#macro Kapsel()

        #local TeachingCube = array[3][3][3];

        Cube_Config(TeachingCube,

                CreateAtom3(TA, TagXN, TagYP, TagZN),
                CreateAtom2(TA,        TagYP, TagZN),
                CreateAtom3(TA, TagXP, TagYP, TagZN),
                CreateAtom2(TA, TagXN, TagYP       ),
                CreateAtom1(TA,        TagYP       ),
                CreateAtom2(TA, TagXP, TagYP       ),
                CreateAtom3(TA, TagXN, TagYP, TagZP),
                CreateAtom2(TA,        TagYP, TagZP),
                CreateAtom3(TA, TagXP, TagYP, TagZP),

                Atom,
                CreateAtom1(TA, TagZN),
                CreateAtom2(TA, CreateTag(TXP, -z), CreateTag(TZN, +x)),
                Atom,
                Atom,
                CreateAtom1(TA, TagXP),
                Atom,
                Atom,
                Atom,

                Atom,
                Atom,
                Atom,
                Atom,
                Atom,
                Atom,
                Atom,
                Atom,
                Atom)

        // INI: 0 <= clock <= 2

        Cube_F (TeachingCube, 0.3, 0.45, clock)
        Cube_D (TeachingCube, 0.5, 0.65, clock)
        Cube_F_(TeachingCube, 0.7, 0.85, clock)
        Cube_D_(TeachingCube, 0.9, 1.05, clock)
        Cube_R_(TeachingCube, 1.1, 1.25, clock)
        Cube_D_(TeachingCube, 1.3, 1.45, clock)
        Cube_R (TeachingCube, 1.5, 1.65, clock)
        Cube_D (TeachingCube, 1.7, 1.85, clock)

        Cube_Show(TeachingCube)

#end // End of Macro "Kapsel"

// Kapselungsmakro ausführen

Kapsel()
3. Drehsequenz zur Lösung der 2. Ebene
Würfel kann auch gekapselt werden.
develop.cube.ani.test07.pov
#include "develop.pov"
#include "develop.mirrors.pov"

#include "cube.pov"

#include "develop.tags.pov"

/* Würfel */

#declare TeachingCube = array[3][3][3];

Cube_Config(TeachingCube,

        CreateAtom3(TA, TagXN, TagYP, TagZN),
        CreateAtom2(TA,        TagYP, TagZN),
        CreateAtom3(TA, TagXP, TagYP, TagZN),
        CreateAtom2(TA, TagXN, TagYP       ),
        CreateAtom1(TA,        TagYP       ),
        CreateAtom2(TA, TagXP, TagYP       ),
        CreateAtom3(TA, TagXN, TagYP, TagZP),
        CreateAtom2(TA,        TagYP, TagZP),
        CreateAtom3(TA, TagXP, TagYP, TagZP),

        CreateAtom2(TA, TagXN,        TagZN),
        CreateAtom1(TA,               TagZN),
        CreateAtom2(TA, TagXP,        TagZN),
        CreateAtom1(TA, TagXN,             ),
        Atom,
        CreateAtom1(TA, TagXP,             ),
        CreateAtom2(TA, TagXN,        TagZP),
        CreateAtom1(TA,               TagZP),
        CreateAtom2(TA, TagXP,        TagZP),

        CreateAtom3(TA,
                CreateTag(TXP, -x),
                CreateTag(TYN, -z),
                CreateTag(TZN, -y)),
        Atom,
        CreateAtom3(TA,
                CreateTag(TZN, +x),
                CreateTag(TYN, -y),
                CreateTag(TXN, -z)),
        Atom,
        CreateAtom1(TA, CreateTag(TYN, -y)),
        Atom,
        Atom,
        Atom,
        Atom)

// INI: 0 <= clock <= 3

Cube_R_(TeachingCube, 0.3, 0.45, clock)
Cube_D_(TeachingCube, 0.5, 0.65, clock)
Cube_R (TeachingCube, 0.7, 0.85, clock)
Cube_F (TeachingCube, 0.9, 1.05, clock)
Cube_D (TeachingCube, 1.1, 1.25, clock)
Cube_F_(TeachingCube, 1.3, 1.45, clock)
Cube_R_(TeachingCube, 1.5, 1.65, clock)
Cube_D (TeachingCube, 1.7, 1.85, clock)
Cube_R (TeachingCube, 1.9, 2.05, clock)
Cube_D (TeachingCube, 2.1, 2.25, clock)
Cube_D (TeachingCube, 2.3, 2.45, clock)

Cube_Show(TeachingCube)
1. Drehsequenz zur Lösung der 3. Ebene

develop.cube.ani.test08.pov
#include "develop.pov"
#include "develop.mirrors.pov"

#include "cube.pov"

#include "develop.tags.pov"

/* Würfel */

#declare TeachingCube = array[3][3][3];

Cube_Config(TeachingCube,

        CreateAtom3(TA, TagXN, TagYP, TagZN),
        CreateAtom2(TA,        TagYP, TagZN),
        CreateAtom3(TA, TagXP, TagYP, TagZN),
        CreateAtom2(TA, TagXN, TagYP       ),
        CreateAtom1(TA,        TagYP       ),
        CreateAtom2(TA, TagXP, TagYP       ),
        CreateAtom3(TA, TagXN, TagYP, TagZP),
        CreateAtom2(TA,        TagYP, TagZP),
        CreateAtom3(TA, TagXP, TagYP, TagZP),

        CreateAtom2(TA, TagXN,        TagZN),
        CreateAtom1(TA,               TagZN),
        CreateAtom2(TA, TagXP,        TagZN),
        CreateAtom1(TA, TagXN,             ),
        Atom,
        CreateAtom1(TA, TagXP,             ),
        CreateAtom2(TA, TagXN,        TagZP),
        CreateAtom1(TA,               TagZP),
        CreateAtom2(TA, TagXP,        TagZP),

        Atom,
        Atom,
        CreateAtom3(TA,
                CreateTag(TZN, +x),
                CreateTag(TXP, -y),
                CreateTag(TYN, -z)),
        Atom,
        CreateAtom1(TA, CreateTag(TYN, -y)),
        Atom,
        CreateAtom3(TA,
                CreateTag(TZP, -x),
                CreateTag(TYN, +z),
                CreateTag(TXN, -y)),
        Atom,
        CreateAtom3(TA,
                CreateTag(TYN, +x),
                CreateTag(TXP, +z),
                CreateTag(TZP, -y)))

// INI: 0 <= clock <= 3

Cube_R_(TeachingCube, 0.3, 0.45, clock)
Cube_D_(TeachingCube, 0.5, 0.65, clock)
Cube_R (TeachingCube, 0.7, 0.85, clock)
Cube_D_(TeachingCube, 0.9, 1.05, clock)
Cube_R_(TeachingCube, 1.1, 1.25, clock)
Cube_D (TeachingCube, 1.3, 1.45, clock)
Cube_D (TeachingCube, 1.5, 1.65, clock)
Cube_R (TeachingCube, 1.7, 1.85, clock)
Cube_D_(TeachingCube, 1.9, 2.05, clock)
Cube_D_(TeachingCube, 2.1, 2.25, clock)

Cube_Show(TeachingCube)
2. Drehsequenz zur Lösung der 3. Ebene

develop.cube.ani.test09.pov
#include "develop.pov"
#include "develop.mirrors.pov"

#include "cube.pov"

#include "develop.tags.pov"

/* Würfel */

#declare TeachingCube = array[3][3][3];

Cube_Config(TeachingCube,

        CreateAtom3(TA, TagXN, TagYP, TagZN),
        CreateAtom2(TA,        TagYP, TagZN),
        CreateAtom3(TA, TagXP, TagYP, TagZN),
        CreateAtom2(TA, TagXN, TagYP       ),
        CreateAtom1(TA,        TagYP       ),
        CreateAtom2(TA, TagXP, TagYP       ),
        CreateAtom3(TA, TagXN, TagYP, TagZP),
        CreateAtom2(TA,        TagYP, TagZP),
        CreateAtom3(TA, TagXP, TagYP, TagZP),

        CreateAtom2(TA, TagXN,        TagZN),
        CreateAtom1(TA,               TagZN),
        CreateAtom2(TA, TagXP,        TagZN),
        CreateAtom1(TA, TagXN,             ),
        Atom,
        CreateAtom1(TA, TagXP,             ),
        CreateAtom2(TA, TagXN,        TagZP),
        CreateAtom1(TA,               TagZP),
        CreateAtom2(TA, TagXP,        TagZP),

        CreateAtom3(TA, TagXN, TagYN, TagZN),
        Atom,
        CreateAtom3(TA, TagXP, TagYN, TagZN),
        CreateAtom2(TA, CreateTag(TYN, -x), CreateTag(TZP, -y)),
        CreateAtom1(TA,        TagYN       ),
        CreateAtom2(TA, CreateTag(TXN, +x), CreateTag(TYN, -y)),
        CreateAtom3(TA, TagXN, TagYN, TagZP),
        CreateAtom2(TA, CreateTag(TYN, +z), CreateTag(TXP, -y)),
        CreateAtom3(TA, TagXP, TagYN, TagZP))

// INI: 0 <= clock <= 3

Cube_L_(TeachingCube, 0.3, 0.45, clock)
Cube_R (TeachingCube, 0.5, 0.65, clock)
Cube_F_(TeachingCube, 0.7, 0.85, clock)
Cube_L (TeachingCube, 0.9, 1.05, clock)
Cube_R_(TeachingCube, 1.1, 1.25, clock)
Cube_D (TeachingCube, 1.3, 1.45, clock)
Cube_D (TeachingCube, 1.5, 1.65, clock)
Cube_L_(TeachingCube, 1.7, 1.85, clock)
Cube_R (TeachingCube, 1.9, 2.05, clock)
Cube_F_(TeachingCube, 2.1, 2.25, clock)
Cube_L (TeachingCube, 2.3, 2.45, clock)
Cube_R_(TeachingCube, 2.5, 2.65, clock)

Cube_Show(TeachingCube)
3. Drehsequenz zur Lösung der 3. Ebene

develop.cube.ani.test10.pov
#include "develop.pov"
#include "develop.mirrors.pov"

#include "cube.pov"

#include "develop.tags.pov"

/* Würfel */

#declare TeachingCube = array[3][3][3];

Cube_Config(TeachingCube,

        CreateAtom3(TA, TagXN, TagYP, TagZN),
        CreateAtom2(TA,        TagYP, TagZN),
        CreateAtom3(TA, TagXP, TagYP, TagZN),
        CreateAtom2(TA, TagXN, TagYP       ),
        CreateAtom1(TA,        TagYP       ),
        CreateAtom2(TA, TagXP, TagYP       ),
        CreateAtom3(TA, TagXN, TagYP, TagZP),
        CreateAtom2(TA,        TagYP, TagZP),
        CreateAtom3(TA, TagXP, TagYP, TagZP),

        CreateAtom2(TA, TagXN,        TagZN),
        CreateAtom1(TA,               TagZN),
        CreateAtom2(TA, TagXP,        TagZN),
        CreateAtom1(TA, TagXN,             ),
        Atom,
        CreateAtom1(TA, TagXP,             ),
        CreateAtom2(TA, TagXN,        TagZP),
        CreateAtom1(TA,               TagZP),
        CreateAtom2(TA, TagXP,        TagZP),

        CreateAtom3(TA, TagXN, TagYN, TagZN),
        Atom,
        CreateAtom3(TA, TagXP, TagYN, TagZN),
        CreateAtom2(TA, CreateTag(TYN, -x), CreateTag(TXP, -y)),
        CreateAtom1(TA,        TagYN       ),
        CreateAtom2(TA, CreateTag(TZP, +x), CreateTag(TYN, -y)),
        CreateAtom3(TA, TagXN, TagYN, TagZP),
        CreateAtom2(TA, CreateTag(TYN, +z), CreateTag(TXN, -y)),
        CreateAtom3(TA, TagXP, TagYN, TagZP))

// INI: 0 <= clock <= 3

Cube_F (TeachingCube, 0.3, 0.45, clock)
Cube_L (TeachingCube, 0.5, 0.65, clock)
Cube_B_(TeachingCube, 0.7, 0.85, clock)
Cube_L_(TeachingCube, 0.9, 1.05, clock)
Cube_F_(TeachingCube, 1.1, 1.25, clock)
Cube_B (TeachingCube, 1.3, 1.45, clock)
Cube_D (TeachingCube, 1.5, 1.65, clock)
Cube_B (TeachingCube, 1.7, 1.85, clock)
Cube_D_(TeachingCube, 1.9, 2.05, clock)
Cube_B_(TeachingCube, 2.1, 2.25, clock)

Cube_Show(TeachingCube)
4. Drehsequenz zur Lösung der 3. Ebene

Testergebnis
Die Animationen sehen genauso aus, wie ich sie programmiert bzw. entwickelt habe.

Ich glaube, es passt alles. :-)