简单多边形
题意:
按顺序给出一组点集,求是按顺时针给出的还是按逆时针给出的,如果是按顺时针给出,输出clockwise,否则输出counterclockwise。
思路:
我们知道差积可以判断一条边在另一条边的左右。因此可以利用差积来判断。
1.依次求差积,求和,如果和为正,说明是逆时针给出的
2.和为负,顺时针给出的
代码:
#include <cstdio>
#include <cmath>
#include <iostream>
int x[33],y[33];
using namespace std;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&x[i],&y[i]);
int s=0;
for(int i=0;i<n;i++)
s+=(x[i]*y[(i+1)%n])-(x[(i+1)%n]*y[i]);
if(s>0) printf("counterclockwise\n");
else
printf("clockwise\n");
return 0;
}
裁缝大师
题意:
将一个圆裁成一个正多边形,求正多边形的各个顶点?第一个点在x轴的正半轴上,要求按顺时针顺序给出。
输入第一行给出单独一个整数T,表示数据组数接下来T行,每行顺序给出四个整数x,y,R,N:
思路:
1.圆上的点的坐标可以根据圆心角来求,所以关键就是求圆心角
2.正n边行,每个角都相等,因此就可以把它分成n等份
3.按顺时针顺序输出,也就对应着角度从大到小遍历
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const double pi=acos(-1.0);
const double eps=1e-9;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
double x,y,r,n;
scanf("%lf%lf%lf%lf",&x,&y,&r,&n);
for(int i=(int)n;i>=1;i--)
{
double xa=cos((1.0*i/n)*2*pi);
double ya=sin((1.0*i/n)*2*pi);
double ans1=x+xa*r;
double ans2=y+ya*r;
if(fabs(ans1)<eps)
{
ans1=0.0;
}
if(fabs(ans2)<eps)
{
ans2=0.0;
}
printf("%.2f %.2f\n",ans1,ans2);
}
}
return 0;
}