坐标的旋转,翻转
来源:互联网 发布:逆战登录网络连接失败 编辑:程序博客网 时间:2024/05/18 03:11
因为一个旋转的变换是(x,y)->(y,-x),所以只需要三次连续旋转就可以获得所有的旋转。而翻转的类型则是(x,y)->(x,-y),翻转之后再旋转则得到另外的图形。如果给定了相应的坐标范围,则要注意旋转之后会超过坐标范围,因此需要利用平移将图形移回定义的坐标系。注意,这也是一个小技巧,不管一个图形的位置如何,我们都可以将它标准化到坐标系的左上角,这样就消除了平移的影响。
下面的代码还加上了去掉重复的旋转图形,有些对称图形的旋转结果是重复的。
def normalize(p): x,y = p[0][0],p[0][1] new_p = [] for cell in p:x,y = min(x,cell[0]),min(y,cell[1]) return sort_p(tuple([(i-x,j-y) for (i,j) in p]))def rotate(p): new_p = [] for cell in p: new_p.append((cell[1],-cell[0])) return sort_p(normalize(new_p))def flip(p): new_p = [] for cell in p: new_p.append((cell[0],-cell[1])) return sort_p(normalize(new_p))def sort_p(p): return tuple(sorted(p,key = lambda cell:(cell[0],cell[1])))def generate(p): record = set() for i in range(4): p = rotate(p) if p not in record: record.add(p) print_format(p) p = flip(p) for i in range(4): p = rotate(p) if p not in record: record.add(p) print_format(p)def print_format(p): x,y = -1,0 print(p) for cell in p: if x!=cell[0]:print();print(' '*(cell[1]),end='');first = 0 print(' '*(cell[1]-y-1)*first+'*',end='') first = 1 x,y = cell print('\n','='*30)generate(((0,0),(1,0),(2,0),(2,1),(2,2),(3,1),(5,2)))
0 0
- 坐标的旋转,翻转
- 坐标的平移旋转
- 旋转坐标的计算
- 坐标旋转公式的推导
- 图像中某点绕点旋转后的坐标,图像旋转坐标位置
- 一个用来翻转、旋转的矩阵类
- 一个用来翻转、旋转的矩阵类
- android中图片的翻转和旋转
- android中图片的翻转和旋转
- css3 翻转和旋转的区别
- WPF图片控件的旋转、缩放、翻转
- WPF图片控件的旋转、缩放、翻转
- 字符串的旋转--3步翻转法
- Nyoj 298 点的变换[利用矩阵求解坐标点的转换,平移,绕原点旋转,沿x,y轴翻转]
- 坐标旋转
- 计算显示坐标旋转后点的坐标
- 坐标的平移,缩放与旋转
- 坐标旋转变换公式的推导
- canvas 实现环形进度条
- Java多线程之同步容器与并发容器
- inux进程间通信——消息队列
- 学习之路
- 【leetcode】312. Burst Balloons
- 坐标的旋转,翻转
- 实验楼Linux学习笔记(六)之文件系统操作与磁盘管理
- Sping mvc 环境下使用kaptcha 生成验证码
- JetBrains DataGrip 1.0.3
- servlet的认识--生命周期
- Android 页面 底部的RadioButton
- 来到北京的两个月-----
- 新霸哥带你轻松玩转Oracle数据库
- 115.Unique Paths II-不同的路径 II(容易题)