【问题标题】:How to convert between "similar" 3D-vector classes in java?java - 如何在java中“相似”的3D向量类之间进行转换?
【发布时间】:2011-09-04 23:44:04
【问题描述】:

我正在编写一个 geom 包作为 Java 库的一部分,它有自己的矢量类:

package mypackage.geom;

public class Vector3D {
  public float x;
  public float y;
  public float z;

  public Vector3D(float x, float y, float z) {
    this.x = x;
    this.y = y;
    this.z = z;
  }
  ...
}

我的库有望补充第三方库的功能,该库也实现了矢量类,例如 Vec3DVec3D 类具有与我的 Vector3D 类相同的字段(float xfloat yfloat z)和构造函数签名。我只想在我的库中需要 Vector3D 参数的任何地方使用第三方向量类(例如,假设我有一个具有 setPosition(Vector3D vector3D) 方法的 Camera 类,并且我希望能够传递 @987654331 @ 实例)。

这在 C++ 中是可能的。例如,可以通过以下方式将任何类的通用显式转换器构造函数声明为 Vector3D:

template <class C>
explicit Vector3D(const C& c) : x(c[0]), y(c[1]), z(c[2]) {}

它只需要foreigner类实现operator[]。如果可能的话,我想知道如何在 Java 中实现类似的东西。

【问题讨论】:

  • 既然您的库正在扩展这个其他库,您是否有理由不简单地使用Vec3D 类?如果由于某种原因你必须拥有自己的类,定义Vector3D 来扩展Vec3D 是否可行?
  • 我应该说“补充”而不是“扩展”。我更新了原文。

标签: java type-conversion


【解决方案1】:

有几个选项,没有一个像你展示的那样好。首先,当然,你可以写一个显式的构造函数:

Vector3d(Vec3d v) {this.x = v.x; this.y = v.y; this.z = v.z; }

其次,您可以提供一个构造函数,该构造函数适用于实现您定义的接口的任何向量类型(称之为“V”:)

Vector3d(V v) {this.x = v.getX(); this.y = v.getY(); this.z = v.getZ(); }

当然,任何类似随机向量的东西实现 V 的可能性几乎是 0,除非你是某种标准机构。

您还可以提供一个采用double[] 的构造函数,假设大多数此类类型将提供toArray() 之类的方法:

Vector3d(double[] v) {this.x = v[0]; this.y = v[1]; this.z = v[2]; }

这将使将大多数其他矢量类转换为您的矢量类变得相对容易,而无需添加自定义构造函数。

【讨论】:

    【解决方案2】:

    我认为这最接近任何(未知)类的转换器构造函数:

    public vec(Object any)
    {
        try {
            x = any.getClass().getDeclaredField("x").getDouble(any);
            y = any.getClass().getDeclaredField("y").getDouble(any);
            z = any.getClass().getDeclaredField("z").getDouble(any);
        } catch ( Exception e ) {
            throw(new RuntimeException("vec cannot handle class in constructor: "+any.getClass(),e));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 2012-11-14
      • 2023-04-03
      • 1970-01-01
      • 2016-02-05
      • 2010-10-13
      • 1970-01-01
      相关资源
      最近更新 更多