生活随笔
收集整理的這篇文章主要介紹了
UVA - 11437 Triangle Fun(简单几何)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出三個頂點A,B,C組成三角形,如題目中的圖片所示,規定D,E,F分別為三條邊的三等分點,現在要求三角形RPQ的面積
題目分析:利用向量先求出DEF三點,再利用線段相交求出RPQ三點,最后利用海倫公式直接求答案,還是考察了模板的配合
代碼:
?
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e5+100; //字符串長度最大值const double eps = 1e-8;int sgn(double x){if(fabs(x) < eps)return 0;if(x < 0)return -1;else return 1;
}struct Point{double x,y;Point(){}Point(double _x,double _y){x = _x;y = _y;}void input(){scanf("%lf%lf",&x,&y);}//返回兩點的距離double distance(Point p){return hypot(x-p.x,y-p.y);}Point operator +(const Point &b)const{return Point(x+b.x,y+b.y);}Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}//叉積double operator ^(const Point &b)const{return x*b.y - y*b.x;}//點積double operator *(const Point &b)const{return x*b.x + y*b.y;}Point operator /(const double &k)const{return Point(x/k,y/k);}
};struct Line{Point s,e;Line(){}Line(Point _s,Point _e){s = _s;e = _e;}//`兩線段相交判斷`//`2 規范相交`//`1 非規范相交`//`0 不相交`int segcrossseg(Line v){int d1 = sgn((e-s)^(v.s-s));int d2 = sgn((e-s)^(v.e-s));int d3 = sgn((v.e-v.s)^(s-v.s));int d4 = sgn((v.e-v.s)^(e-v.s));if( (d1^d2)==-2 && (d3^d4)==-2 )return 2;return (d1==0 && sgn((v.s-s)*(v.s-e))<=0) ||(d2==0 && sgn((v.e-s)*(v.e-e))<=0) ||(d3==0 && sgn((s-v.s)*(s-v.e))<=0) ||(d4==0 && sgn((e-v.s)*(e-v.e))<=0);}//`求兩直線的交點`//`要保證兩直線不平行或重合`Point crosspoint(Line v){double a1 = (v.e-v.s)^(s-v.s);double a2 = (v.e-v.s)^(e-v.s);return Point((s.x*a2-e.x*a1)/(a2-a1),(s.y*a2-e.y*a1)/(a2-a1));}
};Point get_point(Point a,Point b)
{return a+(b-a)/3;
}Point get_point(Line a,Line b)
{return a.crosspoint(b);
}double area(Point a,Point b,Point c)
{double lena=a.distance(b);double lenb=a.distance(c);double lenc=b.distance(c);double p=(lena+lenb+lenc)/2;return sqrt(p*(p-lena)*(p-lenb)*(p-lenc));
}int main()
{
// freopen("input.txt","r",stdin);
// ios::sync_with_stdio(false);int w;cin>>w;while(w--){Point A,B,C;A.input(),B.input(),C.input();Point D,E,F;D=get_point(B,C);E=get_point(C,A);F=get_point(A,B);Point P,Q,R;P=get_point(Line(B,E),Line(A,D));Q=get_point(Line(C,F),Line(B,E));R=get_point(Line(C,F),Line(A,D));printf("%.0f\n",area(P,Q,R));}return 0;
}
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的UVA - 11437 Triangle Fun(简单几何)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。