栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

围绕其中心旋转运动形状

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

围绕其中心旋转运动形状

转换(通常)是复杂的

public void paintComponent(Graphics g) {    super.paintComponent(g);    Graphics2D g2D = (Graphics2D)g;    Graphics g2 = g.create();    Graphics2D copy = (Graphics2D)g2;    copy.rotate(-angleRad, xPos, yPos);    copy.translate(0, -moveY);    g2D.translate(-moveX, 0);    copy.draw(player.shape);    for (Rectangle2D.Double r: DronePilot.rocksFloorArray) {        g2D.draw(r);    }    for (Rectangle2D.Double r: DronePilot.rocksCeilArray) {        g2D.draw(r);    }    for (Rectangle2D.Double r: DronePilot.roomsArray) {        g2D.draw(r);    }}

在以上代码中,您正在翻译原始

Graphics
上下文和
copy
。在这种情况下,原始上下文
copy
不会受到的影响
copy
,但原始上下文是共享资源,并且由于您不重置翻译,因此您将继续获取翻译后的上下文每次(复合)。

作为一般经验法则,对副本执行所有转换,并在完成后将其处理。

例如…

Graphics2D g2d = (Graphics2D)g.create();AffineTransform at = AffineTransform.getTranslateInstance(playerPoint.x, playerPoint.y);at.rotate(Math.toRadians(angle), player.getBounds2D().getCenterX(), player.getBounds2D().getCenterY());g2d.setTransform(at);g2d.setColor(Color.RED);g2d.fill(player);g2d.setColor(Color.BLACK);g2d.draw(player);g2d.dispose();

基本上,这会将对象的位置转换为玩家的位置,然后围绕对象的中心旋转对象

您还可以应用一个转换,创建该上下文的副本,然后应用另一个转换,该转换将变得复杂(因此,您可以将

translate
一个上下文复制,然后
rotate
将副本和第一个译文应用于副本)

这个令人难以置信的简单示例演示了两个基本示例…

  1. 使用
    Graphics
    上下文和
    AffineTransform
    来平移和旋转播放器对象(围绕它的中心点)
  2. 使用a
    Path2D
    生成变形的形状(此示例制作了两个对象,但是您可以使用单个
    AffineTransform
    平移和旋转的对象并将其应用一次)。

在两种情况下,它们都不会影响原始形状

import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Point;import java.awt.Rectangle;import java.awt.Shape;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.geom.AffineTransform;import java.awt.geom.Path2D;import java.awt.geom.Rectangle2D;import java.util.Random;import javax.swing.Jframe;import javax.swing.JPanel;import javax.swing.Timer;public class Test {    public static void main(String[] args) {        new Test();    }    public Test() {        EventQueue.invokeLater(new Runnable() { @Override public void run() {     Jframe frame = new Jframe();     frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);     frame.add(new TestPane());     frame.pack();     frame.setLocationRelativeTo(null);     frame.setVisible(true); }        });    }    public class TestPane extends JPanel {        private Shape player;        private Point playerPoint;        private float angle;        private float deltaZ = 1.0f;        private int deltaX, deltaY;        public TestPane() { player = new Rectangle(0, 0, 20, 20); playerPoint = new Point(80, 80); Random rnd = new Random(); deltaX = 1; deltaY = -1; Timer timer = new Timer(5, new ActionListener() {     @Override     public void actionPerformed(ActionEvent e) {         playerPoint.x += deltaX;         playerPoint.y += deltaY;         Shape rotatedPlayer = rotatedAndTranslatedPlayer();         Rectangle2D bounds = rotatedPlayer.getBounds2D();         if (bounds.getX() < 0.0) {  playerPoint.x = (int)(bounds.getX() * -1);  deltaX *= -1;         } else if (bounds.getX() + bounds.getWidth() >= getWidth()) {  playerPoint.x = getWidth() - (int)bounds.getWidth();  deltaX *= -1;         }         if (bounds.getY() < 0) {  playerPoint.y = 0;  deltaY *= -1;         } else if (bounds.getY() + bounds.getHeight() > getHeight()) {  playerPoint.y = getHeight() - (int)bounds.getHeight();  deltaY *= -1;         }         angle += deltaZ;         repaint();     } }); timer.start();        }        @Override        public Dimension getPreferredSize() { return new Dimension(200, 200);        }        protected Shape rotatedAndTranslatedPlayer() { Path2D.Double rotated = new Path2D.Double(player,  AffineTransform.getRotateInstance(         Math.toRadians(angle),         player.getBounds2D().getCenterX(),          player.getBounds2D().getCenterY())); return new Path2D.Double(rotated, AffineTransform.getTranslateInstance(playerPoint.x, playerPoint.y));         }        // Simply paints the "area" that the player takes up when it's rotated and        // translated        protected void paintAutoTranslatedShape(Graphics2D g2d) { g2d.setColor(Color.DARK_GRAY); g2d.fill(rotatedAndTranslatedPlayer().getBounds2D());        }        // Uses a AffineTransform to translate and rotate the player        protected void paintPlayer(Graphics2D g2d) { AffineTransform at = AffineTransform.getTranslateInstance(playerPoint.x, playerPoint.y); at.rotate(Math.toRadians(angle), player.getBounds2D().getCenterX(), player.getBounds2D().getCenterY()); g2d.setTransform(at); g2d.setColor(Color.RED); g2d.fill(player); g2d.setColor(Color.BLACK); g2d.draw(player);        }        @Override        protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); paintAutoTranslatedShape(g2d); g2d.dispose(); g2d = (Graphics2D) g.create(); paintPlayer(g2d); g2d.dispose();        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/419589.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号