关于解决这个问题:从一个点(x,y)绕另一个点(x0,y0)旋转任意角度A后得到的坐标(x1,y1)的坐标是多少?

来自:http://blog.csdn.net/cnmm22/article/details/44273843

这个问题是个很重要的问题,解决不好这个问题,很多底层图形绘制的效果做不出来。

网上对于这个问题的回答有限,给出的答案也是五花八门,很遗憾,我没找到一个完全正确的答案,很多人估计摸索出了正确答案,但没有说出来,因为这里面涉及象限问题,用极坐标是能解但不是一两句话能说清楚的。

现在给出网上的答案:x1 = (x - x0)*cosA - (y - y0)*sinA + x0
y1 = (x - x0)*sinA + (y - y0)*cosA + y0

或者这样写也是一样:

x1= (x - x0)*cos(A) + (y - y0)*sin(A)+ x0 ;
y1=-(x - x0)*sin(A)+ (y - y0)*cos(A) + y0 ;

 

C# java里的代码一致:

[csharp] view plaincopy

1.  /// 

  

2.          /// 对一个坐标点按照一个中心进行旋转  

3.          /// 

  

4.          /// 中心点  

5.          /// 要旋转的点  

6.          /// 旋转角度,笛卡尔直角坐标  

7.          ///   

8.          private  Point PointRotate(Point center, Point p1, double angle)  

9.          {  

10.             Point tmp = new Point();  

11.             double angleHude = angle * Math.PI / 180;/*角度变成弧度*/  

12.            double x1 = (p1.X - center.X) * Math.Cos(angleHude) + (p1.Y - center.Y ) * Math.Sin(angleHude) + center .X;  

13.             double y1 = -(p1.X - center.X) * Math.Sin(angleHude) + (p1.Y - center.Y) * Math.Cos(angleHude) + center.Y;  

14.             tmp.X = (int)x1;  

15.             tmp.Y = (int)y1;  

16.             return tmp;  


这段是网上考来的代码,顺便把他的算法也考来:

 

假定原来角度是x,然后增加了y,那么根据三角函数
cos(x+y) = cosx cosy - sinx siny
sin(x+y) = cosx siny + sinx cosy

假定向量的长度是l,那么对应的坐标
 l*cos(x+y) = lcosx cosy - lsinx siny

y =  l*sin(x+y) = lcosx siny + lsinx cosy
而原来的坐标
   xo = lcosx  
   yo = lsinx
所以
   x = xo cosy - yo siny
   y = xo siny + yo cosy

再转换成为
   x-x0 = (x1-x0)*cosy - (y1-y0)*siny
   y-y0 = (x1-x0)*siny + (y1-y0)*cosy

 

好,最后说我的观点:

1、 这个答案基本正确了,但实际应用还是会有问题,问题的解决方法,在出错的象限A-180

2、 计算机识别不了角度,只能识别弧度,所以,角度必须转;

3、 目前网上还有一种算法结果是这样:

y1 = sin(A) * r + y0; 
x1 = cos(A) * r + y1;

其中”r”代表(x0,y0)(x,y)的距离,可以通过r = sqrt((x0-x)^2 + (y0-y)^2)算出来

 

但介于其中有一次开方的运算,不建议这样做。

你可能感兴趣的:(java)