view old/tmp/outer.pl @ 598:a64e729a8072

normal vector fix script
author e065725@kinjyo.cr.ie.u-ryukyu.ac.jp
date Thu, 05 Nov 2009 22:00:10 +0900
parents
children
line wrap: on
line source

#!/usr/bin/perl

# fix Cerium xml normal vector

my $i = -1;
my (@x,@y,@z);
my @cord;
my $fix = 1;

sub v {
   print "$x[0] $y[0] $z[0]\n";
   print "$x[1] $y[1] $z[1]\n";
   print "$x[2] $y[2] $z[2]\n";
}

sub outer {
    my ($ax,$ay,$az) = (
         $x[1]-$x[0],
         $y[1]-$y[0],
         $z[1]-$z[0],
    );
    my ($bx,$by,$bz) = (
         $x[2]-$x[0],
         $y[2]-$y[0],
         $z[2]-$z[0],
    );
    my ($ox,$oy,$oz) = (
         $ay*$bz - $az*$by,
        -$ax*$bz + $az*$bx,
         $ax*$by - $ay*$bx,
    );
    my($r) = sqrt($ox*$ox+$oy*$oy+$oz*$oz);
    ($ox,$oy,$oz) = ($ox/$r,$oy/$r,$oz/$r);
    push(@cord, [$ox,$oy,$oz]);
    # print "    $ox   $oy   $oz\n";
}

while(<>) {
    if (! $fix) {
	    if (/<sur/) {
		print;
		next;    
	    }
     }
    if (/<normal/) {
       $i= -2;
       print if ($fix);
       next;
    }
    if (/<\/normal/) {
       $i = -1;
       print if ($fix);
       next;
    }
    if ( $i < -1) {
       if ($i== -4) {
	       my $cord = shift(@cord);
                if ($fix) {
		print "  $cord->[0]  $cord->[1]  $cord->[2]  \n";
		print "  $cord->[0]  $cord->[1]  $cord->[2]  \n";
		print "  $cord->[0]  $cord->[1]  $cord->[2]  \n";
                } else {
			print "outer $i   $cord->[0]  $cord->[1]  $cord->[2]  \n";
			print ;
                }
          $i = -2;
        } else {
           $i--;
        }
        next;
    }
       print if ($fix);
    if (/<\/coord/) {
       $i = -1;
       next;
    }
    if (/<coord/) {
      @cord = ();
      $i=0;
      next;
    } 
    if ($i<0) {
       next; 
    }
    if (/([-]*[.\d]+)\s+([-]*[.\d]+)\s+([-]*[.\d]+)/) {
         ($x[$i],$y[$i],$z[$i]) = ($1,$2,$3);
#       print "$i $_";
        if ($i==2) {
              &outer;
   	      $i = 0;
              next;
        }
        $i++;     
    } else {
       $i = -1;
    }
}

# end