1. 程式人生 > >sincerit 內心裡的一把火(叉積公式求面積)

sincerit 內心裡的一把火(叉積公式求面積)

連結: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; }