用面積關系及海倫公式判斷一點雨三角形的位置關系
題目如下:
讀入一點的坐标和三角形的頂點坐标,判斷該點在三角形内,在三角形邊界上,還是在邊界之外。
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後面那步。
還有,需要補充一個公式:海倫公式‘
海倫公式:
。
詳情見網頁:https://baike.baidu.com/item/%E6%B5%B7%E4%BC%A6%E5%85%AC%E5%BC%8F/106956?fr=aladdin
或自己百度也可。用此公式可用三邊直接求面積。至于怎麼求邊長就不用教了吧。

配圖如上。
還不懂回國中吧( ̄▽ ̄)~*
現在,初步進行編碼。
#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,測試沒有問題。
如有專業人士找到問題,請加以指正。
謝謝。
個人作品,
如有錯誤,請指出;
如要轉載,請注明出處。
三克油。。