Android canvas rotate():平移旋转坐标系至任意原点任意角度-------附:android反三角函数小结
自然状态下,坐标系以屏幕左上角为原点,向右是x正轴,向下是y正轴。现在要使坐标系的原点平移至任一点O(x,y),且旋转a角度,如何实现?
交待下我的问题背景,已知屏幕上有两点p1和p2,构成直线l。我要以两点的中点mid(x,y)为坐标原点,线段l的中垂线为一个轴,l为另外一个轴,做一个坐标系。切割出一个边长为d的正方形。示意图如下所示:

double d = Math.sqrt((p2.x-p1.x)*(p2.x - p1.x)+(p2.y-p1.y)*(p2.y-p1.y)); //p1、p2两点之间的距离
float k = Math.abs((p2.y - p1.y)/(p2.x - p1.x)); //斜率
double angle = Math.atan(k); //注意这个角度的范围是0 ----------pi/2, 不是0到90°
Point midPoint = new Point((p1.x+p2.x)/2, (p1.y+p2.y)/2); //求中点
/**********绘制新的坐标系***********/
canvas.save();
canvas.translate(midPoint.x, midPoint.y); //将坐标中心平移到midPoint
canvas.rotate((float) (90 - Math.toDegrees(angle)));
Paint paint2 = new Paint();
paint2.setAntiAlias(true);
paint2.setStyle(Style.STROKE);
paint2.setColor(Color.BLUE);
int dd = d; //假设要做的正方形的边长为两点之间的距离d
//在旋转后的坐标系上,边长为dd的正方形的右下顶点和左上顶点坐标分别为(0, d/2)、(-d, -d/2)
canvas.drawRect(new Rect(0, d/2, -d, -d/2), paint2);
canvas.restore();
总结:
1,先平移到新的原点,然后再旋转。
2,rotate()这个函数要注意,参数为正则顺时针,否则逆时针。这个参数要求必须是度数,如旋转90°,就填90,不能填pi/2. 就这块,纠结了大半天我。可以用Math.toDegrees() 和 Math.toRadians()互相转化 ° 和 弧度。
3,反三角函数Math.atan()求出来的不是°数,所以要转化。大爷的,浪费了我一下午。
关于canvas 旋转相关,可参考资料:
http://blog.csdn.net/dinko321/article/details/7679019
http://www.cnblogs.com/-cyb/archive/2011/10/30/2229162.html
http://bbs.189works.com/thread-38386-1-1.html
http://www.myexception.cn/h/540302.html
关于canvas旋转后是只旋转了画布还是旋转了坐标,我也是云里雾里。经过个人测试,反正是坐标系也跟着旋转了。
转自:http://blog.csdn.net/yanzi1225627/article/details/8266135
Android canvas rotate():平移旋转坐标系至任意原点任意角度-------附:android反三角函数小结的更多相关文章
- 软件项目技术点(2)——Canvas之平移translate、旋转rotate、缩放scale
AxeSlide软件项目梳理 canvas绘图系列知识点整理 画布操作介绍 画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transf ...
- android canvas中rotate()和translate()两个方法详解
rotate()和translate() 1.看到这个题目的时候,有人会觉得这不就是一个对画布的旋转和平移的嘛,但是其中的细节的地方还是需要深究一下的. 例如:有个需求将TextView的文字竖直显示 ...
- Android开发之Canvas rotate方法释疑
Canvas的rotate()函数本应该是很简单的一个函数,但是由于api手册言之不详,使用中难免有吃不准的地方.下面所记录的几点,都是我在使用中所迷惑过的问题,特此记录. 1,坐标原点在哪里? 如果 ...
- android canvas d
(以下转自:http://blog.csdn.net/longyi_java/article/details/6930480) 1.基本的绘制图片方法 //Bitmap:图片对象,left:偏移左边的 ...
- 【转】Android Canvas的save(),saveLayer()和restore()浅谈
Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22 阅读:1445 评论:0 收藏: ...
- Android Canvas的save(),saveLayer()和restore()浅谈
save() saveLayer() restore() 1.在自定义控件当中你onMeasure和onLayout的工作做完成以后就该绘制该控件了,有时候需要自己在控件上添加一些修饰来满足需求 ...
- Android Canvas绘图详解(图文)
编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! Andr ...
- osg中使用MatrixTransform来实现模型的平移/旋转/缩放
osg中使用MatrixTransform来实现模型的平移/旋转/缩放 转自:http://www.cnblogs.com/kekec/archive/2011/08/15/2139893.html# ...
- Android——Canvas类的学习
转:http://blog.sina.com.cn/s/blog_61ef49250100qw9x.html 今晚瞎折腾,闲着没事画了个机器人——android,浪费了一个晚上的时间.画这丫还真不容易 ...
随机推荐
- selectpicker下拉多选框ajax异步或者提前赋值=》默认值
Bootstrap select多选下拉框赋值 success: function (data) { var oldnumber = new Array(); $.each(data, functio ...
- openCV python 安装
0, 用 import cv 测试,发现没有安装 opencv 模块. 首先先说本开发环境是在windows xp的环境下进行搭建的. 在搭建的过程中需要保证这三个条件: 1.python需要安装py ...
- 转:二十、java的抽象类
http://blog.csdn.net/liujun13579/article/details/7737667 现实世界中,人们表征世界时,会把现实世界中的很多类具有相同特征的事物归为一个抽象类.比 ...
- C++ Prime:范围for语句
C++11新标准引入了一种更简单的for语句,这种语句可以遍历容器或者其他序列的所有元素.范围for语句的语法形式是: for( declaration : expression) statement ...
- http Error 503 server unavailable
服务器的环境为: 系统:Windows server 2008 64位 数据库:Oracle 10g WEB应用服务:IIS 7.0+.Net Framework 4.0 无法打开服务元数据库路径“/ ...
- 特性扩展:WebActivatorEx
WebActivator: PreApplicationStartMethod 属性,用于标记作为东西您获取 Web 应用程序启动时调用的方法,在Application_Start前. PostApp ...
- Bzoj 1046: [HAOI2007]上升序列 二分,递推
1046: [HAOI2007]上升序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3671 Solved: 1255[Submit][Stat ...
- QEMU MIPIS远程共享ubuntu主机的文件
尝试啦很多中办法,最终选择以在QEMU模拟器中ssh 远程登入的方式访问主机,并用sshfs 挂载 主机端的文件到模拟器中,实现模拟器访问主机端的代码. SSH分客户端openssh-client和o ...
- admin-openrc
#!/bin/bash # To use an Openstack cloud you need to authenticate against keystone, which # returns a ...
- Yii中Ajax的使用,如收藏功能
view中 <?php $cs=Yii::app()->clientScript; $cs->registerScriptFile('http://ajax.googleapis.c ...