# Zeichnen eines Wuerfels mit
einem einbeschriebenen Haus

 Friedrich Hattendorf, Bergstadt-Gymnasium Luedenscheid

 ***************************************************************************************
 Zuerst definieren wir die Abbildungsmatrix.
Bei einer 3D->2D Abbildung hat sie drei Zeilen und zwei Spalten.
Wir definieren mehrere Matrizen. Die nicht benoetigten kommentieren wir aus.
In der letten Zeile weisen wir die ausgewaehlte Matrix der Matrix m zu. Diese 
im folgenden mehrfach benoetigt; es iat aber dadurch nicht notwendig, sie an 
jeder Stelle zu nennen. 

m_kav:matrix([-1/2,-1/4],[1,0],[0,1]);
/* m_xxx:matrix([,],[,],[,]); */
/* m_grund:matrix([1,0],[0,1],[0,0]); */
m:m_kav;

 ***************************************************************************************
 Als erstes Objekt definieren wir danach die Achsen. Der Parameter lan_e gibt an, wie 
lang die einzelnen - von Ursprung ausgehenden Achsen-Stahlen gezeichnet werden.

lang_e:5;
pEN:[0,0,0]; pEXm:[-lang_e,0,0]; pEYm:[0,-lang_e,0];pEZm:[0,0,-lang_e];pEXp:[lang_e,0,0];pEYp:[0,lang_e,0];pEZp:[0,0,lang_e];

 Die so festgelegten Punkte werden zu einer Matrix zusammengefasst.
Diese Matrix wird mit der Abbildungsmatrix multipliziert.
Hinweis: das Multiplikationszeichen fuer Matrizen in maxima ist der 
Satzpunkt (.) , nicht das Sternchen (*)

k_achsen:matrix(pEN,pEXm,pEXp,pEYm,pEYp,pEZm,pEZp);
bild_mat:k_achsen.m;

Die berechnete Bild-Matrix muss mit dem part-Befehl wieder in 
Punkte (jetzt zweidimensional) zerlegt werden

pen:part(bild_mat,1);pxem:part(bild_mat,2);pxep:part(bild_mat,3);pyem:part(bild_mat,4);pyep:part(bild_mat,5);pzem:part(bild_mat,6);pzep:part(bild_mat,7);

Jetzt muss noch festgelegt werden, in welcher Reihenfolge die Punkte
nacheinander verbunden werdern sollen.
damit ist dann mit zlist_achsen das erset Zeichenobjekt fertig.

zlist_achsen:float([pxem,pxep,pen,pyem,pyep,pen,pzem,pzep]);

 ***************************************************************************************
  Auf die gleiche Art wird jetzt der Wuerfel behandelt.
 Ich definiere aber noch einen Vektor versch. Dessen Koordinaten addiere ich zu jedem Punkt. 

Am Anfang definiere ich den Wuerfel so, dass der Ursprung des Koordinatenkreuzes in seiner Mitte liegt.
Dann ist: versch :[0,0,0];
Wenn ich die Werte von versch ändere wird der Wuerfel um diesen Vektor verschoben.

Ausserdem definiere ich eine Konstante g. Wenn ich deren Wert aendere, aendert ich die Groesse des Wuerfels

g:2; 
/* versch :[2*g,2*g,-2*g]; */
versch :[0,0,0]; 
pA:[-g,-g,-g]+versch;pB:[-g,g,-g]+versch;pC:[g,g,-g]+versch;pD:[g,-g,-g]+versch;
pE:[-g,-g,g]+versch;pF:[-g,g,g]+versch;pG:[g,g,g]+versch;pH:[g,-g,g]+versch;
k_wuerfel:matrix(pA,pB,pC,pD,pE,pF,pG,pH);
bild_mat:k_wuerfel.m;
pa:part(bild_mat,1);pb:part(bild_mat,2);pc:part(bild_mat,3);pd:part(bild_mat,4);
pe:part(bild_mat,5);pf:part(bild_mat,6);pg:part(bild_mat,7);ph:part(bild_mat,8);
zlist_wuerfel:float([pa,pb,pc,pd,pa,pe,pf,pb,pf,pg,pc,pg,ph,pd,ph,pe]);

 ***************************************************************************************
Nun zeichne ich das Haus in den Wuerfel hinein.
Da seine Grundflaeche die des Wuerfels bleibt, kann ich die vier Punkte pA,pB,pC,pD weiter benutzen.
ebenso versch und g.

pM:[-g,-g,0.2*g]+versch;pN:[-g,g,0.2*g]+versch;pP:[g,g,0.2*g]+versch;pQ:[g,-g,0.2*g]+versch;
pR:[0,-g,g]+versch;pS:[0,g,g]+versch;
k_haus:matrix(pM,pN,pP,pQ,pR,pS);
bild_mat:k_haus.m;
pm:part(bild_mat,1);pn:part(bild_mat,2);pp:part(bild_mat,3);pq:part(bild_mat,4);
pr:part(bild_mat,5);ps:part(bild_mat,6);
zlist_haus:float([pa,pb,pc,pd,pa,pm,pn,pb,pn,ps,pp,pc,pp,pq,pd,pq,pr,ps,pr,pm]);

 ***************************************************************************************
Nun muss nur noch gezeichnet werden.
Dazu gibt es den Befehl plot2d
Das Argument von plot2d ist eine Liste
Im einfachsten Fall ist dies wieder eine Liste von Objekten:
     so im ersten Beispiel:
         hier werden nur die drei Listen fuer die Achsen, 
         den Wuerfel und das Haus uebergeben; das Schluesselword 
         discrete besagt dass es eine Liste von Punkten ist, 
         das Schluesselwort float bewirkt eine Anpassung an die 
         interne Zahlendarstellung.
Danach koennen noch weitere Anweisungen gegeben werden
     so im zweiten Beispiel:
         mit [legend, "","Wuerfel","Haus",""] wird die Legende 
         (oben rechts) erzeugt  Es gilt die gleiche Reihenfolge 
         wie vorher. "" als erstes bewirkt, dass es keine Legende fuer
         das Achsenkreuz gibt,
         mit [gnuplot_preamble,"set terminal png;set out 'wuerfel-haus-kav-maxima.png'"]
         wird die Ausgabe in eine Datei erzeugt. 
         'set terminal png' legt das Format fest,
         'set out 'wuerfel-haus-kav-maxima.png'' 
         den Dateinamen.

plot2d([[discrete,float(zlist_achsen)],[discrete,float(zlist_wuerfel)],[discrete,float(zlist_haus)]]);
/* plot2d([[discrete,float(zlist_achsen)],[discrete,float(zlist_haus)]]); */

plot2d([[discrete,float(zlist_achsen)],[discrete,float(zlist_wuerfel)],[discrete,float(zlist_haus)]],[legend, "","Wuerfel","Haus",""],[gnuplot_preamble,"set terminal png;set out 'wuerfel-haus-kav-maxima.png'"]);