(福建工程大ACM程序設計覆盤)C題簡單幾何

小明在上學的路上,看到了小花,小花也看見了他,兩我的深情的對視了一下,而後小花就對小明說:你愛過我嗎?小明說:愛過。小花就對小明說,那你能幫我作一個題目嗎?若是你能作對的話,就證實你愛過我。小明自信的回答好啊。小花說,給你三我的的座標,以及小花的座標,她想知道她是否是處在他們三我的的範圍以內。小明頓時慌了,早知道我就不說了,他趕忙找到了acmer來幫他解決了。html

 

原題網址:https://ac.nowcoder.com/acm/contest/289/Dios

涉及的幾何原理:http://www.javashuo.com/article/p-zyqsmciz-mt.html算法

總結:1.面積法:利用已知三點,求出一組共點向量,用兩向量叉乘獲得的係數行列式除以二,便可獲得三角形面積該算法在結果的精度以及算法的代碼量都比海倫公式法更優秀。函數

      2.叉乘法:假設三角形的三個點按照順時針(或者逆時針)順序是A,B,C。對於某一點P,求出三個向量PA,PB,PC, 而後計算如下三個叉乘(^表示叉乘符號):spa

t1 = PA^PB,code

t2 = PB^PC,htm

t3 = PC^PA,blog

若是t1,t2,t3同號(同正或同負),那麼P在三角形內部,不然在外部。ci

該題能夠直接利用向量的叉乘算出三角形面積,經過三角形面積之和來判斷點p是否在三角形內部get

#include <iostream>
#include <cmath>
using namespace std;
int S(int x1,int y1,int x2,int y2,int x,int y)
{
    return  x1*y2+x*y1+x2*y-x1*y-x*y2-x2*y1;                //向量叉乘行列式的計算
}
int main()
{
    int x1,y1,x2,y2,x3,y3,x,y;
    while(cin>>x1>>y1>>x2>>y2>>x3>>y3>>x>>y)
    {
        if(abs(S(x1,y1,x2,y2,x3,y3))==abs(S(x1,y1,x2,y2,x,y))+abs(S(x1,y1,x3,y3,x,y))+abs(S(x2,y2,x3,y3,x,y))) //向量叉乘存在正負號,用abs函數比較絕對值
        cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
 } 
相關文章
相關標籤/搜索