最近经常有canvas绘图的需求,难免涉及到大量的坐标计算。其中有一个问题困扰了我很久。该算法返回有角度的文本。在画布上绘制时,必须旋转绘制。因此,需要根据初始文本坐标位置转换旋转后的坐标。下面是具体的算法和例子。如图,一个矩形根据左上角旋转90°后,求旋转后的坐标。/***计算一个点旋转后的坐标**@parampointrotatedpoint{x,y}*@paramanglerotatedangle*@paramoriginPoint根据哪个点旋转,默认值为上层原点左角{x:0,y:0}*@returns{{x:number,y:number}}*/functionrotatePoint(point,angle,originPoint={x:0,y:0}){constcosA=Math.cos(角度*Math.PI/180);constsinA=Math.sin(角度*Math.PI/180);constrx=originPoint.x+(point.x-originPoint.x)*cosA-(point.y-originPoint.y)*sinA;constry=originPoint.y+(point.x-originPoint.x)*sinA-(point.y-originPoint.y)*cosA;返回{x:rx,y:ry};}常量点={x:200,y:100};常数角=90;//constoriginPoint={x:0,y:0};console.log('-->',rotatePoint(point,angle));以上是具体的计算方法,拿去后可以直接使用。不过这个方法也有一个小问题,如上图所示(-99.999999其实应该是-100),都是直接用js计算出来的,难免会有计算精度问题(如果想了解更多计算精度问题,请自行搜索)。要解决这个问题,可以通过引入decimal.js或者math.js或者bigNumber.js来解决。具体使用方法请自行搜索-_-!但是除非精度要求特别高,否则这个误差我觉得可以忽略。
