就是给一个三角形,然后给出一些关系,以及一些点的坐标,最后求一个三角形面积就好了。
我的做法:
用向量的方法推出离线段一个端点最近的三等分点的表达式
用行列式解线性方程推出求两直线交点的表达式
用叉积求三角形面积
用小数点后第一位对整数部分进行四舍五入求得离这个实数最近的整数
我的代码如下:
#include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<algorithm> using namespace std; struct Dot { double x,y; Dot(){} Dot(double a,double b){x=a,y=b;} }; Dot operator - (Dot a,Dot b){return Dot(b.x-a.x,b.y-a.y);} double operator * (Dot a,Dot b){return a.x*b.y-b.x*a.y;} double area(Dot a,Dot b,Dot c){return fabs((b-a)*(c-a));} Dot cross(Dot a,Dot b,Dot c,Dot d) { double e,f,g,h,i,j,k,l,m; e=b.y-a.y;f=a.x-b.x;g=a.x*b.y-a.y*b.x; h=d.y-c.y;i=c.x-d.x;j=c.x*d.y-c.y*d.x; k=Dot(e,h)*Dot(f,i); l=Dot(g,j)*Dot(f,i); m=Dot(e,h)*Dot(g,j); return Dot(l/k,m/k); } Dot d3(Dot a,Dot b){return Dot((2*a.x+b.x)/3,(2*a.y+b.y)/3);} int main() { int n,ans; Dot a,b,c,d,e,f,p,q,r; cin>>n; while(n--) { cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y; d=d3(b,c); e=d3(c,a); f=d3(a,b); p=cross(b,e,d,a); q=cross(b,e,c,f); r=cross(d,a,c,f); ans=0.5+area(p,q,r)/2; printf("%d\n",ans); } }
时间: 2024-11-08 07:03:36