两种方法 这里写一种点旋转的方法
平面一点(x1,y1),绕一点(x0,y0)顺时针旋转 a度
则新的坐标为
x=(x1-x0)*cosa-(y1-y0)*sina+x0;
y=(y1-y0)*cosa+(x1-x0)*sina+y0;
逆时针旋转则是
x=(x1-x0)*cos(-a)-(y1-y0)*sin(-a)+x0;
y=(y1-y0)*cos(-a)+(x1-x0)*sin(-a)+y0;
#include <bits/stdc++.h>
using namespace std;
const double pi=acos(-1.0);
int main(){
int t;
cin>>t;
while(t--){
int x,y,r,n;
cin>>x>>y>>r>>n;
double ansx=x+r;
double ansy=y;
if(abs(ansx)<1e-7) ansx=0.0;
if(abs(ansy)<1e-7) ansy=0.0;
printf("%.2lf %.2lf\n",ansx,ansy);
for(int i=n-1;i>=1;i--){
double cs=cos((-1.0/n)*2*pi);
double sn=sin((-1.0/n)*2*pi);
double newx=(ansx-x)*cs-(ansy-y)*sn+x;
double newy=(ansy-y)*cs+(ansx-x)*sn+y;
if(abs(newx)<1e-7) newx=0.0;
if(abs(newy)<1e-7) newy=0.0;
printf("%.2lf %.2lf\n",newx,newy);
ansx=newx;
ansy=newy;
}
}
return 0;
}