gpt4 book ai didi

java - 在 Java 2D 中实现 Polygon2D

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:20:52 24 4
gpt4 key购买 nike

我正在使用用于绘图的 Java2D 库在 Java 中创建一个 2D 游戏,我确实需要一个浮点精度的多边形对象,我可以使用它来绘制游戏对象并对它们进行碰撞检测。不幸的是,Java 的 Polygon 对象只有 int 精度,并且没有像 Rectangle 和 Rectangle2D 那样等效的 Polygon2D。我已经做了足够多的研究,发现我有几个选择,但似乎都不是很好。

  1. 使用 Path2D。据一位 Java 开发人员在 this forum 中发帖称, 缺少 Polygon2D 是一个疏忽,但它建议的替代品是 Path2D。不幸的是,Path2D 没有提供访问其各个顶点或边的方法,而我需要这些来进行碰撞检测(具体来说,我需要获得与每个边正交的 vector )。

  2. 实现我自己的 Polygon2D,它实现了 Shape 接口(interface),这样我仍然可以将它传递给 Graphics2D.draw(Shape)。这看起来很难。 Shape 接口(interface)需要难以实现的方法,例如 contains(Rectangle2D)getPathIterator(AffineTransform)。特别是对于 getPathIterator,似乎为了实现它我需要返回一个类型为 PathIterator 的对象,但是在公共(public) AWT 包中没有可用的 PathIterator 接口(interface)的具体实现。

  3. 将 Path2D 包装在一个“记住”各个顶点并将其提供给客户端的对象中。当我需要一个记住其组件形状的 Area 时,这对我有用:我将它包装在一个实现 Shape 接口(interface)的 CompoundShape 类中,并将所有 Shape 方法转发给 Area 对它们的实现,同时跟踪添加到ArrayList 中的区域。这样做的问题是,如果我跟踪两个 float 数组中的各个顶点,则无法在用户不更改顶点的情况下将它们公开给用户 - 而且由于这会通过直接数组访问发生,内部 Path2D 不会收到更改通知。

  4. 复制 Polygon.java。 Java 的 Polygon 类的实际源代码可在 grepcode.com 上获得,我可以简单地将整个顶点相关的 int 替换为 float 以获得 Polygon2D。不幸的是,当我尝试这样做时,行 import sun.awt.geom.Crossings; 引发了一个编译器错误,提示“由于所需库 C:\Program Files\Java 的限制,无法访问类型 Crossings\jre7\lib\rt.jar。”根据this question发生这种情况是因为 Sun 的许可协议(protocol)阻止您用自己的 Java 类替换核心 Java 类,但 Polygon 不会尝试这样做 - 它只是创建一个 sun.awt.geom.Crossings 类型的对象,不会发生替换或扩展,而且我确保将我的 Polygon 副本放在一个不叫“java”的包中。

进行此操作的最佳方法是什么?我将不胜感激关于如何使这些选项之一起作用的建议,或者对于没有这些遇到的问题的另一个选项的想法。

最佳答案

我也会推荐 Path2D . GeneralPath是遗留类;不要使用它。

Path2D 确实提供了对顶点值的访问,尽管它是一种迂回的方式。您需要使用 PathIterator :

PathIterator pi = path.getPathIterator(null);
float[] value = new float[6];
float x = 0, y = 0;

while (!pi.isDone()) {
int type = pi.currentSegment(values);
if (type == PathIterator.SEG_LINETO) {
x = values[0];
y = values[1];
}
else if (type == PathIterator.SEG_CLOSE) {
x = 0;
y = 0;
}
else {
// SEG_MOVETO, SEG_QUADTO, SEG_CUBICTO
}
pi.next();
}

当您准备好尝试时,您可以扩展else 以支持二次曲线和三次曲线。我假设您此时不需要这些,因为您正在谈论多边形。

此外,Path2D 有一些方便的静态方法来测试路径是否为 intersects。一个矩形和路径是否contains一个矩形或点。遗憾的是,没有方法可以测试一条路径是否与另一条路径相交或包含另一条路径。

关于java - 在 Java 2D 中实现 Polygon2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11465330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com