Image:Icosahedron.png
|
Icosahedron, rendered by Java applet I wrote.
Polyhedra.html
<html><head><title>Polyhedra</title><body>
<applet width=200 height=200 code="Polyhedra.class" codebase="."></applet>
</html>
Polyhedra.java
import java.awt.*; import java.applet.*; public class Polyhedra extends Applet{ double g=1.6180339887498948482045868343656381177203; //(1+Math.sqrt(5))/2; double d=0.6180339887498948482045868343656381177203; //1/g; double s=1.4142135623730950488016887242096980785696; //Math.sqrt(2); double tetrav[]={ -1,-s,0, -1,s,0, 1,0,-s, 1,0,s}; int tetrat[]={ 0,3,1, 3,2,1, 1,2,0, 3,0,2}; double hexav[]={ -1,-1,-1, -1,-1,1, -1,1,-1, -1,1,1, 1,-1,-1, 1,-1,1, 1,1,-1, 1,1,1}; int hexat[]={ 0,1,3,2, 2,3,7,6, 0,2,6,4, 3,1,5,7, 0,4,5,1, 6,7,5,4}; double octav[]={ -1,0,0, 1,0,0, 0,-1,0, 0,1,0, 0,0,-1, 0,0,1}; int octat[]={ 0,4,3, 3,4,1, 1,4,2, 2,4,0, 3,5,0, 0,5,2, 2,5,1, 1,5,3}; double dodecav[]={ 0,-d,-g, 0,-d,g, 0,d,-g, 0,d,g, -d,-g,0, -d,g,0, d,-g,0, d,g,0, -g,0,-d, g,0,-d, -g,0,d, g,0,d, -1,-1,-1, -1,-1,1, -1,1,-1, -1,1,1, 1,-1,-1, 1,-1,1, 1,1,-1, 1,1,1}; int dodecat[]={ 0,2,14,8,12, 0,16,9,18,2, 4,6,16,0,12, 2,18,7,5,14, 13,4,12,8,10, 6,17,11,9,16, 15,10,8,14,5, 18,9,11,19,7, 1,17,6,4,13, 5,7,19,3,15, 13,10,15,3,1, 19,11,17,1,3}; double icosav[]={ 0,-1,-g, 0,-1,g, 0,1,-g, 0,1,g, -1,-g,0, -1,g,0, 1,-g,0, 1,g,0, -g,0,-1, g,0,-1, -g,0,1, g,0,1}; int icosat[]={ 0,2,8, 2,0,9, 4,0,8, 4,6,0, 6,9,0, 5,8,2, 5,2,7, 7,2,9, 10,4,8, 10,8,5, 6,11,9, 9,11,7, 10,5,3, 10,1,4, 1,11,6, 3,7,11, 1,6,4, 3,5,7, 3,11,1, 1,10,3}; public void paint(Graphics g) { g.setColor(new Color(0xffffff)); g.fillRect(0, 0, 200, 200); double n=Math.random(); if(n<.2) drawfig(g, tetrav, tetrat, 3); else if(n<.4) drawfig(g, hexav, hexat, 4); else if(n<.6) drawfig(g, octav, octat, 3); else if(n<.8) drawfig(g, dodecav, dodecat, 5); else drawfig(g, icosav, icosat, 3); } void drawfig(Graphics g, double vs[], int ts[], int m) { double tr[]=randmat(); for(int back=-1;back<=1;back+=2) for(int t=0;t*m<ts.length;++t) { double f, td[]; double a1=vs[ts[t*m ]*3], a2=vs[ts[t*m ]*3+1], a3=vs[ts[t*m ]*3+2]; f=1/Math.sqrt(a1*a1+a2*a2+a3*a3); a1*=f; a2*=f; a3*=f; td=trans(a1, a2, a3, tr); a1=td[0]; a2=td[1]; a3=td[2]; double b1=vs[ts[t*m+1]*3], b2=vs[ts[t*m+1]*3+1], b3=vs[ts[t*m+1]*3+2]; f=1/Math.sqrt(b1*b1+b2*b2+b3*b3); b1*=f; b2*=f; b3*=f; td=trans(b1, b2, b3, tr); b1=td[0]; b2=td[1]; b3=td[2]; double c1=vs[ts[t*m+2]*3], c2=vs[ts[t*m+2]*3+1], c3=vs[ts[t*m+2]*3+2]; f=1/Math.sqrt(c1*c1+c2*c2+c3*c3); c1*=f; c2*=f; c3*=f; td=trans(c1, c2, c3, tr); c1=td[0]; c2=td[1]; c3=td[2]; double d1=b1-a1, d2=b2-a2, d3=b3-a3; double e1=c1-a1, e2=c2-a2, e3=c3-a3; double f1=e2*d3-d2*e3, f2=e3*d1-d3*e1, f3=e1*d2-d1*e2; double da1=a1/(4+a3), da2=a2/(4+a3), db1=b1/(4+b3)-da1, db2=b2/(4+b3)-da2, dc1=c1/(4+c3)-da1, dc2=c2/(4+c3)-da2; if(back* db1*dc2-dc1*db2 /*f3*/<0) { g.setColor(new Color((float)Math.random(), (float)Math.random(), (float)Math.random(), (float)(back<0?.90:0.90))); int xa[]=new int[m], ya[]=new int[m]; xa[0]=(int)(a1*3/(4+a3)*100+100); xa[1]=(int)(b1*3/(4+b3)*100+100); xa[2]=(int)(c1*3/(4+c3)*100+100); ya[0]=(int)(a2*3/(4+a3)*100+100); ya[1]=(int)(b2*3/(4+b3)*100+100); ya[2]=(int)(c2*3/(4+c3)*100+100); for(int w=3;w<m;++w) { a1=vs[ts[t*m+w]*3]; a2=vs[ts[t*m+w]*3+1]; a3=vs[ts[t*m+w]*3+2]; f=1/Math.sqrt(a1*a1+a2*a2+a3*a3); a1*=f; a2*=f; a3*=f; td=trans(a1, a2, a3, tr); a1=td[0]; a2=td[1]; a3=td[2]; xa[w]=(int)(a1*3/(4+a3)*100+100); ya[w]=(int)(a2*3/(4+a3)*100+100); } g.fillPolygon(xa, ya, m); } } } double[] randmat() { double[] r=new double[9]; double s, x, y, z; int i, j; for(i=0;i<3;++i) { x=Math.random()*2-1; y=Math.random()*2-1; z=Math.random()*2-1; s=x*x+y*y+z*z; if(s>1) { --i; continue; } for(j=0;j<i;++j) { s=x*r[j*3 ] +y*r[j*3+1] +z*r[j*3+2]; x-=s*r[j*3 ]; y-=s*r[j*3+1]; z-=s*r[j*3+2]; } s=x*x+y*y+z*z; if(s==0) { --i; continue; } s=Math.sqrt(s); x/=s; y/=s; z/=s; r[i*3 ]=x; r[i*3+1]=y; r[i*3+2]=z; } if(r[0]*r[4]*r[8]+r[1]*r[5]*r[6]+r[2]*r[3]*r[7]-r[0]*r[5]*r[7]-r[1]*r[3]*r[8]-r[2]*r[4]*r[6]<0) { r[0]=-r[0]; r[1]=-r[1]; r[2]=-r[2]; } return(r); } double[] trans(double x, double y, double z, double[] t) { return(new double[]{x*t[0]+y*t[1]+z*t[2], x*t[3]+y*t[4]+z*t[5], x*t[6]+y*t[7]+z*t[8]}); } }
Missing image Heckert_GNU_white.png | Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. Subject to disclaimers. |
File links
There are no pages that link to this file.