#!/usr/bin/perl $diffColor='0.8 1.0 0.8'; @listColor=('0.8 0.8 0.8','1.0 0.8 0.8','0.8 1.0 0.8','0.8 0.8 1.0'); $radius=0.11; # hint :http://www.emit.jp/prog/prog_d1.html $ia=1/sqrt(5); print STDERR "a=$ia\n"; $ib=(1-$ia)/2; print STDERR "b=$ib\n"; $ic=(1+$ia)/2; print STDERR "c=$ic\n"; $id=sqrt($ib); print STDERR "d=$id\n"; $ie=sqrt($ic); print STDERR "e=$ie\n"; $pc=0; $point[$pc]=[ 0, 1, 0]; $pc++; $point[$pc]=[ 0, $ia, 2*$ia]; $pc++; $point[$pc]=[ $ie, $ia, $ib]; $pc++; $point[$pc]=[ $id, $ia, -$ic]; $pc++; $point[$pc]=[-$id, $ia, -$ic]; $pc++; $point[$pc]=[-$ie, $ia, $ib]; $pc++; $point[$pc]=[ $id,-$ia, $ic]; $pc++; $point[$pc]=[ $ie,-$ia, -$ib]; $pc++; $point[$pc]=[ 0,-$ia,-2*$ia]; $pc++; $point[$pc]=[-$ie,-$ia, -$ib]; $pc++; $point[$pc]=[-$id,-$ia, $ic]; $pc++; $point[$pc]=[ 0, -1, 0]; $pc++; DumpVertex(); $tc=0; for($i=0;$i<5;$i++) { $j=$i; $k=($j+1)%5; $tlist[$tc]=[0,$j+1,$k+1]; $tc++; } for($i=0;$i<5;$i++) { $j=$i; $k=($j+1)%5; $tlist[$tc]=[$j+1,$j+6,$k+1]; $tc++; } for($i=0;$i<5;$i++) { $j=$i; $k=($j+1)%5; $tlist[$tc]=[$k+1,$j+6,$k+6]; $tc++; } for($i=0;$i<5;$i++) { $j=$i; $k=($j+1)%5; $tlist[$tc]=[$k+6,$j+6,11]; $tc++; } for($i=0;$i<$tc;$i++) { $tcind[$i]=0; } for($i=0;$i<5;$i++) { $tcind[$i]=1; } for($i=15;$i<20;$i++) { $tcind[$i]=3; } #$tcind[$tc-1]=2; DumpTriangle(); InterpolateTriangle3(); InterpolateTriangle2(); NormalizeRadius($radius); DumpTriangle(); WriteOut(); exit; sub WriteOut { local($i,$sep); # header print "#VRML V2.0 utf8\n\n"; print "Transform {\n"; print " children [\n"; print " Shape {\n"; # material print " appearance Appearance {\n"; print " material Material {\n"; print " diffuseColor $diffColor\n"; print " }\n"; print " }\n"; # vertex print " geometry IndexedFaceSet {\n"; print " coord Coordinate {\n"; print " point [ # $pc vertices\n"; for($i=0;$i<$pc;$i++) { if($i<$pc-1) { $sep=','; } else { $sep=''; } printf " % 12.8lf % 12.8lf % 12.8lf$sep\n",$point[$i][0],$point[$i][1],$point[$i][2]; } print " ]\n"; print " }\n"; print " # $tc polygons\n"; print " coordIndex [\n"; for($i=0;$i<$tc;$i++) { if($i<$tc-1) { $sep=','; } else { $sep=''; } printf " %3d, %3d, %3d, -1$sep\n",$tlist[$i][0],$tlist[$i][1],$tlist[$i][2]; } print " ]\n"; # color if($#tcind==$tc-1) { print STDERR "generating color table\n"; print " colorPerVertex FALSE\n"; print " color Color {\n"; print " color [\n"; for($i=0;$i<=$#listColor;$i++) { if($i<$#listColor) { $sep=','; } else { $sep=''; } print " $listColor[$i],\n"; } print " ]\n"; print " }\n"; print " colorIndex [\n"; for($i=0;$i<$tc;$i++) { if($i<$tc-1) { $sep=','; } else { $sep=''; } if($i%10==0) { print " "; } printf "%d$sep ",$tcind[$i]; if($i%10==9) { print "\n"; } } if($i%10!=0) { print "\n"; } print " ]\n"; } print " } # End of IndexedFaceSet\n"; print " } # End of Shape node\n"; print " ]\n"; print "}\n"; } sub InterpolateTriangle2 { local(@tlref)=@tlist; local($tlrefc)=$#tlist+1; local(@tcref)=@tcind; local($i,$c); $tc=0; for($i=0;$i<$tlrefc;$i++) { $p0=$tlref[$i][0]; $p1=$tlref[$i][1]; $p2=$tlref[$i][2]; $p3=AddMidPoint($p0,$p1,0.5); $p4=AddMidPoint($p1,$p2,0.5); $p5=AddMidPoint($p2,$p0,0.5); $c=$tcref[$i]; $tlist[$tc]=[$p0,$p3,$p5]; $tcind[$tc]=$c; $tc++; $tlist[$tc]=[$p1,$p4,$p3]; $tcind[$tc]=$c; $tc++; $tlist[$tc]=[$p2,$p5,$p4]; $tcind[$tc]=$c; $tc++; $tlist[$tc]=[$p3,$p4,$p5]; $tcind[$tc]=$c; $tc++; } } sub InterpolateTriangle3 { local(@tlref)=@tlist; local($tlrefc)=$#tlist+1; local(@tcref)=@tcind; local($i,$c); $tc=0; for($i=0;$i<$tlrefc;$i++) { $p0=$tlref[$i][0]; $p1=$tlref[$i][1]; $p2=$tlref[$i][2]; $p3=AddMidPoint($p0,$p1,1/3.0); $p4=AddMidPoint($p0,$p1,2/3.0); $p5=AddMidPoint($p1,$p2,1/3.0); $p6=AddMidPoint($p1,$p2,2/3.0); $p7=AddMidPoint($p2,$p0,1/3.0); $p8=AddMidPoint($p2,$p0,2/3.0); $p9=AddMidPoint($p3,$p6,0.5); $c=2; $tlist[$tc]=[$p0,$p3,$p8]; $tcind[$tc]=$c; $tc++; $tlist[$tc]=[$p1,$p5,$p4]; $tcind[$tc]=$c; $tc++; $tlist[$tc]=[$p2,$p7,$p6]; $tcind[$tc]=$c; $tc++; $c=$tcref[$i]; $tlist[$tc]=[$p3,$p4,$p9]; $tcind[$tc]=$c; $tc++; $tlist[$tc]=[$p3,$p9,$p8]; $tcind[$tc]=$c; $tc++; $tlist[$tc]=[$p7,$p8,$p9]; $tcind[$tc]=$c; $tc++; $tlist[$tc]=[$p4,$p5,$p9]; $tcind[$tc]=$c; $tc++; $tlist[$tc]=[$p5,$p6,$p9]; $tcind[$tc]=$c; $tc++; $tlist[$tc]=[$p6,$p7,$p9]; $tcind[$tc]=$c; $tc++; } } sub AddMidPoint { local($p0,$p1,$r)=@_; $point[$pc][0]=$point[$p0][0]*(1-$r)+$point[$p1][0]*$r; $point[$pc][1]=$point[$p0][1]*(1-$r)+$point[$p1][1]*$r; $point[$pc][2]=$point[$p0][2]*(1-$r)+$point[$p1][2]*$r; $pc++; return $pc-1; } sub NormalizeRadius { local($r)=@_; local($i,$l); for($i=0;$i<$pc;$i++) { $l=sqrt($point[$i][0]*$point[$i][0]+$point[$i][1]*$point[$i][1]+$point[$i][2]*$point[$i][2]); $l=$r/$l; $point[$i][0]*=$l; $point[$i][1]*=$l; $point[$i][2]*=$l; } } # for debug ############################ sub DumpTriangle { for($i=0;$i<$tc;$i++) { printf STDERR "T%3d [%3d %3d %3d] : ",$i,$tlist[$i][0],$tlist[$i][1],$tlist[$i][2]; for($j=0;$j<3;$j++) { $k=($j+1)%3; $dx=$point[$tlist[$i][$j]][0]-$point[$tlist[$i][$k]][0]; $dy=$point[$tlist[$i][$j]][1]-$point[$tlist[$i][$k]][1]; $dz=$point[$tlist[$i][$j]][2]-$point[$tlist[$i][$k]][2]; printf STDERR "%6.4lf ",sqrt($dx*$dx+$dy*$dy+$dz*$dz); } print STDERR "\n"; } } sub DumpVertex { for($i=0;$i<$pc;$i++) { printf STDERR "P%2d (% 10.7lf, % 10.7lf, % 10.7lf)\n",$i,$point[$i][0],$point[$i][1],$point[$i][2]; } }