關於判斷一個點與三角形的位置關系


題目如下:

讀入一點的坐標和三角形的頂點坐標,判斷該點在三角形內,在三角形邊界上,還是在邊界之外。

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,測試沒有問題。

 

 

 

如有專業人士找到問題,請加以指正。

謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM