简单的多边形和裁缝大师(差积和圆心角的应用)

简单多边形

题意:

按顺序给出一组点集,求是按顺时针给出的还是按逆时针给出的,如果是按顺时针给出,输出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;
}
发布了75 篇原创文章 · 获赞 8 · 访问量 1244

猜你喜欢

转载自blog.csdn.net/qq_40905284/article/details/105042432