#!/usr/local/bin/perl # spherepoints.pl {AS1} {AS1} {AS1} # requires ASconnsummary and ASconnpairs in local directory $fname =$ARGV[0]; # file name $targetas1=$ARGV[1]; # optional subset display $targetas2=$ARGV[2]; # optional subset display $targetas3=$ARGV[3]; # optional subset display $dir="/R2/AS/Data"; open(I,"$dir/ASconnsummary.$fname") || ("Cannot open ASconnsummary.$fname"); printf "Content-type: x-world/x-vrml\n\n"; $_=; ($pfxcnt,$t,$t,$numas,$t,$t,$aspaircnt,@r)=split(' ',$_); close(I); # printf stderr "ASconnsummary: #prefixes: $pfxcnt, #as: $numas, #aspairs: $aspaircnt\n"; $grid=sqrt($numas); if($grid > (int($grid))){$grid=int(++$grid);} $numorbits =$grid; # number of orbital planes $satperorbit =$grid; # entities per orbital plane $planesep =180/$grid; # orbital plane separation $inclination =90.0; # inclination orbit $satdist =1000; # entities distance from surface $plradius =40000/3.141592654/2; # planetary diameter $ENV{'TZ'} = 'PST8PDT'; $inclin=($inclination/360)*(2*3.141592654); printf "#VRML V1.0 ascii\n\n"; # printf stderr "creating sphere points\n"; printf "Separator {\n"; printf " DEF LineSet0 Separator {\n"; printf " Material { diffuseColor 0.0 1.0 1.0 }\n"; printf " Coordinate3 {\n point [\n"; for ($j = 0; $j < $numorbits; $j++) { for ($i = 0; $i < $satperorbit; $i++) { $p1=$i/$satperorbit * (2*3.141592654); $p2=(($j*$planesep)/360) * (2*3.141592654); $xc=cos($p1)*sin($p2) + (sin($p1)*cos($p2)*cos($inclin)); $yc=sin($p1) * sin($inclin); $zc=cos($p1)*cos($p2) - (sin($p1)*sin($p2)*cos($inclin)); printf " %.4f %.4f %.4f,\n", ($plradius+$satdist)*$xc, ($plradius+$satdist)*$yc, ($plradius+$satdist)*$zc; $pntnum=($j*$numorbits)+$i; $pnta{$pntnum}=join(":", ($plradius+$satdist)*$xc,($plradius+$satdist)*$yc,($plradius+$satdist)*$zc); } } printf " ]\n"; printf " }\n"; # printf stderr "reading ASconnpairs input data for AS coordinate points\n"; open(I,"$dir/ASconnpairs.$fname") || die("Cannot open ASconnpairs.$fname"); while() { ($from,$t,$to,@r)=split(' ',$_); if(!$as{$from}){$as{$from}=$cnt++;} if(!$as{$to}){$as{$to}=$cnt++;} $asp++; } close(I); $cnt--; # printf stderr "$cnt AS numbers found in ASconnpairs, $asp pairs\n"; # printf stderr "re-reading ASconnpairs input data for AS connection lines\n"; if($targetas1){ printf " Material { diffuseColor 1.0 0.0 0.0 emissiveColor 1.0 0.0 0.0}\n"; open(I,"$dir/ASconnpairs.$fname") || die("Cannot open ASconnpairs.$fname"); while() { ($from,$t,$to,@r)=split(' ',$_); if(($from == $targetas1) || ($to == $targetas1)){ printf " IndexedLineSet {\n"; printf " coordIndex [ %d, %d ]",$as{$from},$as{$to}; printf " }\n"; } } } if($targetas2){ printf " Material { diffuseColor 0.0 1.0 0.0 emissiveColor 0.0 1.0 0.0 }\n"; open(I,"$dir/ASconnpairs.$fname") || die("Cannot open ASconnpairs.$fname"); while() { ($from,$t,$to,@r)=split(' ',$_); if(($from == $targetas2) || ($to == $targetas2)){ printf " IndexedLineSet {\n"; printf " coordIndex [ %d, %d ]",$as{$from},$as{$to}; printf " }\n"; } } } if($targetas3){ printf " Material { diffuseColor 0.0 0.0 1.0 emissiveColor 0.0 0.0 1.0 }\n"; open(I,"$dir/ASconnpairs.$fname") || die("Cannot open ASconnpairs.$fname"); while() { ($from,$t,$to,@r)=split(' ',$_); if(($from == $targetas3) || ($to == $targetas3)){ printf " IndexedLineSet {\n"; printf " coordIndex [ %d, %d ]",$as{$from},$as{$to}; printf " }\n"; } } } if((!$targetas1) && (!$targetas2) && (!$targetas3)){ printf " Material { diffuseColor 0.0 1.0 1.0 emissiveColor 0.0 1.0 1.0}\n"; open(I,"$dir/ASconnpairs.$fname") || die("Cannot open ASconnpairs.$fname"); while() { ($from,$t,$to,@r)=split(' ',$_); printf " IndexedLineSet {\n"; printf " coordIndex [ %d, %d ]",$as{$from},$as{$to}; printf " }\n"; } } # printf stderr "Third pass on ASconnpairs for interconnections\n"; open(I,"$dir/ASconnpairs.$fname") || die("Cannot open ASconnpairs.$fname"); while() { ($from,$t,$to,@r)=split(' ',$_); if(($from == $targetas1)||($from == $targetas2)||($from == $targetas3)){ $xpnt{$to}++; } if(($to == $targetas1)||($to == $targetas2)||($to == $targetas3)){ $xpnt{$from}++; } } printf " Material { diffuseColor 1.0 1.0 0.0 }\n"; foreach $key ( keys %xpnt) { if($xpnt{$key} > 1){ ($x,$y,$z)=split(':',$pnta{$as{$key}}); # printf stderr "Interconnection at AS %d -- %d times\n",$key,$xpnt{$key}; printf " Separator {\n"; printf " Transform {\n"; printf " translation %.4f %.4f %.4f\n",$x,$y,$z; printf " }\n"; printf " Sphere {radius 200}\n"; printf " }\n"; } } printf " }\n"; printf "}\n";