I am currently working on polymorphism in class, part of my homework is the classic point inside a shape test. I always have access to the lower left point of the triangle and it is always assumed to be isosceles. Last year I solved this problem using linear inequalites but I found out that method can fail under certain situations. So I am trying the cross product method. It seems to work at least with the dozen or so tests I have preformed. I just wanted a second pair of eyes on it in case there is a situation I may not be considering. Thanks in advance.

bool Triangle::contains (double pX, double pY){
   double lowLeftX;
   double lowLeftY;
   double midX;
   double midY;
   double lowRightX;
   double lowRightY;
   bool inside = false;
   location (lowLeftX, lowLeftY); // access method to get points from 
                                             // shape ancestor
   midX = .5 * base;             // finding top (midX and midY)
   midY = height;                 // and lower Right triangle points
   lowRightX = lowLeftX + base;
   lowRightY = lowLeftY;
   double crossProductA = (pX *(lowLeftY - midY)) + (pY * (midX - lowLeftX)) +
                           (lowLeftX * midY  - midX * lowLeftY);
   double crossProductB = (pX *(midY - lowRightY)) + (pY * (lowRightX - midX)) +
                           (midX * lowRightY  - lowRightX * midY);
   double crossProductC = (pX *(lowLeftY - lowRightY)) + (pY * (lowRightX - lowLeftX)) +
                           (lowLeftX * lowRightY  - lowRightX * lowLeftY);
   crossProductA = .5 * abs(crossProductA);
   crossProductB = .5 * abs(crossProductB);
   crossProductC = .5 * abs(crossProductC);

   if (crossProductA + crossProductB + crossProductC == (.5 * base * height)){
      inside = true;
   return inside;

whoops, forgot to add the lowerleft values to my midX and midY that would make my code only work when the lower left corner of the triangle was at (0, 0). Anyone notice any other mistakes or redundancies?

This article has been dead for over six months. Start a new discussion instead.