使用java图形沿着圆弧路径移动形状

2023-12-22

请原谅我的天真,这是我第一次来这里,也是第一次用java处理图形动画。我正在尝试完成一个沿某种弧线移动的星形动画(尝试模拟二维轨道)。轨道动作与计时器一起使用来为星星设置动画。

简单来说,我在jpanel的不同位置画了几颗星星。星星 y 位置的平移取决于该星星距 x 下降轴的距离(初始化为 300(jpanel 的中心))。恒星越接近衰退点,它们的 y 位置变化就越小。当星星到达或经过面板的右侧(或超出视野)时,重置到其原始 y 位置的左侧(丑陋,我知道)。我选择这样做是因为星星是随机放置的。我不能让所有的星星都以相同的 dy 开始,如果是这样,所有的星星都会沿着自己的弧线移动。

然而,当我运行这个时,在第三遍之后,所有星星的 x 位置变得更小(进入负范围并超出视野)。欢迎提出任何关于更好地完成原始任务的方法的建议。谢谢。

private Action orbit = new AbstractAction() {

    int declineAxis = 300; //if a stars top left x is greater than this, move downwards
    double distFromDecline;
    AffineTransform at = new AffineTransform();

    @Override
    public void actionPerformed(ActionEvent ae) {
        for (int i = 0; i < 12; i++) {
            distFromDecline = Math.abs(declineAxis - stars.getStar(i).getBounds().getCenterX());
            if (distFromDecline <= 50) {
                if (stars.getStar(i).getBounds().getX() < declineAxis) {
                    at.translate(5, -2);
                } else {
                    at.translate(5, 2);
                }
            } else if (distFromDecline <= 100 && distFromDecline > 50) {
                if (stars.getStar(i).getBounds().getX() < declineAxis) {
                    at.translate(5, -3);
                } else {
                    at.translate(5, 3);
                }
            } else if (distFromDecline <= 200 && distFromDecline > 100) {
                if (stars.getStar(i).getBounds().getX() < declineAxis) {
                    at.translate(5, -4);
                } else {
                    at.translate(5, 4);
                }
            } else if (distFromDecline >200) {
                if (stars.getStar(i).getBounds().getX() < declineAxis) {
                    at.translate(5, -5);
                } else {
                    at.translate(5, 5);
                }
            }
            stars.move(at, i);
        }
    }
};
public class Stars {

private int[] yOrigins;
private Path2D[] stars;
private Random rand = new Random();

public Stars(int n) {
    stars = new Path2D[n];
    yOrigins = new int[n];
    int dx = 700 / n;
    int x = 0;
    for (int i = 0; i < n; i++) {
        int y = rand.nextInt(401);
        generateStar(i, x, y);
        yOrigins[i] = y;
        x += dx;
    }
}

private void generateStar(int i, int x, int y) {
    stars[i] = new Path2D.Double();
    Path2D.Double cur = (Path2D.Double) stars[i];
    cur.moveTo(x, y);
    cur.lineTo(cur.getCurrentPoint().getX() + 6, y - 2);
    cur.lineTo(cur.getCurrentPoint().getX() + 2, cur.getCurrentPoint().getY() - 6);
    cur.lineTo(cur.getCurrentPoint().getX() + 2, cur.getCurrentPoint().getY() + 6);
    cur.lineTo(cur.getCurrentPoint().getX() + 6, cur.getCurrentPoint().getY() + 2);
    cur.lineTo(cur.getCurrentPoint().getX() - 6, cur.getCurrentPoint().getY() + 2);
    cur.lineTo(cur.getCurrentPoint().getX() - 2, cur.getCurrentPoint().getY() + 6);
    cur.lineTo(cur.getCurrentPoint().getX() - 2, cur.getCurrentPoint().getY() - 6);
    cur.closePath();
}

public void paintStars(Graphics2D g) {
    //super.paintComponent(g);
    g.setColor(new Color(246, 246, 255));
    for (int i = 0; i < stars.length; i++) {
        g.fill(stars[i]);
    }
}

public Shape getStar(int i) {
    return stars[i];
}

void move(AffineTransform at, int i) {
    stars[i] = (Path2D) stars[i].createTransformedShape(at);
    System.out.println(i+": " + stars[i].getBounds());
    if(stars[i].getBounds().getX()>700){
        at.translate(-(stars[i].getBounds().x+stars[i].getBounds().getWidth()), yOrigins[i]);
        stars[i] = (Path2D) at.createTransformedShape(stars[i]);
    }
}

}


java.awt.geom.FlatteningPathIteratorhttp://docs.oracle.com/javase/6/docs/api/java/awt/geom/FlatteningPathIterator.html http://docs.oracle.com/javase/6/docs/api/java/awt/geom/FlatteningPathIterator.html

您传递弧线(或任何其他形状)并使用这些点来定位星星。

您可以从这里使用星星http://java-sl.com/shapes.html http://java-sl.com/shapes.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用java图形沿着圆弧路径移动形状 的相关文章

