Если точка находится внутри треугольника (помогите, когда точка находится на границе треугольника) - PullRequest
1 голос
/ 31 мая 2011

Следующий код проверяет, находится ли точка внутри треугольника или нет, она делает все правильно, но всякий раз, когда я указываю точку на границе треугольника, она говорит, что она находится снаружи (я хочу, чтобы она была внутри).Может кто нибудь разобраться в чем дело?(Я не писал следующий код, поэтому, пожалуйста, я понимаю, что стиль ужасен, игнорируйте его ... поверьте мне, это было хуже, прежде чем я очистил).

Скажите, если я вошел в треугольник с вершинами A (0,0) B (10,0) C (0,10) и точка (5,0) все равно будет отображаться как вне треугольника!

#include <stdio.h>

int test2( double px, double py, double m, double b ) {    
    if (py < m * px + b ) {
        return -1; // point is under line
    }else if ( py == m * px + b ){
        return 0; // point is on line
    } else {
        return 1; // point is over line
    }
}

int test1(double px, double py, double m,double b, double lx,double ly) {     
   return (test2(px,py, m,b) == test2(lx,ly,m,b));    
}

int tritest (double x0,double y0,double x1,double y1,double x2,double y2,double px, double py) {

   int line1, line2, line3;    
   double m01 = (y1-y0)/(x1-x0);    
   double b01 = m01 * -x1 + y1;    
   double m02, m12, b02, b12;    
   m02 = (y2-y0)/(x2-x0);    
   m12 = (y2-y1)/(x2-x1);    
   b02 = m02 * -x2 + y2;    
   b12 = m12 * -x2 + y2;

   // vertical line checks

   if( x1 == x0 ) {    
      line1 = ( (px <= x0) == (x2 <= x0) );    
   } else {    
      line1 = test1( px, py, m01, b01,x2,y2);    
   }

   if( x1 == x2 ) {    
      line2 = ( (px <= x2) == (x0 <= x2) );    
   } else {    
      line2 = test1(px,py, m12, b12,x0,y0);    
   }

   if( x2 == x0 ) {    
      line3 = ( (px <= x0 ) == (x1 <= x0) );} else {    
      line3 = test1(px, py, m02,b02,x1,y1);    
   }

   return line1 && line2 && line3;
}

int main(int argc, char* argv[]) {    
   double x0,y0,x1,y1,x2,y2,px;    
   double py;    
   int scanfsReturnValueAggregatedOverAllScanfs = 0;

   // get input

   printf("Triangle Vertex A (enter x,y): "); scanfsReturnValueAggregatedOverAllScanfs += scanf("%lf,%lf", &x0,&y0);    
   printf("\nTriangle Vertex B (enter x,y): "); scanfsReturnValueAggregatedOverAllScanfs += scanf("%lf,%lf", &x1,&y1);    
   printf("\nTriangle Vertex C (enter x,y): "); scanfsReturnValueAggregatedOverAllScanfs += scanf("%lf,%lf", &x2,&y2);    
   printf("\nTest Point (enter x,y): "); scanfsReturnValueAggregatedOverAllScanfs += scanf("%lf,%lf", &px,&py);
   // print error

   if( scanfsReturnValueAggregatedOverAllScanfs != 8 ) {    
      printf("You're stup** and didn't put in the right inputs!\n");    
      return 1;    
   }

   // print answer

   printf("\nThe point is ");

   if (tritest(x0,y0,x1,y1,x2,y2,px,py)) {    
      printf("INSIDE");    
   } else {    
      printf("OUTSIDE");    
   }

   printf(" the Triangle\n");

   // return 0

   return 0;    
}

Ответы [ 2 ]

3 голосов
/ 31 мая 2011

Одна вещь, которая сразу приходит мне в голову, это то, что вы сравниваете двойные числа, используя ==. Это сравнение никогда не бывает точным и может привести к удивительным результатам.Лучше сделать что-то вроде fabs(d1-d2) < 1e-3, чтобы сравнить двойники на равенство.

0 голосов
/ 31 мая 2011
int test2( double px, double py, double m, double b ) {

if (py < m * px + b ) {
    return -1; 
}else if ( py == m * px + b ){
    return 0;  //Should be return 1 as point is on line.Thus inside the triangle
} else {
    return 1; //should be return 0 as point is outside this line
}
}

Я думаю, что есть проблема в возвращаемых значениях, которые вы возвращаете в вышеупомянутом методе. Эти условия будут отличаться для линий с разными наклонами. Эти проверки действительны только для m> 0 и m <1. И ваш кодработает хорошо из-за <strong>случайности . Проверьте Ваш код для линий с различными уклонами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...