GYM 100182 B.Euclid(计算几何)

    xiaoxiao2021-03-25  36

    Description 给出A,B,C,D,E,F的坐标,求H和G点坐标使得平行四边形ABGH的面积与三角形DEF面积相等 Input 多组用例,每组用例十二个实数表示六个点的横纵坐标,以12个0结束输入 Output 对于每组用例,输出G点和H点的横纵坐标 Sample Input 0 0 5 0 0 5 3 2 7 2 0 4 1.3 2.6 12.1 4.5 8.1 13.7 2.2 0.1 9.8 6.6 1.9 6.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 Sample Output 5.000 0.800 0.000 0.800 13.756 7.204 2.956 5.304 Solution 先求出以AB和AC为边的平行四边形面积和三角形DEF的面积,这两个面积的比值就是AC与AH长度的比值,然后就可以求出H点坐标,G点坐标通过A,B,H三点既可得到 Code

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> using namespace std; typedef long long ll; #define INF 0x3f3f3f3f #define maxn 1111 struct node { double x,y; void in() { scanf("%lf%lf",&x,&y); } }A,B,C,D,E,F,G,H; double dis(node a,node b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double angle(node a,node b,node c) { double x1=b.x-a.x,y1=b.y-a.y; double x2=c.x-a.x,y2=c.y-a.y; return abs(x1*x2+y1*y2)/(dis(a,c)*dis(a,b)); } double area(node a,node b,node c) { double x1=b.x-a.x,y1=b.y-a.y; double x2=c.x-a.x,y2=c.y-a.y; return abs(x1*y2-x2*y1)*0.5; } int main() { while(1) { A.in(),B.in(),C.in(),D.in(),E.in(),F.in(); if(A.x==0.&&A.y==0.&&B.x==0.&&B.y==0.&&C.x==0.&&C.y==0.&&D.x==0.&&D.y==0.&&E.x==0.&&E.y==0.&&F.x==0.&&F.y==0.) break; double S=2.0*area(A,B,C),s=area(D,E,F); double d=S/s; H.x=(C.x+(d-1.0)*A.x)/d,H.y=(C.y+(d-1.0)*A.y)/d; G.x=B.x+H.x-A.x,G.y=B.y+H.y-A.y; printf("%.3f %.3f %.3f %.3f\n",G.x,G.y,H.x,H.y); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-27389.html

    最新回复(0)