Axial symmetry FZU - 2035

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Axial symmetry FZU - 2035相关的知识,希望对你有一定的参考价值。

Axial symmetry FZU - 2035

题意:

给一个多边形,边平行于x轴或者y,问是否存在对称轴

题解:

将每个点的坐标,以及每个边的中点的坐标,按照顺时针顺序存入,多边形的对称轴一定穿过对应两个点,一共有n个候选对称轴,我们依次枚举判断就行,当枚举一个对称轴时,判断其他点是否关于其对称(判断方法,两个直线是否垂直,中点是否在对称轴上)
当然对称轴的斜率k有可能不存在或者为0,记得特判
思路简单不好写

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 1005;
 
struct Node {
	double x,y;
	Node() {}
	Node(double _x,double _y) {
		x = _x;
		y = _y;
	}
}node[N], p[2*N];
bool equ(double x,double y){
	if(abs(x-y)<0.0000001)return 1;
	else return 0;
}
int n;
int main() {
	int t,cas = 1;
	scanf("%d",&t);
	while(t--) {
		scanf("%d",&n);
		for(int i = 0; i < n; i++) {
			scanf("%lf%lf",&node[i].x,&node[i].y);
		}
		node[n] = node[0];
 
		int tot = 0;
 
		p[tot++] = node[0];
		for(int i = 0; i <= n; i++) {
			p[tot++] = Node((node[i].x + node[i+1].x) / 2, (node[i].y + node[i+1].y) / 2);
			p[tot++] = node[i+1];
		}
		int a,b;
		double k1, k2, c;
		bool ok, flag = false;
		for(int i = 0; i < n; i++) {
			ok = true;
			if( p[i].x == p[i+n].x ) { //如果分母为0,则对称轴垂直于x轴
				for(int j = 1; j < n; j++) { //对称点 i+j 和 i-j + 2n
					a = (i+j);
					b = (i-j+2*n);
					if( (p[a].x + p[b].x)/2 != p[i].x || (p[a].y != p[b].y)) {
						ok = false;
						break;
					}
				}
			}else if( p[i].y == p[i+n].y) { //如果分子为0,则对称轴垂直于y轴
				for(int j = 1; j < n; j++) {
					a = (i+j);
					b = (i-j+2*n);
					if( (p[a].y + p[b].y)/2 != p[i].y || (p[a].x != p[b].x)) {
						ok = false;
						break;
					}
				}
			}
			else
			{
				double K,B;
				K=(p[i].y-p[i+n].y)/(p[i].x-p[i+n].x);
				B=p[i].y-K*p[i].x;
				for(int j = 1; j < n; j++) {
					a = (i+j);
					b = (i-j+2*n);
					double k=(p[a].y-p[b].y)/(p[a].x-p[b].x);
					//y=kx+b  --> b=y-k 
					double xx=(p[a].x+p[b].x)/2,yy=(p[a].y+p[b].y)/2; 
					if(equ(k*K,-1)==0||equ(yy,xx*K+B)==0) {
						ok = false;
						break;
					}
				}
			}
			if(ok) {
				flag = true;
				break;
			}
		}
		printf("Case %d: ",cas++);
		if(flag) {
			printf("YES\\n");
		}else {
			printf("NO\\n");
		}
	}
	return 0;
}

以上是关于Axial symmetry FZU - 2035的主要内容,如果未能解决你的问题,请参考以下文章

论文阅读笔记:AS-MLP AN AXIAL SHIFTED MLP ARCHITECTUREFOR VISION

数字信号处理相关5( FPGA FIR 滤波器结构和优化之滤波器的对称性(Filter Symmetry))

AD软件中如何一次修改很多同一阻值的电阻封装

tecplot对称面不显示云图

FZU Tic-Tac-Toe -.- FZU邀请赛 FZU 2283

hdu 2035