#!/usr/bin/perl $diffColor='0.8 1.0 0.8'; @listColor=('1.0 1.0 0.7','1.0 0.5 0.5','0.5 1.0 0.5','0.5 0.5 1.0'); $radius=0.02; $height=0.10; $ndiv=31; $x=1; $y=2; $z=0; $pc=0; for($i=0;$i<$ndiv;$i++) { $r=2*3.14159265358979/$ndiv*($i-0.25); $point[$pc][$x]= $radius*cos($r); $point[$pc][$y]= $radius*sin($r); $point[$pc][$z]=-$height/2.0; $pc++; } for($i=0;$i<$ndiv;$i++) { $r=2*3.14159265358979/$ndiv*($i+0.25); $point[$pc][$x]= $radius*cos($r); $point[$pc][$y]= $radius*sin($r); $point[$pc][$z]= $height/2.0; $pc++; } $point[$pc][$x]=$point[$pc][$y]=0; $point[$pc][$z]= -$height/2.0; $c0=$pc; $pc++; $point[$pc][$x]=$point[$pc][$y]=0; $point[$pc][$z]= $height/2.0; $c1=$pc; $pc++; DumpVertex(); $tc=0; for($i=0;$i<$ndiv;$i++) { $j=$i; $k=($j+1)%$ndiv; $tcind[$tc]=0; $tlist[$tc]=[$j ,$k,$j+$ndiv]; $tc++; $tcind[$tc]=0; $tlist[$tc]=[$j+$ndiv,$k,$k+$ndiv]; $tc++; } $tcind[0]=1; $tcind[$ndiv]=2; for($i=0;$i<$ndiv;$i++) { $j=$i; $k=($j+1)%$ndiv; $tcind[$tc]=0; $tlist[$tc]=[$j,$c0,$k]; $tc++; $tcind[$tc]=0; $tlist[$tc]=[$c1,$j+$ndiv,$k+$ndiv]; $tc++; } $tcind[$ndiv*2+0]=1; $tcind[$ndiv*2+$ndiv]=2; 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]; } }