关于判断一个点与三角形的位置关系

题目如下:

读入一点的坐标和三角形的顶点坐标,判断该点在三角形内,在三角形边界上,还是在边界之外。

Input 

4个点坐标,每个一行。

Output 

点在三角形内,输出In 
点在三角形边上,输出On 
点在三角形外,输出Out

Sample Input 


0 0
-1 0
1 0
0 1

Sample Output 


On

具体分析

可用判断面积的关系解决:

释:先求出原三角形的面积(记为S),后求出以要求点为顶点分别以三角形三边为顶点的三角形面积(记为s1,s2,s3)之和(下文用面积和和原面积来分别表示);

  可通过比较面积之和预原三角形面积之间的关系来初步判断二者位置关系;

(只会有两种结果:面积和大于原面积,或:面积和等于原面积:)

若大于的话:

可判断该点在原三角形以外。

若为等于的话:

1则分以下两种情况

(1):点在三角形上

(2):点在三角形内。

2:

对两种情况加以分析:

若在三角形上的话可知s1,s2,s3中有一为零,可判断结果为在三角形上;

否则则为在三角形内部。

OK》

补充一下:

可用斜率来判断是否共线来判断是否在三角形上取代上面的2后面那步。

还有,需要补充一个公式:海伦公式‘

海伦公式: 

或自己百度也可。用此公式可用三边直接求面积。至于怎么求边长就不用教了吧。

 

配图如上。

还不懂回初中吧( ̄▽ ̄)~*

现在,初步进行编码。

#include<stdio.h>
#include<math.h>
int main()
{
    double x1,x2,x3,x4,y1,y2,y3,y4;
    double a,b,c,q,w,e;
    double k1,k2,k3,k4,k5;
    double h,j,k,l,s,s1,s2,s3,s4;
    scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x4,&y4,&x1,&y1,&x2,&y2,&x3,&y3);
    a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    b=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
    c=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
    q=sqrt((x4-x1)*(x4-x1)+(y4-y1)*(y4-y1));
    w=sqrt((x4-x2)*(x4-x2)+(y4-y2)*(y4-y2));
    e=sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3));
    h=(a+b+c)/2;
    j=(a+q+w)/2;
    k=(b+q+e)/2;
    l=(c+w+e)/2;
    s1=sqrt(h*(h-a)*(h-b)*(h-c));
    s2=sqrt(j*(j-a)*(j-q)*(j-w));
    s3=sqrt(k*(k-b)*(k-q)*(k-e));
    s4=sqrt(l*(l-c)*(l-w)*(l-e));
    s=s2+s3+s4;
    if(s-s1>=0.00001)
    {
        printf("Out\n");
    }
    else
    {
        if(q+w-a<0.00001 || q+e-b<0.00001 || w+e-c<0.00001)
        printf("On\n");
        else
        printf("In\n");
    }
    return 0;
}

 

此版为不用斜率的版本。

斜率的话可以自己改编。

注:考虑到开方等造成的误差故用0.00001.

本人已经提交AC,测试没有问题。

 

 

 

如有专业人士找到问题,请加以指正。

谢谢。

posted @ 2019-10-31 23:22  Mr小明同学  阅读(2573)  评论(0编辑  收藏  举报