题意:如下图,已知A,B,C点坐标,以及AF=2BF,BD=2CD,CE=2AE。求三角形PQR的面积,结果四舍五入取整。
题解:
模板题,贴上模板,直接调用函数即可。先求得D,E,F的坐标,再通过直线相交求得P,Q,R点,最后用叉积求得面积。
代码:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
//基础点和向量运算
struct Point{
double x,y;
Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;
Vector operator + (Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
Vector operator - (Vector A,Vector B){return Vector(A.x-B.x,A.y-B.y);}
Vector operator * (Vector A,double p){return Vector(A.x*p,A.y*p);}
Vector operator / (Vector A,double p){return Vector(A.x/p,A.y/p);}
double Cross(Vector A,Vector B){return A.x*B.y-A.y*B.x;}//叉积
Point GetLineIntersection(Point P,Vector v,Point Q,Vector w)//求直线交点,确保存在交点,即Cross(v,w)非0
{
Vector u=P-Q;
double t=Cross(w,u)/Cross(v,w);
return P+v*t;
}
struct Line{//定义线
Point p,v;
Line(Point p,Point v):p(p),v(v){}
Point point(double a){
return p+(v-p)*a;
}
};
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
Point A,B,C;
scanf("%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y);
Line AB(A,B),BC(B,C),CA(C,A);
Point D,E,F,P,Q,R;
D=BC.point(1.0/3);
E=CA.point(1.0/3);
F=AB.point(1.0/3);
P=GetLineIntersection(B,E-B,A,D-A);
Q=GetLineIntersection(B,E-B,C,F-C);
R=GetLineIntersection(A,D-A,C,F-C);
double ans;
ans=fabs(Cross(Q-P,R-P)/2);
printf("%d\n",(int)(ans+0.5));
}
return 0;
}