随机推荐

  • Xcode 下载失败。使用“购买”页面重试。 Xcode 9.3。 MacOS 高山

    将 MacOS 升级到 High Sierra 后 我尝试更新 Xcode 并得到以下信息 Xcode 下载失败 使用 购买 页面重试 我卸载了 Xcode 并尝试再次安装 但没有成功 我阅读了一些解决此问题的提示 但没有任何帮助 删除 L
  • 在Python中根据每日的pct_change计算初始值

    假设我有一个逐日增长率数据如下 其中初始值我们未知 date dod change 0 2020 1 1 0 262713 1 2020 1 2 0 216778 2 2020 1 3 0 217069 3 2020 1 4 0 26811
  • Github Actions 动态容器名称

    Summary Github Actions 允许使用 Docker 容器来运行作业 但它似乎不允许为此容器映像提供动态值 使用环境变量 这有效 不是所需的解决方案 jobs pytest test container image ghcr
  • .gitmodules 和在 .git/config 中指定子模块之间的区别?

    可能是非常愚蠢的问题 但到目前为止我一直在 gitmodules 文件中指定子模块 最近我突然想到 也许出于同样的原因可以使用 git config 这样我就不必在工作目录中保留无关的文件了 git config submodule pat
  • 信息窗口在 didTapAtCoordinate 方法中不显示标记

    我想展示infowindow and marker两者同时进行 code void set markerOnMap double lat longitude double lon GMSMarker marker GMSMarker all
  • 在 cypress.env.json 中定义变量

    我想为所选应用程序的测试定义全局变量 我想将它们输入到一个文件中 阅读完文档后我决定使用cypress env json https docs cypress io guides guides environment variables h
  • 修复 Mercurial 中的错误合并

    在我们的 Mercurial 项目配置中 我们在一个存储库中有 3 个分支 一种是稳定版本分支 其中完成紧急错误修复 一种是包含新功能代码的功能分支 一种是 UAT 分支 其中错误修复和新功能合并以提供最新的代码库 我们已将大量新功能代码合
  • 使用 Perl 提取方括号“[]”之间的数据

    我使用正则表达式从弯曲的括号 或 括号 中提取数据 例如提取a b from a b 如下所示 我有一个文件 其中每一行都会像 this is the range of values a1 b1 and b1 a1 this is the
  • PowerShell 无法确定正在使用哪个参数集

    我有一个带有四个参数的函数 其中两个可以设置也可以不设置 我尝试使用参数集来确定已设置哪些参数 但在参数集解析方面遇到了一些问题 这些是四个可能的参数集 既不是ErrorObject也不是SplunkData 错误对象和 Splunk 数据
  • 什么是核心动画的字节对齐(缓存行对齐)?为什么这很重要?

    我以非惰性方式在滚动视图上加载图像 因此不会出现卡顿行为 代码有效 FPS 接近 60 但是 我不明白什么是核心动画的字节对齐 或缓存行对齐 如上所述here https github com path FastImageCache byt
  • SocketIO,无法从客户端发送发射数据

    我在尝试使用 SocketIO 将数据从客户端浏览器发送到我的节点服务器时遇到了最奇怪的问题 从服务器发送到客户端工作得很好 但反过来我会得到一个未定义的错误 这是它的快速外观 非常简单 节点服务器 app js io on connect
  • 如何使用纯 JavaScript 防止输入字段中出现空格

    我有一个用户名输入字段 并试图阻止用户用空格填充它们
  • jQuery - 使用 AJAX 加载内容时 document.ready 不会触发

    我有一个简单的自定义选项卡模块 它使用 AJAX 请求加载选项卡 通过 elem load 在每个使用 AJAX 加载的页面上 我都有一些 JavaScript 第一次加载页面时 通过直接输入 URL 而不是 AJAX JavaScript
  • 将 NSManagedObject 存储在字典中(NSDictionary)

    我有一个自定义类 它是NSManagedObject 我想将其存储在字典中 但是当尝试这样做时 我收到了Property list invalid for format 200 error 这是我尝试创建字典的方法 NSDictionary
  • C# 中继承的性能注意事项

    如果我使用以下命令创建一个类 编译器是否会生成相同的 ILpublic int I 或任何其他字段 与创建一个从具有以下属性的基类继承的类public int I 无论哪种方式 生成的类的行为都是相同的 但是编译器的行为是否相同 即 编译器
  • 为什么在 IntelliJ 14+ 上运行简单的 scala 程序时会出现 ClassNotFoundException?

    我无法弄清楚这个程序出了什么问题 我正在使用旧版本的 scala 2 7 因为它与我正在使用的某些库兼容 这是我尝试运行的一个简单程序 该程序运行良好使用scalac and scala命令 但是在 IntelliJ 14 上 gt 当我c
  • 如何在Python中分割文件?

    是否可以分割文件 例如 您有一个巨大的单词列表 我想将其拆分 使其成为多个文件 这怎么可能 这个用换行符分割文件并将其写回 您可以轻松更改分隔符 如果您的输入文件中没有多个 splitLen 行 本例中为 20 行 这也可以处理不均匀的数量
  • EF core“点赞”功能的动态表达

    我编写了一些代码来创建动态表达式来过滤我的分页 我正在尝试制作 EF Core 内置函数的动态表达式以进行搜索 EF Functions Like 我尝试过像bottom这样的方法 但它是一种扩展方法 调用该方法时不使用第一个参数 我不知道
  • 使用 ObjectMapper + JavaTimeModule 将 JacksonJsonProvider 注册到 Jersey 2 客户端

    我正在尝试整理包含 ISO 格式时间戳的响应 如下所示 time 2014 07 02T04 00 00 000000Z into ZonedDateTime我的域模型对象中的字段 最终 如果我使用以下代码片段中注释的解决方案 它就会起作用
  • 使用java图形沿着圆弧路径移动形状

    请原谅我的天真 这是我第一次来这里 也是第一次用java处理图形动画 我正在尝试完成一个沿某种弧线移动的星形动画 尝试模拟二维轨道 轨道动作与计时器一起使用来为星星设置动画 简单来说 我在jpanel的不同位置画了几颗星星 星星 y 位置的