博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android canvas rotate():平移旋转坐标系至任意原点任意角度-------附:android反三角函数小结...
阅读量:4016 次
发布时间:2019-05-24

本文共 1180 字,大约阅读时间需要 3 分钟。

自然状态下,坐标系以屏幕左上角为原点,向右是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 旋转相关,可参考资料:

关于canvas旋转后是只旋转了画布还是旋转了坐标,我也是云里雾里。经过个人测试,反正是坐标系也跟着旋转了。

android爱好者,欢迎加入群:192413115

你可能感兴趣的文章
python append 与浅拷贝
查看>>
Matlab与CUDA C的混合编程配置出现的问题及解决方案
查看>>
2017阿里内推笔试题--算法工程师(运筹优化)
查看>>
python自动化工具之pywinauto(零)
查看>>
python自动化工具之pywinauto(四)——批量转换exe视频
查看>>
python一句话之利用文件对话框获取文件路径
查看>>
PaperDownloader——文献命名6起来
查看>>
PaperDownloader 1.5.1——更加人性化的文献下载命名解决方案
查看>>
如何将PaperDownloader下载的文献存放到任意位置
查看>>
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
系统架构:Web应用架构的新趋势---前端和后端分离的一点想法
查看>>
JVM最简生存指南
查看>>
漂亮的代码,糟糕的行为——解决Java运行时的内存问题
查看>>
Java的对象驻留
查看>>
自己动手写GC
查看>>
10个精妙的Java编码最佳实践
查看>>
Java 8新特性终极指南
查看>>
logback高级特性使用(二) 自定义Pattern模板
查看>>
JVM 线程堆栈分析过程详解
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>