如何在沿 y 轴移动 Area 对象的同时沿其轴旋转 Area 对象?
How can I rotate an Area object on its axis while also moving it along the y axis?
所以我创建了一个 Area 对象并将其制成一个 4 星形多边形。我想要做的是旋转这个对象,同时让它沿 y 轴平移。
这是我用来创建对象的点的代码,星形的中心是 xloc 和 yloc,下面是 paint 函数:
double rots = 0.0;
int xPoints[] = { 45, 48, 56, 48, 45, 42, 34, 42 };
int yPoints[] = { 56, 47, 45, 43, 34, 43, 45, 47 };
double xloc = 150, yloc = 250;
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
RenderingHints rh = new RenderingHints( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHints(rh);
g2d.translate(xloc, yloc);
g2d.rotate(rots);
g2d.fill(star);
//yloc += .01;
rots += .001;
repaint();
}
我遇到的问题出在绘画功能上。使用 getRotateInstance,它会沿着 xloc 和 yloc 的轴旋转。当这些数字递增时,星星的旋转从它的原点扩大到包括整个屏幕。我能想到的唯一解决方案是更改 xPoints[] 和 yPoints[],但到目前为止我还没有成功。有没有其他方法可以使这项工作或解决我目前遇到的问题的方法?
编辑:所以我取得了一些进步!我接受了给出的建议,我很接近。
我将代码 AffineTransform trans = AffineTransform.getRotateInstance
替换为:
AffineTransform trans = new AffineTransform();
trans.setToTranslation(xloc, yloc);
trans.rotate(rots);
现在它在屏幕上旋转和移动,但虽然它没有围绕越来越大的场旋转,但它仍然围绕一个我似乎无法辨认的点旋转。我猜这与 xloc 和 yloc 点的位置有关。根据我之前的测试,xloc 和 yloc 应该以其原点为中心,因此它应该正确旋转。有什么建议吗?
编辑 2:我收到建议说我应该只使用 Graphics2D 函数进行平移和旋转。我用这个更改了 AffineTransform 语句:
g2d.translate(xloc, yloc);
g2d.rotate(rots);
我现在遇到的问题是,虽然恒星确实平移和旋转,但它似乎也在进行额外的旋转。所以它现在所做的是在其原点旋转并围绕一个我无法辨认的附加点旋转,同时也沿 y 轴平移。为了更好地理解这看起来像什么,想象一个行星昼夜旋转,也绕着一颗恒星旋转,然后沿直线移动。
我更新了上面的代码以反映我的更改。我该如何解决这个问题?
通过将 double xloc = 150, yloc = 250;
更改为 int xloc = 150, yloc = 250;
它解决了问题。然而,一切都进展得太快了,所以我添加了一个计时器来减慢速度,仅此而已。
我的猜测是 int 在双打方面表现不佳。形状必须是 int 所以通过使变量加倍并将其应用于转换,它搞砸了。
所以我创建了一个 Area 对象并将其制成一个 4 星形多边形。我想要做的是旋转这个对象,同时让它沿 y 轴平移。 这是我用来创建对象的点的代码,星形的中心是 xloc 和 yloc,下面是 paint 函数:
double rots = 0.0;
int xPoints[] = { 45, 48, 56, 48, 45, 42, 34, 42 };
int yPoints[] = { 56, 47, 45, 43, 34, 43, 45, 47 };
double xloc = 150, yloc = 250;
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
RenderingHints rh = new RenderingHints( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHints(rh);
g2d.translate(xloc, yloc);
g2d.rotate(rots);
g2d.fill(star);
//yloc += .01;
rots += .001;
repaint();
}
我遇到的问题出在绘画功能上。使用 getRotateInstance,它会沿着 xloc 和 yloc 的轴旋转。当这些数字递增时,星星的旋转从它的原点扩大到包括整个屏幕。我能想到的唯一解决方案是更改 xPoints[] 和 yPoints[],但到目前为止我还没有成功。有没有其他方法可以使这项工作或解决我目前遇到的问题的方法?
编辑:所以我取得了一些进步!我接受了给出的建议,我很接近。
我将代码 AffineTransform trans = AffineTransform.getRotateInstance
替换为:
AffineTransform trans = new AffineTransform();
trans.setToTranslation(xloc, yloc);
trans.rotate(rots);
现在它在屏幕上旋转和移动,但虽然它没有围绕越来越大的场旋转,但它仍然围绕一个我似乎无法辨认的点旋转。我猜这与 xloc 和 yloc 点的位置有关。根据我之前的测试,xloc 和 yloc 应该以其原点为中心,因此它应该正确旋转。有什么建议吗?
编辑 2:我收到建议说我应该只使用 Graphics2D 函数进行平移和旋转。我用这个更改了 AffineTransform 语句:
g2d.translate(xloc, yloc);
g2d.rotate(rots);
我现在遇到的问题是,虽然恒星确实平移和旋转,但它似乎也在进行额外的旋转。所以它现在所做的是在其原点旋转并围绕一个我无法辨认的附加点旋转,同时也沿 y 轴平移。为了更好地理解这看起来像什么,想象一个行星昼夜旋转,也绕着一颗恒星旋转,然后沿直线移动。 我更新了上面的代码以反映我的更改。我该如何解决这个问题?
通过将 double xloc = 150, yloc = 250;
更改为 int xloc = 150, yloc = 250;
它解决了问题。然而,一切都进展得太快了,所以我添加了一个计时器来减慢速度,仅此而已。
我的猜测是 int 在双打方面表现不佳。形状必须是 int 所以通过使变量加倍并将其应用于转换,它搞砸了。