该学一下用向量求交点坐标了。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#define eqs 1e-8
using namespace std;
double a = 2.0/3;
double b = 1.0/3;
int main()
{
//freopen("data.txt","r",stdin);
double xax,xay;
double xbx,xby;
double xcx,xcy;
double xfx,xfy;
double xex,xey;
double xdx,xdy;
double xpx,xpy;
double xqx,xqy;
double xrx,xry;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf %lf",&xax,&xay);
scanf("%lf %lf",&xbx,&xby);
scanf("%lf %lf",&xcx,&xcy);
xfx = a*xbx+b*xax; xfy = a*xby+b*xay;
xex = a*xax+b*xcx; xey = a*xay+b*xcy;
xdx = a*xcx+b*xbx; xdy = a*xcy+b*xby;
double linadk,linadb;
int sumad=0;
if(fabs(xax-xdx-0)<=eqs)
{
linadb = xax;
sumad = 0;
}else if(fabs(xay-xdy-0)<=eqs)
{
linadb = xay;
sumad = 1;
}else
{
sumad = 2;
linadk = (xay-xdy)/(xax-xdx);
linadb = xay - linadk * xax;
}
double linfck,linfcb;
int sumfc=0;
if(fabs(xfx-xcx-0)<=eqs)
{
linfcb = xfx;
sumfc = 0;
}else if(fabs(xfy-xcy-0)<=eqs)
{
linfcb = xay;
sumfc = 1;
}else
{
sumfc = 2;
linfck = (xfy-xcy)/(xfx-xcx);
linfcb = xfy - linfck * xfx;
}
double linbek,linbeb;
int sumbe=0;
if(fabs(xbx-xex-0)<=eqs)
{
linbeb = xbx;
sumbe = 0;
}else if(fabs(xby-xey-0)<=eqs)
{
linbeb = xby;
sumbe = 1;
}else
{
sumbe = 2;
linbek = (xby-xey)/(xbx-xex);
linbeb = xby - linbek * xbx;
}
if(sumfc==0)
{
xrx = linfcb;
if(sumad==1)
{
xry = linadb;
}else if(sumad==2)
{
xry = linadk*xrx+linadb;
}
xqx = linfcb;
if(sumbe==1)
{
xqy = linbeb;
}else if(sumbe==2)
{
xqy = linbek*xqx+linbeb;
}
}else if(sumfc==1)
{
xry = linfcb;
if(sumad==0)
{
xrx = linadb;
}else if(sumad==2)
{
xrx = (xry-linadb)/linadk;
}
xqy = linfcb;
if(sumbe==0)
{
xqx = linbeb;
}else if(sumbe==2)
{
xqx = (xqy-linbeb)/linbek;
}
}else
{
if(sumad==0)
{
xrx = linadb;
xry = xrx*linfck+linfcb;
}else if(sumad==1)
{
xry = linadb;
xrx = (xry-linfcb)/linfck;
}else if(sumad==2)
{
xrx = (linfcb-linadb)/(linadk-linfck);
xry = linfck * xrx + linfcb;
}
if(sumbe==0)
{
xqx = linbeb;
xqy = xqx*linfck+linfcb;
}else if(sumbe==1)
{
xqy = linbeb;
xqx = (xqy-linfcb)/linfck;
}else if(sumad==2)
{
xqx = (linfcb-linbeb)/(linbek-linfck);
xqy = linfck * xqx + linfcb;
}
}
if(sumbe==0)
{
xpx = linbeb;
if(sumad==1)
{
xpy = linadb;
}else if(sumad==2)
{
xpy = linadk*xpx+linadb;
}
}else if(sumbe==1)
{
xpy = linbeb;
if(sumad==0)
{
xpx = linadb;
}else if(sumad==2)
{
xpx = (xpy-linadb)/linadk;
}
}else if(sumbe==2)
{
if(sumad==0)
{
xpx = linadb;
xpy = xrx*linbek+linbeb;
}else if(sumad==1)
{
xpy = linadb;
xpx = (xry-linbeb)/linbek;
}else if(sumad==2)
{
xpx = (linbeb-linadb)/(linadk-linbek);
xpy = linbek * xpx + linbeb;
}
}
double ans = 0;
ans+=(xpx*xqy-xpy*xqx);
ans+=(xqx*xry-xqy*xrx);
ans+=(xrx*xpy-xry*xpx);
if(ans<0)
{
ans = ans * -1;
}
ans = ans/2;
printf("%.0lf\n",ans);
}
return 0;
}