2011-05-31 34 views
1

下面的代码测试一个点是否在三角形内部,它正确地执行了所有操作,但每当我在三角形的边界上指定一个点时,它在外面(我希望它在里面)。任何人都可以弄清楚什么是错的? (我没有写下面的代码,所以请我理解风格是可怕的忽略它......相信我在清理之前更糟糕)。如果我输入三角形的顶点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;  
} 
+0

您能否解释“点是在线”和“点在线”。 – Algorithmist 2011-05-31 12:49:10

+0

我们使用点梯度方程y = mx + b来确定点是在线之上(在三角形的边上),在线之下还是线上。 – 2011-05-31 12:52:57

+0

,我已经知道了。而且我可以闻到,在你的检查条件中肯定存在一些问题。基本上,通过这些检查,你正在确定点是在左边还是右边。但是这种情况对于具有不同斜率的线是不同的这些检查仅适用于m> 0和m <1的情况。 – Algorithmist 2011-05-31 13:01:52

回答

3

一件事是,你正在使用==。这比较比较双打是永远准确,可能会产生suprising结果。最好做一些像fabs(d1-d2) < 1e-3这样的比较双打的平等。

+0

我还没有学过晶圆厂功能(忘了添加作业标签)。 – 2011-05-31 12:51:54

+0

那里没什么特别的,它只是返回给定变量的绝对值。它在'math.h'中声明。 – Naveen 2011-05-31 12:54:02

+0

谢谢纳文,我宁愿说我不允许使用我们还没有学到的东西。 – 2011-05-31 12:55:39

0
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 
} 
} 

我觉得有问题,你在上面method.These条件回国人员会用不同slopes.These检查线是不同的返回值仅适用于M> 0和m < 1.And您代码运行良好,因为fluke。测试不同斜率线的代码。

+0

好吧,让我摆弄这个.. – 2011-05-31 12:59:27

+0

不,还是没有。我很担心最新的函数返回什么......“return line1 && line2 && line3;”它如何返回3个值?那么@Algorithmist会发生什么? – 2011-05-31 13:06:32

+0

@Carpe能否澄清你的说法。 – Algorithmist 2011-05-31 13:11:01