sincerit 內心裡的一把火(叉積公式求面積)
阿新 • • 發佈:2018-12-23
連結:https://ac.nowcoder.com/acm/contest/289/D
來源:牛客網
題目描述
小明在上學的路上,看到了小花,小花也看見了他,兩個人深情的對視了一下,然後小花就對小明說:你愛過我嗎?小明說:愛過。小花就對小明說,那你能幫我做一個題目嗎?如果你能做對的話,就證明你愛過我。小明自信的回答好啊。小花說,給你三個人的座標,以及小花的座標,她想知道她是不是處在他們三個人的範圍之內。小明頓時慌了,早知道我就不說了,他趕緊找到了acmer來幫他解決了。
輸入描述:
多組輸入,輸入A,B,C的座標(x1,y1,x2,y2,x3,y3),以及小花的座標(x,y)。(範圍都是在0到100之內的整數)
輸出描述:
是的話就輸出YES,否則輸出NO
示例1
輸入
複製
0 0 3 0 0 4
1 1
輸出
複製
YES
看到題的最直觀的思路就是看三角形 Sapc + Sapb + Sbpc == Sabc 這三個小三角下的面積是否等於三角形abc的面積,這裡利用叉積公式求面積(適用於知道點的座標)
a(x1, y1), b(x2, y2), c(x3, y3), p(x, y);
以ab和ac為平行四邊形的面積是
ab向量 (x2-x1, y2-y1)
ac向量 (x3-x1, y3-y1) — 這裡當成2階行列式求解
Sabc = fabs( (x2-x1)(y3-y1) - (y2-y1)(x3-x1) ) / 2
特別注意:以上用叉積求得的面積是有向面積有正有負,
當Sabc < 0 時逆時針給出三角形,否則順時針。
順時針圖
逆時針圖
#include<stdio.h>
#include<math.h>
int main(){
double x1,y1,x2,y2,x3,y3;
double x,y;
double X1,X2,X3,Y1,Y2,Y3;
while(~scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3,&x,&y)){
float ST,S1,S2,S3;
ST=fabs( x1*y2+x2*y3+x3*y1- x2*y1-x3*y2-x1*y3)/2;
S1=fabs(x1*y+x*y2+x2*y1-x*y1-x2*y-x1*y2)/2;
S2=fabs(x*y3+x3*y1+x1*y-x3*y-x1*y3-x*y1)/2;
S3=fabs(x3*y+x*y2+x2*y3- x*y3-x2*y-x3*y2)/2;
if(ST==S1+S2+S3)printf("YES\n");
else printf("NO\n");
}
return 0;
}