Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果点位于三角形内(当点位于三角形边界上时提供帮助)_C_Geometry - Fatal编程技术网

C 如果点位于三角形内(当点位于三角形边界上时提供帮助)

C 如果点位于三角形内(当点位于三角形边界上时提供帮助),c,geometry,C,Geometry,下面的代码测试一个点是否在三角形内,它会正确地执行所有操作,但每当我在三角形边界上指定一个点时,它就会说它在三角形外(我希望它在三角形内)。有人能找出什么问题吗?(我没有写下面的代码,所以请理解我的风格是可怕的忽略它…相信我,在我清理之前它更糟) 假设我输入了顶点为A(0,0)B(10,0)C(0,10)和点(5,0)的三角形,它仍然会显示为三角形的外部 #include <stdio.h> int test2( double px, double py, double m, do

下面的代码测试一个点是否在三角形内,它会正确地执行所有操作,但每当我在三角形边界上指定一个点时,它就会说它在三角形外(我希望它在三角形内)。有人能找出什么问题吗?(我没有写下面的代码,所以请理解我的风格是可怕的忽略它…相信我,在我清理之前它更糟)

假设我输入了顶点为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;    
}
#包括
int test2(双px,双py,双m,双b){
如果(pyline1=((px我马上想到的一件事是,你正在使用
=
比较双倍。这种比较从来都不准确,可能会产生令人惊讶的结果。最好像
fabs(d1-d2)<1e-3
这样比较双倍的相等性。

int test2(双px、双py、双m、双b){
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
}
}
如果(py

我认为在上述方法中返回的返回值存在问题。这些条件对于具有不同坡度的线是不同的。这些检查仅对m>0和m有效,您是否可以解释“点在线上”和“点在线上”。我们使用点梯度方程y=mx+b来确定点是否在线上(位于三角形的一侧),在线的下方或线上。我已经知道。我可以闻到,您的检查条件中肯定存在一些问题。基本上,通过这些检查,您可以确定点是在线的左侧还是右侧。但是,对于具有不同坡度的线,这些条件会有所不同。这些检查仅对m>0有效,并且mI尚未了解到e fabs函数(忘了添加家庭作业选项卡)。没有什么特别的,它只是返回给定变量的绝对值。它在
math.h
中声明。感谢纳文,我宁愿说我不允许使用我们还没有学过的东西。@Carpe Diem:if(pym*px+b+1e-3){return 1;}else{return 0;}不,仍然没有。我关心tritest函数返回的内容…”return line1&&line2&&line3它是如何返回3个值的?那么@Algorithmist会发生什么情况?@Carpe您能澄清一下您的说法吗。
return line1&&line2&&line3;
这是做什么的?您能举个例子说明它将返回什么吗?return关键字将只返回一项。“line1&&line2&&line3”表示在三个“行”上执行的逻辑AND操作因此,如果条件为假,tritest将返回0,否则返回1(真)。