围绕中心点旋转一个点
Posted
技术标签:
【中文标题】围绕中心点旋转一个点【英文标题】:Rotating a point around a center point 【发布时间】:2013-05-20 12:45:53 【问题描述】:我知道这里有一些关于积分和轮换的问题,我觉得我快到了。我需要一点推动力。
我有一个像这样有 6 个点的形状。
我想围绕点C
旋转点P而且我需要手动执行此操作,因此我对使用 AffineTransform 不感兴趣
提前致谢
Thread thread = new Thread()
public void run()
//THE RADIUS OF THE SHAPE IS 100
//GET THE POINT P
PointClass point_class = points.get(0);
//GET THE CENTER POINT C
Point center = new Point(point_class.point.x - 100, point_class.point.y);
int deg = 0;
while(deg < 360)
//GET THE ANGLE IN RADIANS
double angle = Math.toRadians(deg);
//FIRST TRANSLATE THE DIFFERENCE
int x1 = point_class.point.x - center.x;
int y1 = point_class.point.y - center.y;
//APPLY ROTATION
x1 = (int) ((double) x1 * Math.cos(angle) - y1 * Math.sin(angle));
y1 = (int) ((double) x1 * Math.sin(angle) + y1 * Math.cos(angle));
//TRANSLATE BACK
point_class.point.x = x1 + center.x;
point_class.point.y = y1 + center.y;
//ROTATE + 1 DEEGRE NEXT TIME
deg++;
try
//SLEEP TO SEE THE DIFFERENCE
sleep(100);
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
;
thread.start();
这段代码的结果是点 P 像这样在中心结束
【问题讨论】:
【参考方案1】:我认为由于将双精度数转换为整数,您的半径每次通过 while 循环都会缩小。这可能效果更好:
double x1 = point_class.point.x - center.x;
double y1 = point_class.point.y - center.y;
//APPLY ROTATION
x1 = x1 * Math.cos(angle) - y1 * Math.sin(angle));
y1 = x1 * Math.sin(angle) + y1 * Math.cos(angle));
//TRANSLATE BACK
point_class.point.x = (int)Math.ceil(x1) + center.x;
point_class.point.y = (int)Math.ceil(y1) + center.y;
【讨论】:
这段代码的旋转部分不正确。 y1 值是根据新的 x1 值而不是初始值更新的。【参考方案2】:所以我知道出了什么问题。
两点的翻译,
//FIRST TRANSLATE THE DIFFERENCE
double x1 = point_class.point.x - center.x;
double y1 = point_class.point.y - center.y;
必须跳出循环,因为在应用旋转矩阵时我需要在那个位置取基。而且在循环中,我应该将 deegre 固定为 1,这样它就只是增量 1 而不是 81+82+83...不知道我为什么这样做。
希望这对某人有帮助 =)
【讨论】:
你上面的公式帮助了一些完全不相关的事情:)以上是关于围绕中心点旋转一个点的主要内容,如果未能解决你的问题,请参考以下文章