Android canvas rotate():平移旋转坐标系至任意原点任意角度-------附:android反三角函数小结
2016-09-23 19:31
281 查看
转载:http://blog.csdn.net/yanzi1225627/article/details/8266135
自然状态下,坐标系以屏幕左上角为原点,向右是x正轴,向下是y正轴。现在要使坐标系的原点平移至任一点O(x,y),且旋转a角度,如何实现?
交待下我的问题背景,已知屏幕上有两点p1和p2,构成直线l。我要以两点的中点mid(x,y)为坐标原点,线段l的中垂线为一个轴,l为另外一个轴,做一个坐标系。切割出一个边长为d的正方形。示意图如下所示:
![](http://img.my.csdn.net/uploads/201212/06/1354786502_6076.png)
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()求出来的不是°数,所以要转化。大爷的,浪费了我一下午。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/wail.gif)
关于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旋转后是只旋转了画布还是旋转了坐标,我也是云里雾里。经过个人测试,反正是坐标系也跟着旋转了。
最后补充一点,群英传上面说的是旋转画布。
自然状态下,坐标系以屏幕左上角为原点,向右是x正轴,向下是y正轴。现在要使坐标系的原点平移至任一点O(x,y),且旋转a角度,如何实现?
交待下我的问题背景,已知屏幕上有两点p1和p2,构成直线l。我要以两点的中点mid(x,y)为坐标原点,线段l的中垂线为一个轴,l为另外一个轴,做一个坐标系。切割出一个边长为d的正方形。示意图如下所示:
![](http://img.my.csdn.net/uploads/201212/06/1354786502_6076.png)
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()求出来的不是°数,所以要转化。大爷的,浪费了我一下午。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/wail.gif)
关于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旋转后是只旋转了画布还是旋转了坐标,我也是云里雾里。经过个人测试,反正是坐标系也跟着旋转了。
最后补充一点,群英传上面说的是旋转画布。
相关文章推荐
- Android canvas rotate():平移旋转坐标系至任意原点任意角度-------附:android反三角函数小结
- Android canvas rotate():平移旋转坐标系至任意原点任意角度-------附:android反三角函数小结
- Android canvas rotate():平移旋转坐标系至任意原点任意角度-------附:android反三角函数小结
- android canvas Rotate 图片中心旋转
- 同一坐标系中,由任意两点计算地图旋转角度
- 【Android开发】View的平移、缩放、旋转以及位置、坐标系
- Android 对布局进行任意角度的旋转
- android canvas rotate 旋转的一些总结(旋转的一些注意点)
- android中的matrix的简单应用--translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)
- Android开发 View的平移、缩放、旋转以及位置、坐标系
- Android Jni 利用OpenCV 实现图像任意角度旋转
- Android 对布局进行任意角度旋转
- 在Canvas上画出任意长宽比例,旋转任意角度的,带反走样算法(anti-aliased)的字符串
- matlab控制三角形绕原点旋转任意角度
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 下篇 补充话题
- Android Bitmap zoomIn/zoomOut/rotate ——图片的缩小,放大 和旋转
- C#实现任意角度旋转图片(方法1)
- 图形图像处理-之-任意角度的高质量的快速的图像旋转 下篇 补充话题
- VB.NET 中图形旋转任意角度 [ZT]
- C#实现任意角度旋转图片(方法2)