#!/usr/local/bin/perl if ($#ARGV !=1) { die "Usage: $0 inputfile outputfile\n"; } ($infile,$outfile) = @ARGV; open(INPUT,"<$infile") || die "Can't input $infile $!"; open(OUTPUT,">$outfile") || die "Can't output $outfile $!"; print OUTPUT "#VRML V2.0 utf8\n"; print OUTPUT "Background {\n"; print OUTPUT "groundAngle [ 0.9, 1.5, 1.57 ]\n"; print OUTPUT "groundColor [ 0.2 0.2 1, 0.4 0.4 1, 0.7 0.7 1, 0.7 0.7 1]\n"; print OUTPUT "skyAngle [ 0.9, 1.5, 1.57 ]\n"; print OUTPUT "skyColor [ 0.9 0.9 1, 0.8 0.8 1, 0.7 0.7 1, 0.7 0.7 1]\n"; print OUTPUT "}\n"; print OUTPUT "Viewpoint {\n"; print OUTPUT "position 1 1 1\n"; print OUTPUT "description \"entry view\"\n"; print OUTPUT "}\n"; @object_database; @object_face_database; @def_var_database; $boxwid = 1; @def_var_database[0] = boxwid; @def_var_database[1] = 1; $boxht = 1; @def_var_database[2] = boxht; @def_var_database[3] = 1; $boxdep = 1; @def_var_database[4] = boxdep; @def_var_database[5] = 1; $cylinderrad = 1; @def_var_database[6] = cylinderrad; @def_var_database[7] = 1; $cylinderht = 1; @def_var_database[8] = cylinderht; @def_var_database[9] = 1; $sphererad = 1; @def_var_database[10] = sphererad; @def_var_database[11] = 1; $conebotrad = 1; @def_var_database[12] = conebotrad; @def_var_database[13] = 1; $coneht = 1; @def_var_database[14] = coneht; @def_var_database[15] = 1; $arrowlength = 5; @def_var_database[16] = arrowlength; @def_var_database[17] = 5; $object_number = 0; $line_number = 0; $data_counter = 0; $var_counter = 18; $objectXCord = -10; $objectYCord = 1; $objectZCord = 1 ; while ($line = ) { #Default Dimensions------------------------------------------- if ($line =~ m/^(boxht)(\s+)=(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)?(\s+)?(\W)?(\s+)?(\w+)?/i) { assign_operations($1, $4, $7, $9); } if ($line =~ m/^(boxwid)(\s+)=(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)?(\s+)?(\W)?(\s+)?(\w+)?/i) { assign_operations($1, $4, $7, $9); } if ($line =~ m/^(boxwid)(\s+)=(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)?(\s+)?(\W)?(\s+)?(\w+)?/i) { assign_operations($1, $4, $7, $9); } if ($line =~ m/^(cylinderrad)(\s+)=(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)?(\s+)?(\W)?(\s+)?(\w+)?/i) { assign_operations($1, $4, $7, $9); } if ($line =~ m/^(cylinderht)(\s+)=(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)?(\s+)?(\W)?(\s+)?(\w+)?/i) { assign_operations($1, $4, $7, $9); } if ($line =~ m/^(sphererad)(\s+)=(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)?(\s+)?(\W)?(\s+)?(\w+)?/i) { assign_operations($1, $4, $7, $9); } if ($line =~ m/^(conebotrad)(\s+)=(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)?(\s+)?(\W)?(\s+)?(\w+)?/i) { assign_operations($1, $4, $7, $9); } if ($line =~ m/^(coneht)(\s+)=(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)?(\s+)?(\W)?(\s+)?(\w+)?/i) { assign_operations($1, $4, $7, $9); } if ($line =~ m/^(arrowlength)(\s+)=(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)?(\s+)?(\W)?(\s+)?(\w+)?/i) { assign_operations($1, $4, $7, $9); } #defining variables------------------------------------------------ if (($line =~ m/^(\w+)(\s+)=(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)?(\s+)?(\W)?(\s+)?(\w+)?/i) && ($line !~ m/^boxht|boxwid|boxdep|cylinderht|cylinderrad|sphererad|coneht|conebotrad|arrowlength(\s+)?=(\s+)?([0-9]+(\.[0-9]*)?|\.[0-9]+)i/i)) { assign_operations($1, $4, $7, $9); } #BOX----------------------------------------------------------- if (($line =~ m/^(box)/i)&&($line !~ m/^(box)(\w+)/i)) { my ($counter); $counter = $data_counter; $object_number++; $line_number++; my ($object_type); $object_type = $1; $object_type =~ y/A-Z/a-z/; @object_database[$counter] = $object_type; @object_database[$counter + 1] = $object_number; @object_database[$counter + 2] = $line_number; my ($box_text); my ($box_height); my ($box_width); my ($box_depth); my ($box_color); my ($box_X); my ($box_Y); my ($box_Z); if ($line =~m/color(\s+)([a-zA-Z]+)/i) { $box_color = $2; $box_color =~ y/A-Z/a-z/; @object_database[$counter + 9] = $box_color; } if ($line =~ m/\"(.*)\"/) { $box_text = $1; @object_database[$counter + 11] = $box_text; } if ($line =~ m/at(\s+)(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $box_X = $2; @object_database[$counter + 3] = $box_X; $box_Y = $6; @object_database[$counter + 4] = $box_Y; $box_Z = $10; @object_database[$counter + 5] = $box_Z; @object_database[$counter + 10] = 1; } if ($line =~ m/width(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $box_width = $2; @object_database[$counter + 6] = $box_width; } if ($line =~ m/height(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $box_height = $2; @object_database[$counter + 7] = $box_height; } if ($line =~ m/depth(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $box_depth = $2; @object_database[$counter + 8] = $box_depth; } size_box ($object_database[$counter+6], $object_database[$counter+7], $object_database[$counter+8], $counter); $data_counter += 20; } #CYLINDER-------------------------------------------------- if (($line =~ m/^(cylinder)/i) && ($line !~ m/^(cylinder)(\w+)/i)) { my ($counter); $counter = $data_counter; $object_number++; $line_number++; my ($object_type); $object_type = $1; $object_type =~ y/A-Z/a-z/; @object_database[$counter] = $object_type; @object_database[$counter + 1] = $object_number; @object_database[$counter + 2] = $line_number; my ($cylinder_text); my ($cylinder_radius); my ($cylinder_height); my ($cylinder_color); my ($cylinder_X); my ($cylinder_Y); my ($cylinder_Z); if ($line =~ m/\"(.*)\"/) { $cylinder_text = $1; @object_database[$counter + 11] = $cylinder_text; } if ($line =~ m/at(\s+)(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $cylinder_X = $2; @object_database[$counter + 3] = $cylinder_X; $cylinder_Y = $6; @object_database[$counter + 4] = $cylinder_Y; $cylinder_Z = $10; @object_database[$counter + 5] = $cylinder_Z; @object_database[$counter + 10] = 1; } if ($line =~m/color(\s+)([a-zA-Z]+)/i) { $cylinder_color = $2; $cylinder_color =~ y/A-Z/a-z/; @object_database[$counter + 9] = $cylinder_color; } if ($line =~ m/height(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $cylinder_height = $2; @object_database[$counter + 7] = $cylinder_height; } if ($line =~ m/radius(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $cylinder_radius = $2; @object_database[$counter + 6] = $cylinder_radius; } size_cylinder ($object_database[$counter+6], $object_database[$counter+7], $counter); $data_counter += 20 } #SPHERE------------------------------------------------------- if (($line =~ m/^(sphere)/i) && ($line !~ m/^(sphere)(\w+)/i)) { my ($counter); $counter = $data_counter; $object_number++; $line_number++; my ($object_type); $object_type = $1; $object_type =~ y/A-Z/a-z/; @object_database[$counter] = $object_type; @object_database[$counter + 1] = $object_number; @object_database[$counter + 2] = $line_number; my ($sphere_text); my ($sphere_radius); my ($sphere_color); my ($sphere_X); my ($sphere_Y); my ($sphere_Z); if ($line =~ m/\"(.*)\"/) { $sphere_text = $1; @object_database[$counter + 11] = $sphere_text; } if ($line =~ m/at(\s+)(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $sphere_X = $2; @object_database[$counter + 3] = $sphere_X; $sphere_Y = $6; @object_database[$counter + 4] = $sphere_Y; $sphere_Z = $10; @object_database[$counter + 5] = $sphere_Z; @object_database[$counter + 10] = 1; } if ($line =~m/color(\s+)([a-zA-Z]+)/i) { $sphere_color = $2; $sphere_color =~ y/A-Z/a-z/; @object_database[$counter + 9] = $sphere_color; } if ($line =~ m/radius(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $sphere_radius = $2; @object_database[$counter + 6] = $sphere_radius; } size_sphere ($object_database[$counter+6], $counter); $data_counter += 20; } #CONE--------------------------------------------------------- if (($line =~ m/^(cone)/i) && ($line !~ m/^(cone)(\w+)/i)) { my ($counter); $counter = $data_counter; $object_number++; $line_number++; my ($object_type); $object_type = $1; $object_type =~ y/A-Z/a-z/; @object_database[$counter] = $object_type; @object_database[$counter + 1] = $object_number; @object_database[$counter + 2] = $line_number; my ($cone_text); my ($cone_bottomRadius); my ($cone_height); my ($cone_color); my ($cone_X); my ($cone_Y); my ($cone_Z); if ($line =~ m/\"(.*)\"/) { $cone_text = $1; @object_database[$counter + 11] = $cone_text; } if ($line =~ m/at(\s+)(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $cone_X = $2; @object_database[$counter + 3] = $cone_X; $cone_Y = $6; @object_database[$counter + 4] = $cone_Y; $cone_Z = $10; @object_database[$counter + 5] = $cone_Z; @object_database[$counter + 10] = 1; } if ($line =~m/color(\s+)([a-zA-Z]+)/i) { $cone_color = $2; $cone_color =~ y/A-Z/a-z/; @object_database[$counter + 9] = $cone_color; } if ($line =~ m/bottomradius(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $cone_bottomRadius = $2; @object_database[$counter + 6] = $cone_bottomRadius; } if ($line =~ m/height(\s+)([0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $cone_height = $2; @object_database[$counter + 7] = $cone_height; } size_cone ($object_database[$counter+6], $object_database[$counter+7], $counter); $data_counter += 20; } #LINE OR ARROW------------------------------------------------------ if ((($line =~ m/^(line)/i)||($line =~ m/^(arrow)/i)) && ($line !~ m/^(line)(\w+)/i) && ($line !~ m/^(arrow)(\w+)/i)) { my ($counter); $counter = $data_counter; $object_number++; $line_number++; my ($object_type); $object_type = $1; $object_type =~ y/A-Z/a-z/; @object_database[$counter] = $object_type; @object_database[$counter + 1] = $object_number; @object_database[$counter + 2] = $line_number; #LINE-------------------------------------------------------- if ($line =~ m/^(line)/i) { my ($line_color); my ($line_text); if ($line =~ m/\"(.*)\"/) { $line_text = $1; @object_database[$counter + 11] = $line_text; } if ($line =~ m/at(\s+)(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $line_at_X = $2; @object_database[$counter + 3] = $line_at_X; $line_at_Y = $6; @object_database[$counter + 4] = $line_at_Y; $line_at_Z = $10; @object_database[$counter + 5] = $line_at_Z; @object_database[$counter + 10] = 2; } if ($line =~ m/from(\s+)(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)to(\s+)(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\. [0-9]*)?|\.[0-9]+)i/i) { $line_start_X = $2; @object_database[$counter + 3] = $line_start_X; $line_start_Y = $6; @object_database[$counter + 4] = $line_start_Y; $line_start_Z = $10; @object_database[$counter + 5] = $line_start_Z; $line_end_X = $14; @object_database[$counter + 6] = $line_end_X; $line_end_Y = $18; @object_database[$counter + 7] = $line_end_Y; $line_end_Z = $22; @object_database[$counter + 8] = $line_end_Z; @object_database[$counter + 10] = 1; } if ($line =~m/color(\s+)([a-zA-Z]+)/i) { $line_color = $2; $line_color =~ y/A-Z/a-z/; @object_database[$counter + 9] = $line_color; } } #ARROW-------------------------------------------------------- if ($line =~ m/^(arrow)/i) { my ($counter); $counter = $data_counter; my ($arrow_color); my ($arrow_text); if ($line =~ m/\"(.*)\"/) { $arrow_text = $1; @object_database[$counter + 11] = $arrow_text; } if ($line =~ m/at(\s+)(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i/i) { $arrow_at_X = $2; @object_database[$counter + 3] = $arrow_at_X; $arrow_at_Y = $6; @object_database[$counter + 4] = $arrow_at_Y; $arrow_at_Z = $10; @object_database[$counter + 5] = $arrow_at_Z; @object_database[$counter + 10] = 2; } if ($line =~ m/from(\s+)(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)to(\s+)(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\.[0-9]*)?|\.[0-9]+)i(\s+)?,(\s+)?(-?[0-9]+(\. [0-9]*)?|\.[0-9]+)i/i) { $arrow_start_X = $2; @object_database[$counter + 3] = $arrow_start_X; $arrow_start_Y = $6; @object_database[$counter + 4] = $arrow_start_Y; $arrow_start_Z = $10; @object_database[$counter + 5] = $arrow_start_Z; $arrow_end_X = $14; @object_database[$counter + 6] = $arrow_end_X; $arrow_end_Y = $18; @object_database[$counter + 7] = $arrow_end_Y; $arrow_end_Z = $22; @object_database[$counter + 8] = $arrow_end_Z; @object_database[$counter + 10] = 1; } if ($line =~m/color(\s+)([a-zA-Z]+)/i) { $arrow_color = $2; $arrow_color =~ y/A-Z/a-z/; @object_database[$counter + 9] = $arrow_color; } } $data_counter += 20; } } $data_counter = 0; $face_counter = 0; # first object of the object_database calc_faces(); sub calc_faces { if (($object_database[$data_counter] eq "box")||($object_database[$data_counter] eq "cylinder") || ($object_database[$data_counter] eq "sphere") || ($object_database[$data_counter] eq "cone")) { if (($data_counter eq 0)&&($object_database[$data_counter + 10] ne 1)) { $object_database[$data_counter + 3] = -10; $object_database[$data_counter + 4] = 1; $object_database[$data_counter + 5] = 1; } my ($left_face_position_X); my ($left_face_position_Y); my ($left_face_position_Z); my ($right_face_position_X); my ($right_face_position_Y); my ($right_face_position_Z); my ($top_face_position_X); my ($top_face_position_Y); my ($top_face_position_Z); my ($bottom_face_position_X); my ($bottom_face_position_Y); my ($bottom_face_position_Z); my ($front_face_position_X); my ($front_face_position_Y); my ($front_face_position_Z); my ($back_face_position_X); my ($back_face_position_Y); my ($back_face_position_Z); if ($object_database[$data_counter] eq "box") { $left_face_position_X = $object_database[$data_counter + 3] - ($object_database[$data_counter + 6]/2); $left_face_position_Y = $object_database[$data_counter + 4]; $left_face_position_Z = $object_database[$data_counter + 5]; $right_face_position_X = $object_database[$data_counter + 3] + ($object_database[$data_counter + 6]/2); $right_face_position_Y = $object_database[$data_counter + 4]; $right_face_position_Z = $object_database[$data_counter + 5]; $top_face_position_X = $object_database[$data_counter + 3]; $top_face_position_Y = $object_database[$data_counter + 4] + ($object_database[$data_counter + 7]/2); $top_face_position_Z = $object_database[$data_counter + 5]; $bottom_face_position_X = $object_database[$data_counter + 3]; $bottom_face_position_Y = $object_database[$data_counter + 4] - ($object_database[$data_counter + 7]/2); $bottom_face_position_Z = $object_database[$data_counter + 5]; $front_face_position_X = $object_database[$data_counter + 3]; $front_face_position_Y = $object_database[$data_counter + 4]; $front_face_position_Z = $object_database[$data_counter + 5] + ($object_database[$data_counter + 8]/2); $back_face_position_X = $object_database[$data_counter + 3]; $back_face_position_Y = $object_database[$data_counter + 4]; $back_face_position_Z = $object_database[$data_counter + 5] - ($object_database[$data_counter + 8]/2); $object_face_database[$face_counter] = box; $object_face_database[$face_counter + 1] = $left_face_position_X; $object_face_database[$face_counter + 2] = $left_face_position_Y; $object_face_database[$face_counter + 3] = $left_face_position_Z; $object_face_database[$face_counter + 4] = $right_face_position_X; $object_face_database[$face_counter + 5] = $right_face_position_Y; $object_face_database[$face_counter + 6] = $right_face_position_Z; $object_face_database[$face_counter + 7] = $top_face_position_X; $object_face_database[$face_counter + 8] = $top_face_position_Y; $object_face_database[$face_counter + 9] = $top_face_position_Z; $object_face_database[$face_counter + 10] = $bottom_face_position_X; $object_face_database[$face_counter + 11] = $bottom_face_position_Y; $object_face_database[$face_counter + 12] = $bottom_face_position_Z; $object_face_database[$face_counter + 13] = $front_face_position_X; $object_face_database[$face_counter + 14] = $front_face_position_Y; $object_face_database[$face_counter + 15] = $front_face_position_Z; $object_face_database[$face_counter + 16] = $back_face_position_X; $object_face_database[$face_counter + 17] = $back_face_position_Y; $object_face_database[$face_counter + 18] = $back_face_position_Z; } if ($object_database[$data_counter] eq "cylinder") { $left_face_position_X = $object_database[$data_counter + 3] - ($object_database[$data_counter + 6]); $left_face_position_Y = $object_database[$data_counter + 4]; $left_face_position_Z = $object_database[$data_counter + 5]; $right_face_position_X = $object_database[$data_counter + 3] + ($object_database[$data_counter + 6]); $right_face_position_Y = $object_database[$data_counter + 4]; $right_face_position_Z = $object_database[$data_counter + 5]; $top_face_position_X = $object_database[$data_counter + 3]; $top_face_position_Y = $object_database[$data_counter + 4] + ($object_database[$data_counter + 7]/2); $top_face_position_Z = $object_database[$data_counter + 5]; $bottom_face_position_X = $object_database[$data_counter + 3]; $bottom_face_position_Y = $object_database[$data_counter + 4] - ($object_database[$data_counter + 7]/2); $bottom_face_position_Z = $object_database[$data_counter + 5]; $front_face_position_X = $object_database[$data_counter + 3]; $front_face_position_Y = $object_database[$data_counter + 4]; $front_face_position_Z = $object_database[$data_counter + 5] + ($object_database[$data_counter + 6]); $back_face_position_X = $object_database[$data_counter + 3]; $back_face_position_Y = $object_database[$data_counter + 4]; $back_face_position_Z = $object_database[$data_counter + 5] - ($object_database[$data_counter + 6]); $object_face_database[$face_counter] = cylinder; $object_face_database[$face_counter + 1] = $left_face_position_X; $object_face_database[$face_counter + 2] = $left_face_position_Y; $object_face_database[$face_counter + 3] = $left_face_position_Z; $object_face_database[$face_counter + 4] = $right_face_position_X; $object_face_database[$face_counter + 5] = $right_face_position_Y; $object_face_database[$face_counter + 6] = $right_face_position_Z; $object_face_database[$face_counter + 7] = $top_face_position_X; $object_face_database[$face_counter + 8] = $top_face_position_Y; $object_face_database[$face_counter + 9] = $top_face_position_Z; $object_face_database[$face_counter + 10] = $bottom_face_position_X; $object_face_database[$face_counter + 11] = $bottom_face_position_Y; $object_face_database[$face_counter + 12] = $bottom_face_position_Z; $object_face_database[$face_counter + 13] = $front_face_position_X; $object_face_database[$face_counter + 14] = $front_face_position_Y; $object_face_database[$face_counter + 15] = $front_face_position_Z; $object_face_database[$face_counter + 16] = $back_face_position_X; $object_face_database[$face_counter + 17] = $back_face_position_Y; $object_face_database[$face_counter + 18] = $back_face_position_Z; } if($object_database[$data_counter] eq "sphere") { $left_face_position_X = $object_database[$data_counter + 3] - ($object_database[$data_counter + 6]); $left_face_position_Y = $object_database[$data_counter + 4]; $left_face_position_Z = $object_database[$data_counter + 5]; $right_face_position_X = $object_database[$data_counter + 3] + ($object_database[$data_counter + 6]); $right_face_position_Y = $object_database[$data_counter + 4]; $right_face_position_Z = $object_database[$data_counter + 5]; $top_face_position_X = $object_database[$data_counter + 3]; $top_face_position_Y = $object_database[$data_counter + 4] + ($object_database[$data_counter + 6]); $top_face_position_Z = $object_database[$data_counter + 5]; $bottom_face_position_X = $object_database[$data_counter + 3]; $bottom_face_position_Y = $object_database[$data_counter + 4] - ($object_database[$data_counter + 6]); $bottom_face_position_Z = $object_database[$data_counter + 5]; $front_face_position_X = $object_database[$data_counter + 3]; $front_face_position_Y = $object_database[$data_counter + 4]; $front_face_position_Z = $object_database[$data_counter + 5] + ($object_database[$data_counter + 6]); $back_face_position_X = $object_database[$data_counter + 3]; $back_face_position_Y = $object_database[$data_counter + 4]; $back_face_position_Z = $object_database[$data_counter + 5] - ($object_database[$data_counter + 6]); $object_face_database[$face_counter] = sphere; $object_face_database[$face_counter + 1] = $left_face_position_X; $object_face_database[$face_counter + 2] = $left_face_position_Y; $object_face_database[$face_counter + 3] = $left_face_position_Z; $object_face_database[$face_counter + 4] = $right_face_position_X; $object_face_database[$face_counter + 5] = $right_face_position_Y; $object_face_database[$face_counter + 6] = $right_face_position_Z; $object_face_database[$face_counter + 7] = $top_face_position_X; $object_face_database[$face_counter + 8] = $top_face_position_Y; $object_face_database[$face_counter + 9] = $top_face_position_Z; $object_face_database[$face_counter + 10] = $bottom_face_position_X; $object_face_database[$face_counter + 11] = $bottom_face_position_Y; $object_face_database[$face_counter + 12] = $bottom_face_position_Z; $object_face_database[$face_counter + 13] = $front_face_position_X; $object_face_database[$face_counter + 14] = $front_face_position_Y; $object_face_database[$face_counter + 15] = $front_face_position_Z; $object_face_database[$face_counter + 16] = $back_face_position_X; $object_face_database[$face_counter + 17] = $back_face_position_Y; $object_face_database[$face_counter + 18] = $back_face_position_Z; } if($object_database[$data_counter] eq "cone") { $left_face_position_X = $object_database[$data_counter + 3] - (($object_database[$data_counter + 6])-($object_database[$data_counter + 6]/2)); $left_face_position_Y = $object_database[$data_counter + 4]; $left_face_position_Z = $object_database[$data_counter + 5]; $right_face_position_X = $object_database[$data_counter + 3] + (($object_database[$data_counter + 6])-($object_database[$data_counter + 6])); $right_face_position_Y = $object_database[$data_counter + 4]; $right_face_position_Z = $object_database[$data_counter + 5]; $top_face_position_X = $object_database[$data_counter + 3]; $top_face_position_Y = $object_database[$data_counter + 4] + ($object_database[$data_counter + 7]/2); $top_face_position_Z = $object_database[$data_counter + 5]; $bottom_face_position_X = $object_database[$data_counter + 3]; $bottom_face_position_Y = $object_database[$data_counter + 4] - ($object_database[$data_counter + 7]/2); $bottom_face_position_Z = $object_database[$data_counter + 5]; $front_face_position_X = $object_database[$data_counter + 3]; $front_face_position_Y = $object_database[$data_counter + 4]; $front_face_position_Z = $object_database[$data_counter + 5] + (($object_database[$data_counter + 6])-($object_database[$data_counter + 6]/2)); $back_face_position_X = $object_database[$data_counter + 3]; $back_face_position_Y = $object_database[$data_counter + 4]; $back_face_position_Z = $object_database[$data_counter + 5] - (($object_database[$data_counter + 6])-($object_database[$data_counter + 6]/2)); $object_face_database[$face_counter] = cone; $object_face_database[$face_counter + 1] = $left_face_position_X; $object_face_database[$face_counter + 2] = $left_face_position_Y; $object_face_database[$face_counter + 3] = $left_face_position_Z; $object_face_database[$face_counter + 4] = $right_face_position_X; $object_face_database[$face_counter + 5] = $right_face_position_Y; $object_face_database[$face_counter + 6] = $right_face_position_Z; $object_face_database[$face_counter + 7] = $top_face_position_X; $object_face_database[$face_counter + 8] = $top_face_position_Y; $object_face_database[$face_counter + 9] = $top_face_position_Z; $object_face_database[$face_counter + 10] = $bottom_face_position_X; $object_face_database[$face_counter + 11] = $bottom_face_position_Y; $object_face_database[$face_counter + 12] = $bottom_face_position_Z; $object_face_database[$face_counter + 13] = $front_face_position_X; $object_face_database[$face_counter + 14] = $front_face_position_Y; $object_face_database[$face_counter + 15] = $front_face_position_Z; $object_face_database[$face_counter + 16] = $back_face_position_X; $object_face_database[$face_counter + 17] = $back_face_position_Y; $object_face_database[$face_counter + 18] = $back_face_position_Z; } $object_database[$data_counter + 10] = 1; } } if (($object_database[$data_counter] eq "line")||($object_database[$data_counter] eq "arrow")) { if ($object_database[$data_counter] eq "line") { $object_face_database[$face_counter] = line; } if ($object_database[$data_counter] eq "arrow") { $object_face_database[$face_counter] = arrow; } if ($object_database[$data_counter + 10] eq 2) { my ($temp); $temp = $object_database[$data_counter + 3]; $object_database[$data_counter + 3] = $temp - $arrowlength/2; $object_database[$data_counter + 6] = $temp + $arrowlength/2; $object_database[$data_counter + 7] = $object_database[$data_counter + 4]; $object_database[$data_counter + 8] = $object_database[$data_counter + 5]; $object_face_database[$face_counter + 1] = $object_database[$data_counter + 3]; $object_face_database[$face_counter + 2] = $object_database[$data_counter + 4]; $object_face_database[$face_counter + 3] = $object_database[$data_counter + 5]; $object_face_database[$face_counter + 4] = $object_database[$data_counter + 6]; $object_face_database[$face_counter + 5] = $object_database[$data_counter + 7]; $object_face_database[$face_counter + 6] = $object_database[$data_counter + 8]; } if ($object_database[$data_counter + 10] eq 1) { $object_face_database[$face_counter + 1] = $object_database[$data_counter + 3]; $object_face_database[$face_counter + 2] = $object_database[$data_counter + 4]; $object_face_database[$face_counter + 3] = $object_database[$data_counter + 5]; $object_face_database[$face_counter + 4] = $object_database[$data_counter + 6]; $object_face_database[$face_counter + 5] = $object_database[$data_counter + 7]; $object_face_database[$face_counter + 6] = $object_database[$data_counter + 8]; } else { $object_database[$data_counter + 3] = -10; $object_database[$data_counter + 4] = 1; $object_database[$data_counter + 5] = 1; $object_database[$data_counter + 6] = -10 + $arrowlength; $object_database[$data_counter + 7] = 1; $object_database[$data_counter + 8] = 1; $object_face_database[$face_counter + 1] = $object_database[$data_counter + 3]; $object_face_database[$face_counter + 2] = $object_database[$data_counter + 4]; $object_face_database[$face_counter + 3] = $object_database[$data_counter + 5]; $object_face_database[$face_counter + 4] = $object_database[$data_counter + 6]; $object_face_database[$face_counter + 5] = $object_database[$data_counter + 7]; $object_face_database[$face_counter + 6] = $object_database[$data_counter + 8]; } $object_database[$data_counter + 10] = 1; } ###############Go to the next object in the database $data_counter += 20; $face_counter += 20; $size_object_database = @object_database; while ($data_counter <= $size_object_database) { if (($object_database[$data_counter] eq "box")||($object_database[$data_counter] eq "cylinder") || ($object_database[$data_counter] eq "sphere") || ($object_database[$data_counter] eq "cone")) { if ($object_database[$data_counter + 10] eq 1) { calc_faces(); } else { if (($object_database[$data_counter -20] eq "box")|| ($object_database[$data_counter -20] eq "cylinder")|| ($object_database[$data_counter -20] eq "sphere")|| ($object_database[$data_counter -20] eq "cone")) { if ($object_database[$data_counter] eq "box") { $object_face_database[$face_counter] = box; my ($new_position); $new_position = $object_face_database[$face_counter - 20 + 4] + 5 + (($object_database[$data_counter + 6])/2); $object_database[$data_counter + 3] = $new_position; $object_database[$data_counter + 4] = $object_face_database[$face_counter - 20 +5]; $object_database[$data_counter + 5] = $object_face_database[$face_counter - 20 +6]; calc_faces(); } elsif ($object_database[$data_counter] eq "cylinder") { $object_face_database[$face_counter] = cylinder; my ($new_position); $new_position = $object_face_database[$face_counter - 20 + 4] + 5 + (($object_database[$data_counter + 6])); $object_database[$data_counter + 3] = $new_position; $object_database[$data_counter + 4] = $object_face_database[$face_counter - 20 +5]; $object_database[$data_counter + 5] = $object_face_database[$face_counter - 20 +6]; calc_faces(); } elsif ($object_database[$data_counter] eq "sphere") { $object_face_database[$face_counter] = sphere; my ($new_position); $new_position = $object_face_database[$face_counter - 20 + 4] + 5 +(($object_database[$data_counter + 6])); $object_database[$data_counter + 3] = $new_position; $object_database[$data_counter + 4] = $object_face_database[$face_counter - 20 +5]; $object_database[$data_counter + 5] = $object_face_database[$face_counter - 20 +6]; calc_faces(); } elsif ($object_database[$data_counter] eq "cone") { $object_face_database[$face_counter] = cone; my ($new_position); $new_position = $object_face_database[$face_counter - 20 + 4] + 5 + (($object_database[$data_counter + 6])-($object_database[$data_counter + 6])/2); $object_database[$data_counter + 3] = $new_position; $object_database[$data_counter + 4] = $object_face_database[$face_counter - 20 +5]; $object_database[$data_counter + 5] = $object_face_database[$face_counter - 20 +6]; calc_faces(); } } if (($object_database[$data_counter -20] eq "line")|| ($object_database[$data_counter -20] eq "arrow")) { my ($new_position); $new_position = $object_face_database[$face_counter - 20 + 4] + (($object_database[$data_counter + 6])/2); $object_database[$data_counter + 3] = $new_position; $object_database[$data_counter + 4] = $object_face_database[$face_counter - 20 + 5]; $object_database[$data_counter + 5] = $object_face_database[$face_counter - 20 + 6]; calc_faces(); } } } if (($object_database[$data_counter] eq "line")||($object_database[$data_counter] eq "arrow")) { if ($object_database[$data_counter] eq "line") { $object_face_database[$face_counter] = line; } if ($object_database[$data_counter] eq "arrow") { $object_face_database[$face_counter] = arrow; } if ($object_database[$data_counter + 10] eq 2) { my ($temp); $temp = $object_database[$data_counter + 3]; $object_database[$data_counter + 3] = $temp - $arrowlength/2; $object_database[$data_counter + 6] = $temp + $arrowlength/2; $object_database[$data_counter + 7] = $object_database[$data_counter + 4]; $object_database[$data_counter + 8] = $object_database[$data_counter + 5]; $object_face_database[$face_counter + 1] = $object_database[$data_counter + 3]; $object_face_database[$face_counter + 2] = $object_database[$data_counter + 4]; $object_face_database[$face_counter + 3] = $object_database[$data_counter + 5]; $object_face_database[$face_counter + 4] = $object_database[$data_counter + 6]; $object_face_database[$face_counter + 5] = $object_database[$data_counter + 7]; $object_face_database[$face_counter + 6] = $object_database[$data_counter + 8]; } if ($object_database[$data_counter + 10] eq 1) { $object_face_database[$face_counter + 1] = $object_database[$data_counter + 3]; $object_face_database[$face_counter + 2] = $object_database[$data_counter + 4]; $object_face_database[$face_counter + 3] = $object_database[$data_counter + 5]; $object_face_database[$face_counter + 4] = $object_database[$data_counter + 6]; $object_face_database[$face_counter + 5] = $object_database[$data_counter + 7]; $object_face_database[$face_counter + 6] = $object_database[$data_counter + 8]; } else { if (($object_database[$data_counter -20] eq "box")|| ($object_database[$data_counter -20] eq "cylinder")|| ($object_database[$data_counter -20] eq "sphere")|| ($object_database[$data_counter -20] eq "cone")|| ($object_database[$data_counter -20] eq "line")|| ($object_database[$data_counter -20] eq "arrow")) { my ($new_position); $new_position = $object_face_database[$face_counter - 20 + 4] + $arrowlength; $object_database[$data_counter + 3] = $object_face_database[$face_counter - 20 + 4]; $object_database[$data_counter + 4] = $object_face_database[$face_counter - 20 + 5]; $object_database[$data_counter + 5] = $object_face_database[$face_counter - 20 + 6]; $object_database[$data_counter + 6] = $new_position; $object_database[$data_counter + 7] = $object_face_database[$face_counter - 20 + 5]; $object_database[$data_counter + 8] = $object_face_database[$face_counter - 20 + 6]; $object_face_database[$face_counter + 1] = $object_database[$data_counter + 3]; $object_face_database[$face_counter + 2] = $object_database[$data_counter + 4]; $object_face_database[$face_counter + 3] = $object_database[$data_counter + 5]; $object_face_database[$face_counter + 4] = $object_database[$data_counter + 6]; $object_face_database[$face_counter + 5] = $object_database[$data_counter + 7]; $object_face_database[$face_counter + 6] = $object_database[$data_counter + 8]; } } } $object_database[$data_counter + 10] = 1; $data_counter += 20; $face_counter += 20; } print "@object_database\n\n\n\n"; print "@object_face_database\n\n\n"; print "$size_object_database\n"; print "$data_counter\n"; print "$face_counter\n"; $data_counter = 0; $face_counter = 0; while ($data_counter <= $size_object_database) { if ($object_database[$data_counter] eq "box") { draw_box ("Box", $object_database[$data_counter + 1], $object_database[$data_counter + 2], $object_database[$data_counter + 3], $object_database[$data_counter + 4], $object_database[$data_counter + 5], $object_database[$data_counter + 6], $object_database[$data_counter + 7], $object_database[$data_counter + 8], $object_database[$data_counter + 9], $object_database[$data_counter + 10], $object_database[$data_counter + 11]); } if ($object_database[$data_counter] eq "cylinder") { draw_cylinder ("Cylinder", $object_database[$data_counter + 1], $object_database[$data_counter + 2], $object_database[$data_counter + 3], $object_database[$data_counter + 4], $object_database[$data_counter + 5], $object_database[$data_counter + 6], $object_database[$data_counter + 7], $object_database[$data_counter + 8], $object_database[$data_counter + 9], $object_database[$data_counter + 10], $object_database[$data_counter + 11]); } if ($object_database[$data_counter] eq "sphere") { draw_sphere ("Sphere", $object_database[$data_counter + 1], $object_database[$data_counter + 2], $object_database[$data_counter + 3], $object_database[$data_counter + 4], $object_database[$data_counter + 5], $object_database[$data_counter + 6], $object_database[$data_counter + 7], $object_database[$data_counter + 8], $object_database[$data_counter + 9], $object_database[$data_counter + 10], $object_database[$data_counter + 11]); } if ($object_database[$data_counter] eq "cone") { draw_cone ("Cone", $object_database[$data_counter + 1], $object_database[$data_counter + 2], $object_database[$data_counter + 3], $object_database[$data_counter + 4], $object_database[$data_counter + 5], $object_database[$data_counter + 6], $object_database[$data_counter + 7], $object_database[$data_counter + 8], $object_database[$data_counter + 9], $object_database[$data_counter + 10], $object_database[$data_counter + 11]); } if ($object_database[$data_counter] eq "line") { draw_line ("IndexedLineSet", $object_database[$data_counter + 1], $object_database[$data_counter + 2], $object_database[$data_counter + 3], $object_database[$data_counter + 4], $object_database[$data_counter + 5], $object_database[$data_counter + 6], $object_database[$data_counter + 7], $object_database[$data_counter + 8], $object_database[$data_counter + 9], $object_database[$data_counter + 10], $object_database[$data_counter + 11]); } if ($object_database[$data_counter] eq "arrow") { draw_line ("IndexedLineSet", $object_database[$data_counter + 1], $object_database[$data_counter + 2], $object_database[$data_counter + 3], $object_database[$data_counter + 4], $object_database[$data_counter + 5], $object_database[$data_counter + 6], $object_database[$data_counter + 7], $object_database[$data_counter + 8], $object_database[$data_counter + 9], $object_database[$data_counter + 10], $object_database[$data_counter + 11]); draw_arrow_head ($object_database[$data_counter + 3], $object_database[$data_counter + 4], $object_database[$data_counter + 5], $object_database[$data_counter + 6], $object_database[$data_counter + 7], $object_database[$data_counter + 8]); } $data_counter += 20; $face_counter += 20; } sub draw_box { my ($length_label); $length_label = length($_[11]); @box_color_array = draw_object_color($_[9]); print OUTPUT "Transform {\n"; print OUTPUT "translation $_[3] $_[4] $_[5]\n"; print OUTPUT "children [\n"; print OUTPUT "Shape {\n"; print OUTPUT "appearance Appearance {\n"; print OUTPUT "material Material {\n"; print OUTPUT "diffuseColor "; print OUTPUT "$box_color_array[0] $box_color_array[1] $box_color_array[2]\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "geometry "; print OUTPUT "$_[0] {size $_[6], $_[7], $_[8]}\n"; print OUTPUT "}\n"; print OUTPUT "]\n"; print OUTPUT "}\n"; if ($_[11] ne "") { draw_object_text($_[3], $_[4], $_[5], $_[6], $_[7], $_[8], $_[11], $length_label, "box"); } generate_viewpoint($_[3], $_[4], $_[5], "box"); } sub size_box { if ($_[0] ne "") { $object_database[$_[3] + 6] = $_[0]; } else { $object_database[$_[3] + 6] = $def_var_database[1]; } if ($_[1] ne "") { $object_database[$_[3] + 7] = $_[1]; } else { $object_database[$_[3] + 7] = $def_var_database[3]; } if ($_[2] ne "") { $object_database[$_[3] + 8] = $_[2]; } else { $object_database[$_[3] + 8] = $def_var_database[5]; } } sub draw_cylinder { my ($length_label); $length_label = length($_[11]); @cylinder_color_array = draw_object_color($_[9]); print OUTPUT "Transform {\n"; print OUTPUT "translation $_[3] $_[4] $_[5]\n"; print OUTPUT "children [\n"; print OUTPUT "Shape {\n"; print OUTPUT "appearance Appearance {\n"; print OUTPUT "material Material {\n"; print OUTPUT "diffuseColor "; print OUTPUT "$cylinder_color_array[0] $cylinder_color_array[1] $cylinder_color_array[2]\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "geometry "; print OUTPUT "$_[0] {\n"; print OUTPUT "radius $_[6]\n"; print OUTPUT "height $_[7]\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "]\n"; print OUTPUT "}\n"; if ($_[11] ne "") { draw_object_text($_[3], $_[4], $_[5], $_[6], $_[7],$_[8],$_[11], $length_label, "cylinder"); } generate_viewpoint($_[3], $_[4], $_[5], "cylinder"); } sub size_cylinder { if ($_[0] ne "") { $object_database[$_[2] + 6] = $_[0]; } else { $object_database[$_[2] + 6] = $def_var_database[7]; } if ($_[1] ne "") { $object_database[$_[2] + 7] = $_[1]; } else { $object_database[$_[2] + 7] = $def_var_database[9]; } } sub draw_sphere { my ($length_label); $length_label = length($_[11]); @sphere_color_array = draw_object_color($_[9]); print OUTPUT "Transform {\n"; print OUTPUT "translation $_[3] $_[4] $_[5]\n"; print OUTPUT "children [\n"; print OUTPUT "Shape {\n"; print OUTPUT "appearance Appearance {\n"; print OUTPUT "material Material {\n"; print OUTPUT "diffuseColor "; print OUTPUT "$sphere_color_array[0] $sphere_color_array[1] $sphere_color_array[2]\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "geometry "; print OUTPUT "$_[0] {\n"; print OUTPUT "radius "; print OUTPUT "$_[6]\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "]\n"; print OUTPUT "}\n"; if ($_[11] ne "") { draw_object_text($_[3], $_[4], $_[5], $_[6], $_[7], $_[8], $_[11], $length_label, "sphere"); } generate_viewpoint($_[3], $_[4], $_[5], "sphere"); } sub size_sphere { if ($_[0] ne "") { $object_database[$_[1] + 6] = $_[0]; } else { $object_database[$_[1] + 6] = $def_var_database[11]; } } sub draw_cone { my ($length_label); $length_label = length($_[11]); @cone_color_array = draw_object_color($_[9]); print OUTPUT "Transform {\n"; print OUTPUT "translation $_[3] $_[4] $_[5]\n"; print OUTPUT "children [\n"; print OUTPUT "Shape {\n"; print OUTPUT "appearance Appearance {\n"; print OUTPUT "material Material {\n"; print OUTPUT "diffuseColor "; print OUTPUT "$cone_color_array[0] $cone_color_array[1] $cone_color_array[2]\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "geometry "; print OUTPUT "$_[0] {\n"; print OUTPUT "bottomRadius $_[6]\n"; print OUTPUT "height $_[7]\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "]\n"; print OUTPUT "}\n"; if ($_[11] ne "") { draw_object_text($_[3], $_[4], $_[5], $_[6], $_[7], $_[8], $_[11], $length_label, "cone"); } generate_viewpoint($_[3], $_[4], $_[5], "cone"); } sub size_cone { if ($_[0] ne "") { $object_database[$_[2] + 6] = $_[0]; } else { $object_database[$_[2] + 6] = $def_var_database[13]; } if ($_[1] ne "") { $object_database[$_[2] + 7] = $_[1]; } else { $object_database[$_[2] + 7] = $def_var_database[15]; } } sub draw_line { my ($length_label); $length_label = length($_[11]); @line_color_array = draw_object_color($_[9]); print OUTPUT "Transform {\n"; print OUTPUT "children [\n"; print OUTPUT "Shape {\n"; print OUTPUT "appearance Appearance {\n"; print OUTPUT "material Material {\n"; print OUTPUT "diffuseColor "; print OUTPUT "$line_color_array[0] $line_color_array[1] $line_color_array[2]\n"; print OUTPUT "emissiveColor "; print OUTPUT "$line_color_array[0] $line_color_array[1] $line_color_array[2]\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "geometry "; print OUTPUT "$_[0] {\n"; print OUTPUT "coord Coordinate {\n"; print OUTPUT "point [\n"; print OUTPUT "$_[3] $_[4] $_[5], $_[6] $_[7] $_[8]\n"; print OUTPUT "]\n"; print OUTPUT "}\n"; print OUTPUT "coordIndex [0, 1, -1]\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "]\n"; print OUTPUT "}\n"; # if ($_[11] ne "") # { draw_object_text($_[3], $_[4], $_[5], $_[6], $_[7], $_[8], $_[11], $length_label, "line"); # } } sub draw_object_text { if ($_[8] eq "box") { $text_position_X; $text_position_Z; $text_position_X = $_[0]-0.3; $text_position_Z = $_[2] + ($_[5]/2) + 0.05; } if (($_[8] eq "cylinder")||($_[8] eq "sphere")||($_[8] eq "cone")) { $text_position_X; $text_position_Z; $text_position_X = $_[0]-0.3; $text_position_Z = $_[2] + $_[3] + 0.05; } if ($_[8] eq "line") { $text_position_X; $text_position_Y; $text_position_Z; if (($_[1] == $_[4])&&($_[2] == $_[5])) { if ($_[3] > $_[0]) { $text_position_X = $_[0] + 0.2; $text_position_Y = $_[1] + 0.1; $text_position_Z = $_[2]; } else { $text_position_X = $_[3] + 0.2; $text_position_Y = $_[4] + 0.1; $text_position_Z = $_[5]; } } else { $text_position_X = ($_[0] + $_[3])/2; $text_position_Y = ($_[1] + $_[4])/2; $text_position_Z = ($_[2] + $_[5])/2; } print OUTPUT "Transform {\n"; print OUTPUT "translation $text_position_X $text_position_Y $text_position_Z\n"; print OUTPUT "children [\n"; print OUTPUT "Shape {\n"; print OUTPUT "geometry Text {\n"; print OUTPUT "string \"$_[6]\"\n"; print OUTPUT "fontStyle FontStyle {\n"; print OUTPUT "size 0.5\n"; print OUTPUT "family \"SERIF\"\n"; print OUTPUT "style \"ITALIC\"\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "]\n"; print OUTPUT "}\n"; } if ($_[8] ne "line") { print OUTPUT "Transform {\n"; print OUTPUT "translation $text_position_X $_[1] $text_position_Z\n"; print OUTPUT "children [\n"; print OUTPUT "Shape {\n"; print OUTPUT "geometry Text {\n"; print OUTPUT "string \"$_[6]\"\n"; print OUTPUT "fontStyle FontStyle {\n"; print OUTPUT "size 0.5\n"; print OUTPUT "family \"SERIF\"\n"; print OUTPUT "style \"ITALIC\"\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "]\n"; print OUTPUT "}\n"; } } sub draw_object_color { @object_color; if ($_[0] eq "") { for ($i=0; $i < 3; $i++) { $object_color[$i] = 1; } } elsif ($_[0] eq "red") { $object_color[0] = 1; $object_color[1] = 0; $object_color[2] = 0; } elsif ($_[0] eq "green") { $object_color[0] = 0; $object_color[1] = 1; $object_color[2] = 0; } elsif ($_[0] eq "blue") { $object_color[0] = 0; $object_color[1] = 0; $object_color[2] = 1; } elsif ($_[0] eq "yellow") { $object_color[0] = 1; $object_color[1] = 1; $object_color[2] = 0.5; } else { $object_color[0] = 1; $object_color[1] = 1; $object_color[2] = 1; } return @object_color; } sub generate_viewpoint { $viewpoint_Z = $_[2] + 3; print OUTPUT "Viewpoint {\n"; print OUTPUT "position $_[0] $_[1] $viewpoint_Z\n"; print OUTPUT "description \"$_[3]\"\n"; print OUTPUT "}\n"; } sub draw_arrow_head { $arrow_head_X; $arrow_head_Y; $arrow_head_Z; if ($_[3] > $_[0]) { $arrow_head_X = $_[3] - 0.3; } elsif ($_[0] eq $_[3]) { $arrow_head_X = $_[3]; } else { $arrow_head_X = $_[3] + 0.3; } if ($_[4] > $_[1]) { $arrow_head_Y = $_[4] - 0.3; } elsif ($_[1] eq $_[4]) { $arrow_head_Y = $_[4]; } else { $arrow_head_Y = $_[4] + 0.3; } if ($_[5] > $_[2]) { $arrow_head_Z = $_[5] - 0.3; } elsif ($_[2] eq $_[5]) { $arrow_head_Z = $_[5]; } else { $arrow_head_Z = $_[5] + 0.3; } print OUTPUT "Transform {\n"; print OUTPUT "translation $arrow_head_X $arrow_head_Y $arrow_head_Z\n"; print OUTPUT "children [\n"; print OUTPUT "Shape {\n"; print OUTPUT "appearance Appearance {\n"; print OUTPUT "material Material {\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "geometry "; print OUTPUT "Cone {\n"; print OUTPUT "bottomRadius 0.3\n"; print OUTPUT "height 0.3\n"; print OUTPUT "}\n"; print OUTPUT "}\n"; print OUTPUT "]\n"; print OUTPUT "}\n"; } sub search_def_var { $size_def_var_database = @def_var_database; $search_var_counter = 0; while ($search_var_counter <= $size_def_var_database) { if ($_[0] eq $def_var_database[$search_var_counter]) { $this_final_value = $def_var_database[$search_var_counter + 1]; } $search_var_counter += 2; } return $this_final_value; } sub search_already_def { $size_def_var_database = @def_var_database; $search_var_counter = 0; $x = 0; while (($x ne 1)&&($search_var_counter <= $size_def_var_database)) { if ($_[0] eq $def_var_database[$search_var_counter]) { $def_var_database[$search_var_counter + 1] = $_[1]; $x = 1; } else { $x = 0; } $search_var_counter += 2; } if ($x eq 0) { $final_var_value = $_[1]; $def_var_database[$var_counter] = $_[0]; $def_var_database[$var_counter + 1] = $final_var_value; $var_counter += 2; } } sub update_def_var_database { $size_def_var_database = @def_var_database; $search_var_counter = 0; while (($x ne 1)&&($search_var_counter <= $size_def_var_database)) { if ($_[0] eq $def_var_database[$search_var_counter]) { $def_var_database[$search_var_counter + 1] = $_[1]; $x = 1; } else { $x = 0; } $search_var_counter += 2; } } sub assign_operations { $var_name = $_[0]; $var_exp = $_[1]; $oper = $_[2]; $def_var_name = $_[3]; print "$var_name\n"; print "$var_exp\n"; print "$oper\n"; print "$def_var_name\n"; if (($def_var_name eq "") && ($oper eq "")) { if ($var_exp == "") { print "$var_name not given a value, Aborting\n"; exit; } else { search_already_def($var_name, $var_exp); } } if (($var_exp eq "") && ($oper eq "")) { $def_var_value = search_def_var($def_var_name); if ($def_var_value == "") { print "$def_var_name not defined, Aborting\n"; exit; } else { $final_var_value = $def_var_value; $def_var_database[$var_counter] = $var_name; $def_var_database[$var_counter + 1] = $final_var_value; $var_counter += 2; } } if (($def_var_name ne "") && ($oper ne "") && ($var_exp ne "")) { $def_var_value = search_def_var($def_var_name); if ($def_var_value eq "") { print "$def_var_name not defined, Aborting\n"; exit; } if ($def_var_name eq $var_name) { if ($oper eq "*") { $final_var_value = $var_exp * $def_var_value; } if ($oper eq "/") { $final_var_value = $var_exp / $def_var_value; } if ($oper eq "-") { $final_var_value = $var_exp - $def_var_value; } if ($oper eq "+") { $final_var_value = $var_exp + $def_var_value; } if ($oper eq "%") { $final_var_value = $var_exp % $def_var_value; } update_def_var_database($var_name, $final_var_value); } if ($def_var_name ne $var_name) { if ($oper eq "*") { $final_var_value = $var_exp * $def_var_value; } if ($oper eq "/") { $final_var_value = $var_exp / $def_var_value; } if ($oper eq "-") { $final_var_value = $var_exp - $def_var_value; } if ($oper eq "+") { $final_var_value = $var_exp + $def_var_value; } if ($oper eq "%") { $final_var_value = $var_exp % $def_var_value; } search_already_def($var_name, $final_var_value); } } print "@def_var_database\n"; } close INPUT,OUTPUT; exit;