旋转矩形并以正弦波方式移动它 - 使用graphics2D帮助

2023-12-06

Hi!

我使用之前的 Stackoverflow 帖子编写了下面的代码。

我只想将矩形旋转一定角度并使其以正弦波移动。

该代码也旋转整个正弦波。

我明白为什么会这样,但我不知道如何实现我的意图。

请帮忙!!!

非常感谢您抽出时间。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Withrotation {

    public static int i = 1;
    public static Ticker t;
    public static Repainter r;
    public static int newx, newy;

    public static void main(String[] args) {
        final JFrame frame = new JFrame("Wavy!");
        final WavyPanel wp = new WavyPanel();
        frame.getContentPane().add(wp, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        t = new Ticker(wp);
        r = new Repainter(wp);
        frame.pack();
        frame.setVisible(true);
        final Timer tickTimer = new Timer();
        final Timer paintTimer = new Timer();
        paintTimer.schedule(r, 1000, 50);
        tickTimer.schedule(t, 1000, 10);
    }

    private static class WavyPanel extends JPanel {

        private final Dimension size = new Dimension(640, 480);
        private int amplitude = 50;
        private int frequency = 5;
        private double x1 = 0;
        private double y1 = 500;
        private int yBase = 0;

        WavyPanel() {
            super(true);
        }

        @Override
        protected void paintComponent(final Graphics g) {
            final Graphics2D g2 = (Graphics2D) g;
            AffineTransform old = g2.getTransform();
            g2.rotate(Math.toRadians(-30));

            g2.clearRect(0, 0, this.getSize().width, this.getSize().height);
            g2.setColor(Color.BLACK);
            g2.fillRect((int) x1, (int) y1, 20, 80);
            g2.setTransform(old);


        }

        @Override
        public Dimension getPreferredSize() {
            return size;
        }

        @Override
        public Dimension getMinimumSize() {
            return size;
        }

        @Override
        public Dimension getMaximumSize() {
            return size;
        }

        public void tick() {
            x1 = x1 + 1;
            final int waveLength = size.width / frequency;
            yBase = (++yBase) % waveLength;
            final double normalized = (double) yBase / (double) waveLength;
            final double radians = normalized * Math.PI * 2;
            final double sine = Math.sin(radians);
            y1 = (int) (sine * amplitude);




        }
    }

    private static class Ticker extends TimerTask {

        private final WavyPanel panel;

        Ticker(final WavyPanel panel) {

            this.panel = panel;

        }

        @Override
        public void run() {
            panel.tick();
        }
    }

    private static class Repainter extends TimerTask {

        private final WavyPanel panel;

        Repainter(final WavyPanel panel) {

            this.panel = panel;

        }

        @Override
        public void run() {
            panel.repaint();

        }
    }
}

+1 为 SSCCE

1) 不要忘记打电话给super.paintComponent();作为您重写的第一个语句paintComponent(..)方法。

2) Swing UI 应该创建于EDT并与摇摆计时器

3)类的Java变量命名约定是每个新单词都大写字母,即WithRotation.

4)不需要frame.getContentPane.add(..)只需使用add(..)因为所有呼叫都转接至其内容面板.

