自然状态下,坐标系以屏幕左上角为原点,向右是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旋转后是只旋转了画布还是旋转了坐标,我也是云里雾里。经过个人测试,反正是坐标系也跟着旋转了。
android爱好者,欢迎加入群:192413115
分享到:
相关推荐
Android canvas 放大 缩小 平移 各种绘图 自定义view 请自行修改
android 画曲线图 画三角形(多边形),可以画成股票K线图,儿童成长曲线等,使用android的canvas
平移: ctx.translate(x, y) x表示从当前坐标系向x正方向移动x像素 y表示从当前坐标系向y轴的正方向移动y像素 旋转: ctx.rotate(x); x 表示弧度制单位 从当前坐标系沿着旋转x弧度 如果x值为正 顺时针旋转 反之 逆...
自己做的安卓绘图Demon笔记,演示 canvas类的 translate、scale 图形 平移 缩放,附代码,供大家参考
android-canvas-donut-chart.7z
该代码是一个完整的Android工程,详细演示如了如何使用Android中的各种drawXXX方法,以及画笔Paint如何影响绘制的效果。 具体参见博文: http://blog.csdn.net/iispring/article/details/49770651
Android Canvas绘图演示代码
android canvas 3D旋转木马 图片立体展示
博文《 Android画布canvas rotate,translate的理解》http://blog.csdn.net/peak1chen/article/details/50776507demo下载链接
android 使用canvas把矩形图片变成圆角矩形显示 参考网址:http://blog.csdn.net/rhljiayou/article/details/7212620
android开发:用canvas实现画板的功能。
实现在Kotlin中更方便使用canvas
Android下使用Canvas画图,详细参见博客:http://www.cnblogs.com/plokmju/p/android_Canvas.html
android利用Paint在Canvas上实现竖排写字
自定义view,使用Canvas制作一个可拖动改变任意形状的四边形,并填充颜色。。
低版本HTML2canvas 前端开发 生成海报 截图等功能 1.该脚本允许您直接在用户浏览器上对网页或其部分进行“截图”。屏幕截图基于 DOM,因此可能不是 100% 准确到真实表示,因为它不会制作实际的屏幕截图,而是根据...
使用Android canvas 画图,供入门参考。图例见:http://blog.csdn.net/u010351494/article/details/46443351
学习Android自定义控件的必学前导知识——Canvas
Android窗帘动画,平移动画,渐变动画,采用了canvas画图的方式实现如上三种动画的功能
android-openGL-canvas-master.zip