Math-Zap

 view release on metacpan or  search on metacpan

pod/triangle2.pod  view on Meta::CPAN

  {my ($t, $T) = @_; 
   check(@_) if debug; # Triangles
 
   return 1 if $t->containsPoint($T->a) and
               $t->containsPoint($T->b) and
               $t->containsPoint($T->c);   
   0;
  }
 
 


=head3 pointsInCommon


Find points in common to two triangles.  A point in common is a point
on the border of one triangle touched by the border of the other
triangle.


 
 
 sub pointsInCommon($$)
  {my ($t, $T) = @_; 
   check(@_) if debug; # Triangles
 
   return ($T->a, $T->b, $T->c) if $t->contains($T);
   return ($t->a, $t->b, $t->c) if $T->contains($t);
 
   my @p = ();
   push @p, $t->a if $T->containsPoint($t->a);  
   push @p, $t->b if $T->containsPoint($t->b);  
   push @p, $t->c if $T->containsPoint($t->c);
 
   push @p, $T->a if $t->containsPoint($T->a);  
   push @p, $T->b if $t->containsPoint($T->b);  
   push @p, $T->c if $t->containsPoint($T->c);
   
   push @p, $t->lab->intersect($T->lab) if $t->lab->crossOver($T->lab); 
   push @p, $t->lab->intersect($T->lac) if $t->lab->crossOver($T->lac); 
   push @p, $t->lab->intersect($T->lbc) if $t->lab->crossOver($T->lbc); 
   push @p, $t->lac->intersect($T->lab) if $t->lac->crossOver($T->lab); 
   push @p, $t->lac->intersect($T->lac) if $t->lac->crossOver($T->lac); 
   push @p, $t->lac->intersect($T->lbc) if $t->lac->crossOver($T->lbc);
   push @p, $t->lbc->intersect($T->lab) if $t->lbc->crossOver($T->lab); 
   push @p, $t->lbc->intersect($T->lac) if $t->lbc->crossOver($T->lac); 
   push @p, $t->lbc->intersect($T->lbc) if $t->lbc->crossOver($T->lbc);
 
 # Remove duplicate points caused by splitting the vertices - inefficient and unreliable
   my %p;
   $p{"$_"}=$_ for(@p);
   values(%p); 
  }
 
 


=head3 ring


Ring of points formed by overlaying triangle t and T


 
 
 sub ring($$)
  {my ($t, $T) = @_; 
   check(@_) if debug; # Triangles
 
   my @p = $t->pointsInCommon($T);
 # scalar(@p) == 1 and warn "Only one point in common";
 # scalar(@p) == 2 and warn "Only two points in common";
   return () unless scalar(@p) > 2;
 
 # Find center
   my $c = vector2(0,0);
   $c += $_ for(@p);
   $c /= scalar(@p);
 
 # Split by y coord   
   my (@yp, @yn);
   for my $p(0..@p-1)
    {return () if ($p[$p]-$c)->length < $accuracy;
     if (($p[$p]-$c)->y >= 0)
      {push @yp, $p;
      }
     else
      {push @yn, $p;
      }
    }
 
   @yp = sort {($p[$a]-$c)->norm->x <=> ($p[$b]-$c)->norm->x} @yp;
   @yn = sort {($p[$b]-$c)->norm->x <=> ($p[$a]-$c)->norm->x} @yn;
 
   my @a;
   push @a, $p[$_] for(@yp);
   push @a, $p[$_] for(@yn);
   @a;
  }
 
 


=head3 convertPlaneToSpace


Convert plane to space coordinates                                   


 
 
 sub convertPlaneToSpace($$)
  {my ($t, $p) = @_;                               
            check(@_[0..0]) if debug; # Triangle  
   vector2Check(@_[1..1]) if debug; # Vector in plane
    
   $t->a + ($p->x * $t->ab) + ($p->y * $t->ac);
  }
 
 



( run in 0.863 second using v1.01-cache-2.11-cpan-39bf76dae61 )