这是我制作的示例(基本上是您实施了上述修复的代码),它仅旋转图形后面的矩形,而不是使用以下命令旋转整个图形对象AffineTransform#createTransformedShape():

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.geom.AffineTransform;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class WithRotation {

    private JFrame frame;
    private WavyPanel wp;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new WithRotation();
            }
        });
    }

    public WithRotation() {
        initComponents();
    }

    private void initComponents() {
        frame = new JFrame("Wavy!");
        wp = new WavyPanel();
        frame.add(wp, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

        createAndStartTimers();
    }

    private void createAndStartTimers() {
        new Timer(50, new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {

                wp.repaint();
            }
        }).start();
        new Timer(10, new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {

                wp.tick();
            }
        }).start();
    }

    class WavyPanel extends JPanel {

        private final Dimension size = new Dimension(640, 480);
        private int amplitude = 50;
        private int frequency = 5;
        private double x1 = 0;
        private double y1 = 500;
        private int yBase = 0;

        WavyPanel() {
            super(true);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;

            g2.clearRect(0, 0, this.getSize().width, this.getSize().height);
            g2.setColor(Color.BLACK);

            Rectangle rect = new Rectangle((int) x1, (int) y1, 20, 80);

            AffineTransform transform = new AffineTransform();
            transform.rotate(Math.toRadians(-30), rect.getX() + rect.width / 2, rect.getY() + rect.height / 2);

            Shape transformed = transform.createTransformedShape(rect);
            g2.fill(transformed);
        }

        @Override
        public Dimension getPreferredSize() {
            return size;
        }

        @Override
        public Dimension getMinimumSize() {
            return size;
        }

        @Override
        public Dimension getMaximumSize() {
            return size;
        }

        public void tick() {
            x1 = x1 + 1;
            final int waveLength = size.width / frequency;
            yBase = (++yBase) % waveLength;
            final double normalized = (double) yBase / (double) waveLength;
            final double radians = normalized * Math.PI * 2;
            final double sine = Math.sin(radians);
            y1 = (int) (sine * amplitude);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

旋转矩形并以正弦波方式移动它 - 使用graphics2D帮助 的相关文章

随机推荐

  • Hibernate 5 中 org.hibernate.Transactions.isActive() 的替换

    我正在从 hibernate 4 2 17 迁移到 5 0 7 到目前为止效果很好 但该方法似乎isActive已弃用 我只是不能再使用它了 这是我的代码 public void starteTransaktion try getMySes
  • 使用形状笛卡尔和 matplotlib 绘制断开连接的实体

    我需要绘制一个断开的圆圈列表 这些圆圈是我为其他目的而创建的 我试图完全按照中的示例进行操作http toblerity org shapely manual html cascading unions显示 参见code 但只有当圆圈重叠并
  • 是否可以在 Common Lisp 中定义递归类型?

    递归类型是一种具有基数和自身递归情况的类型 我希望它实现 类型化列表 即其conses仅允许相同元素类型或nil的列表 我尝试了以下定义 deftype list of a or null cons a list of a 然而 这表明由于
  • 在 Visual Basic 中连接控件,控制控件

    我正在使用 Visual Basic Visual Studio 2010 创建动态创建的控件 本质上 我正在做的是创建一个标签 一个文本框 一个标签 将充当秒表 和一个按钮 用于控制所述秒表 每组控件将按如下方式排列 并命名 LABEL
  • 带有圆角和阴影 Kivy 的图像

    How can I do something like this with Kivy 使用按钮的背景 正常 背景 向下 and border为了达成这个 让我们将您提供的两张图片命名为正常 png and down png 详细信息请参考下
  • Cordova 插件 - 添加第三方 sdk

    我正在尝试为以下 sdk 创建插件 https ktplayhelp zendesk com hc en us articles 221071888 Android 在设置项目配置点中 它告诉我们通过在 Android studio 中导入
  • 如何在使用 SQL Server 插入/更新之前验证数据?

    我有一个这样定义的表 CREATE TABLE dbo ObjectRelationClauses Id INT NOT NULL PRIMARY KEY IDENTITY RelationId INT NOT NULL OperatorT
  • 在 REST 应用程序中为当前登录用户设计 URI

    我的 REST API 中需要一个 URI 来检索当前登录的用户 通常我使用GET具有 ID 的资源 但客户端不知道用户的 ID 我找到了以下解决方案 按用户名 此解决方案使用用户名而不是用户的 ID Example Bitbucket R
  • Visual Studio 2010 SP1 中缺少 MVC3

    我安装了VS 2010 Ultimate 它没有 MVC3 我安装了 SP1 它应该也安装了更新以及 MVC3 对吗 但安装后 我在新项目窗口中仍然没有 MVC3 选项 这是怎么回事 MVC3 是可选下载 http www asp net
  • LinkedIn 网站分享始终显示 1 分钟阅读

    我正在尝试找出如何删除1 min read在我向 LinkedIn 分享内容时的描述中 1 分钟阅读示例 我在页面上有打开的图表标签 并验证它们不会在页面上的任何位置显示 1 分钟阅读时间 我也玩过 og type 尝试 文章 媒体 视频
  • ASP.NET Web API 身份验证

    我希望在使用时从客户端应用程序对用户进行身份验证ASP NET Web API 我观看了网站上的所有视频并阅读了这个论坛帖子 把 Authorize 属性正确返回一个401 Unauthorized地位 但是 我需要知道如何允许用户登录 A
  • 具有多态性的Python棉花糖树结构

    我有以下树结构代码 class Node def init self node id str self node id node id self children def add child self node Node if isinst
  • 编译具有动态模块支持的 Apache Web 服务器

    我刚刚在全新安装的 Ubuntu 10 04 2 上编译了 Apache 2 2 17 这是一个学习练习 旨在发现编译某些内容时实际发生的情况 而不仅仅是使用 apt get 因此避免使用 apt get 而有利于自己编译该内容 I ran
  • 最佳学生座位安排的算法

    假设我需要将 n 30 名学生分为 2 到 6 人一组 然后我从每个学生那里收集以下偏好数据 学生姓名 Tom 喜欢和以下人坐在一起 吉米 埃里克 不喜欢和以下人坐在一起 约翰 保罗 林戈 乔治 这意味着他们对整个班级中他们没有提到的任何其
  • 针对用户提供的 url 属性的 ESAPI XSS 预防

    我的 REST API 之一需要一个属性 url 该属性需要一个 URL 作为用户的输入 我正在使用 ESAPI 来防止 XSS 攻击 问题是用户提供的 URL 类似于 http example com alpha abc def phil
  • 如何在 Play 2.4.0 上使用 Anorm 启用跟踪/调试输出

    在 Play 2 4 0 中 Anorm 已移至外部包 日志记录已更改为 LogBack http logback qos ch 一切都很好 但没有任何地方可以明显地跟踪 SQL 调用的类 包名称 显而易见 基于导入声明
  • 将枚举元素作为事件参数传递 C#

    是否可以将枚举元素作为事件参数传递 假设我有 public class Letters public delegate void StateChangedEventHandler object sender EventArgs e publ
  • Spark 2.x 上的 Cloudera Hive?

    看看这个 https www cloudera com documentation spark2 latest topics spark2 known issues html hive on spark 总而言之 它表示 Hive 不适用于
  • 使用 iTextSharp 从 pdf 中提取图像及其名称

    我正在使用 iTextSharp c 从目录 pdf 中提取图像及其名称 我能够从 pdf 中提取图像 但很难根据所附的屏幕截图提取其相应的图像名称并使用该名称保存文件 请找到下面的代码并让我知道您的建议 样本 PDF https docd
  • 旋转矩形并以正弦波方式移动它 - 使用graphics2D帮助

    Hi 我使用之前的 Stackoverflow 帖子编写了下面的代码 我只想将矩形旋转一定角度并使其以正弦波移动 该代码也旋转整个正弦波 我明白为什么会这样 但我不知道如何实现我的意图 请帮忙 非常感谢您抽出时间 import java a