编写小型Java3D向量类的最佳方法

编写小型Java3D向量类的最佳方法,java,math,vector,Java,Math,Vector,嗨,我目前正在做一个小项目,我必须添加一个类,它允许我将两个向量相加/相减。 例如,向量是向量(x,y,z) 最好的编码方式是什么?我不想使用来自internet的类,因为我认为我需要的功能非常基本 这里是我一直在思考的一些伪代码: 向量(x,y,z)是[0]=x,[1]=y[2]=z的数组 如果我们有向量1(x1,y1,z1)和向量2(x2,y2,z2),我们就有一个3d数组,它基本上包含[0]=x1+x2[1]=y1+y2和[2]=z1+z2 这是正确的方法吗?如果向量总是三维的,我不会使用

嗨,我目前正在做一个小项目,我必须添加一个类,它允许我将两个向量相加/相减。 例如,向量是向量(x,y,z)

最好的编码方式是什么?我不想使用来自internet的类,因为我认为我需要的功能非常基本

这里是我一直在思考的一些伪代码: 向量(x,y,z)是[0]=x,[1]=y[2]=z的数组 如果我们有向量1(x1,y1,z1)和向量2(x2,y2,z2),我们就有一个3d数组,它基本上包含[0]=x1+x2[1]=y1+y2和[2]=z1+z2
这是正确的方法吗?

如果向量总是三维的,我不会使用数组,它可能会让事情变得不那么清楚。试着这样做:

public class Vector {
  private final double x;
  private final double y;
  private final double z;

  public Vector(double x, double y, double z) {
    this.x = x;
    this.y = y;
    this.z = z;
  }

  // Getters...

  public Vector add(Vector addend) {
    return new Vector(x + addend.x, y + addend.y, z + addend.z);
  }

  // Other operations...
}

通常最好将字段设置为final,这样您就可以确定数据不会意外地改变值,因为您意外地与代码的另一部分共享了一个引用。

如果向量始终是三维的,我不会使用数组,这可能会使事情变得不那么清楚。试着这样做:

public class Vector {
  private final double x;
  private final double y;
  private final double z;

  public Vector(double x, double y, double z) {
    this.x = x;
    this.y = y;
    this.z = z;
  }

  // Getters...

  public Vector add(Vector addend) {
    return new Vector(x + addend.x, y + addend.y, z + addend.z);
  }

  // Other operations...
}

通常最好将字段设置为final,这样您就可以确定数据不会意外地改变值,因为您意外地与代码的另一部分共享了引用。

只需将每个组件存储为变量即可。没有必要使用数组。我会写一些简单的东西:

public class Vector3 {

    double x, y, z; // package-private variables; nice encapsulation if you place this in a maths package of something

    Vector3(double x, double y, double z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public Vector3 add(Vector3 vector) {
        x += vector.x;
        y += vector.y;
        z += vector.z;
        return this; // method chaining would be very useful
    }

}

只需将每个组件存储为变量。没有必要使用数组。我会写一些简单的东西:

public class Vector3 {

    double x, y, z; // package-private variables; nice encapsulation if you place this in a maths package of something

    Vector3(double x, double y, double z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public Vector3 add(Vector3 vector) {
        x += vector.x;
        y += vector.y;
        z += vector.z;
        return this; // method chaining would be very useful
    }

}


为了让这成为一个好问题,你应该给我们一个建议,比如你认为应该如何做。用Java编写这样的类很可怕:Java泛型很糟糕,而且没有运算符重载。即使您使用java方式(无运算符、“add”方法和同事),java中传递功能的唯一方式就是通过接口,例如,不可能添加两个整数?这是正确的方法吗?@user3084311与之相反?为了让这成为一个好问题,您应该给我们一个建议,例如,您认为应该如何做。用Java编写这种类很可怕:Java泛型很糟糕,并且没有运算符重载。即使您使用java方式(无运算符、“add”方法和同事),java中传递功能的唯一方式就是通过接口,例如,不可能添加两个整数?这是正确的方法吗?@user3084311与之相反?创建新对象只是一种浪费。如果它们封装得很好,就没有必要让它们成为最终版本。我不同意。封装不会阻止您在代码的不同部分中对同一
向量
实例有两个引用,更改其中一个将导致对另一个的意外更改。我将从这种方法开始,并且只在出现经验证的性能问题时才使用可变性。这允许方法链接。关于成本,我不是说成本更低:我是说,根据上下文的不同,额外的成本可能可以忽略不计,并且您可以获得清晰性、易用性和更少的bug。除了游戏(GC成本实际上很重要)之外,不变性是首选的。《有效Java第二版》是一本关于这个主题的好书。@Manu343726您不需要它,它通常是为了统一而做的。每个人都希望字段是私有的,并获得访问这些字段的方法。由于字段是
final
,直接访问它们不会有任何区别(而且JIT将内联getter调用)。创建新对象只是一种浪费。如果它们封装得很好,就没有必要让它们成为最终版本。我不同意。封装不会阻止您在代码的不同部分中对同一
向量
实例有两个引用,更改其中一个将导致对另一个的意外更改。我将从这种方法开始,并且只在出现经验证的性能问题时才使用可变性。这允许方法链接。关于成本,我不是说成本更低:我是说,根据上下文的不同,额外的成本可能可以忽略不计,并且您可以获得清晰性、易用性和更少的bug。除了游戏(GC成本实际上很重要)之外,不变性是首选的。《有效Java第二版》是一本关于这个主题的好书。@Manu343726您不需要它,它通常是为了统一而做的。每个人都希望字段是私有的,并获得访问这些字段的方法。由于字段是
final
,直接访问它们不会有什么区别(而且JIT将内联getter调用),将这些基本构建块的类编码为不可变类更为有益。@Darkhogg根据我的经验,性能优化的唯一来源是拥有可变类,这样我就可以通过在每一帧中保留使用ovar的临时类来删除分配。@LennartRolland如果是用于您需要尽可能主动地阻止GC运行,然后是的,我也会这样做。然而,总的来说,这并不像你想象的那样有益:Java中的分配几乎是即时的,性能损失只来自GC,对于短期对象来说,GC非常快,在大多数不需要(近)实时性能的应用程序中不会被注意到,将这些基本构建块的类编码为不可变类更为有益。@Darkhogg根据我的经验,性能优化的唯一来源是拥有可变类,这样我就可以通过在每一帧中保留使用ovar的临时类来删除分配。@LennartRolland如果是用于您需要尽可能主动地阻止GC运行,然后是的,我也会这样做。然而,总的来说,它并不像您想象的那样有益:Java中的分配几乎是即时的,而