日期:2014-05-20 浏览次数:20933 次
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
public class Test6 {
public static void main(String[] args) {
// 点 (2, 3),使用 Line 来冒充一下
Line2D.Double line = new Line2D.Double(2, 3, 2, 3);
// 围绕 (1, 2) 逆时针旋转 60 度
AffineTransform affine = AffineTransform.getRotateInstance(Math.toRadians(60), 1, 2);
Shape n = affine.createTransformedShape(line);
// 旋转结果
System.out.println("x = " + n.getBounds2D().getX());
System.out.println("y = " + n.getBounds2D().getY());
}
}
------解决方案--------------------
上面这个仿射变化的数学公式为:
图中 a, b 表示参照点的坐标,x, y 是起点坐标,x', y' 是变换后的坐标。
------解决方案--------------------
高中学的极坐标都不记得了吗?
x=rCos@
y=rSin@
把A点的坐标平移至原点,然后换成极坐标,B点极坐标 @+d@ 以后,再转成直角坐标,再移回原来位置,就可以了撒。
------解决方案--------------------
下面是C++代码例子
/*
旋转点操作
@param center 旋转中心
@param point 操作点
@param angle 旋转角度
@return FPoint 返回旋转后的点
*/
FPoint CShape::RotatePoint(FPoint center, FPoint point, double angle)
{
FPoint Circumpt;
Circumpt.x = cos(angle) * (point.x - center.x) + sin(angle) * (center.y - point.y) + center.x;
Circumpt.y = center.y - sin(angle) * (center.x-point.x) - cos(angle) * (center.y - point.y);
return Circumpt;
}