UVA 11178旋转边求交点

    xiaoxiao2026-03-05  7

    题意:给你三角形的三个点A,B,C,求他们角的三等分线相交组成的等边三角形的坐标。

    题解:简单计算几何,用好旋转即可。

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; #define pi acos(-1.0) #define eps 1e-8 struct node{ double x,y; }; node operator + (node a,node b){ node s; s.x=a.x+b.x; s.y=a.y+b.y; return s; } node operator - (node a,node b){ node s; s.x=a.x-b.x; s.y=a.y-b.y; return s; } node intersection(node u1,node u2,node v1,node v2){//求两直线交点 u1 u2代表直线1的两个点 v1 v2代表直线2的两个点 node ret=u1; double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x)) /((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x)); ret.x+=(u2.x-u1.x)*t; ret.y+=(u2.y-u1.y)*t; return ret; } node Rotate(node A,double rad){//逆时针旋转 return (node){A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad)}; } int main(){ int t; scanf("%d",&t); while(t--){ node a,b,c; scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y); double A=acos((bb*bb+cc*cc-aa*aa)/2/bb/cc);//角A double B=acos((aa*aa+cc*cc-bb*bb)/2/aa/cc);//角B double C=acos((aa*aa+bb*bb-cc*cc)/2/aa/bb);//角C node ab30=Rotate(b-a,A/3);//以a为定点 b为旋转点 逆时针旋转1/3角度后的向量 node ab303=a+ab30;//旋转后所在的点 node bc60=Rotate(c-b,B/3*2);//旋转2/3角度 下面都是同理 node bc606=b+bc60; node f=intersection(a,ab303,b,bc606);//算出交点 node ab60=Rotate(b-a,A/3*2); node ab606=a+ab60; node ca30=Rotate(a-c,C/3); node ca303=c+ca30; node e=intersection(a,ab606,c,ca303); node ca60=Rotate(a-c,C/3*2); node ca606=c+ca60; node bc30=Rotate(c-b,B/3); node bc303=b+bc30; node d=intersection(b,bc303,c,ca606); printf("%.6f %.6f %.6f %.6f %.6f %.6f\n",d.x,d.y,e.x,e.y,f.x,f.y); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1307650.html
    最新回复(0)