我需要一个(简单的),不可变的,用于Java或Scala的2D矢量库

时间:2011-01-17 21:12:10

标签: java scala vector

我一直在寻找一整天。我试过Simplex3D Scala库。但它的文档记录很差,我甚至没有设法在下载旧版本后对矢量进行规范化,因为当前版本没有运行。

javax.vecmath不是不可变的,因此在Scala中使用它并不好。

commons-math更多地涉及科学数学方向,不便于2D(或3D)使用。

4 个答案:

答案 0 :(得分:2)

我需要的时候找不到一个。所以我建了一个,我一直打算发布它。我现在忙于做任何事情,但如果没有更好的答案,我可能会在下周提供。

答案 1 :(得分:2)

我刚做了一些研究。 Slick2D似乎包含一个具有不可变方法的Vector2f类。虽然这不是很多,可以在一个小时内手工完成。

答案 2 :(得分:2)

这是我为一些简单的游戏制作的那个。

它几乎不完美,它并非完全不可变。对于某些代码,我想要运算符的非不可变版本。最初它也包装了Vector2类的JBox2D,它缺少运算符重载和其他一些东西。

package Ostkaka

import scala.math

/**
 * Date: 2010-okt-06
 */
class Vector2(private var _x: Float, private var _y: Float) {
  def x = _x
  def y = _y

  def +(v: Vector2) = {var c = Vector2(x, y); c += v; c}

  def +=(v: Vector2) = {
    this._x += v.x
    this._y += v.y
    ()
  }

  def -(v: Vector2) = {var c = Vector2(x, y); c -= v; v}

  def -=(v: Vector2) = {
    this._x -= v.x
    this._y -= v.y
    ()
  }

  def /(factor: Float) = {var c = Vector2(x, y); c /= factor; c}

  def /=(factor: Float) = {
    this *= (1 / factor);
    ()
  }

  def *(factor: Float) = {var c = Vector2(x, y); c *= factor; c}

  def *=(factor: Float) = {
    this._x *= factor
    this._y *= factor
    ()
  }

  def unary_- : Vector2 = Vector2(-x, -y)

  def magnitude = (math.sqrt (x * x + y * y).toDouble).toFloat

  def normalised = this / magnitude

  def dot(v: Vector2) = x * v.x + y * v.y

  def project(v: Vector2) = {
    val axis = v.normalised
    axis * (this dot axis)
  }
}

object Vector2
{

  def zero = new Vector2(0, 0)

  def unitX = new Vector2(1, 0)

  def unitY = new Vector2(0, 1)

  implicit def Tuple2FloatToVector2(v: (Float, Float)): Vector2 = {
    new Vector2(v._1, v._2)
  }

  def apply(): Vector2 = {
    new Vector2(0, 0)
  }

  def apply(x: Float, y: Float): Vector2 = {
    new Vector2(x, y)
  }

}

答案 3 :(得分:2)

Simplex3d Math非常接近GLSL,因此GLSL上的任何手册也都可以使用。

您可以按如下方式对矢量'v'进行标准化:normalize(v)

Simplex3d Math是一个库,没有可运行的类,所以我不确定你的意思是“新版本没有运行”。请加入邮件列表并提供更多详细信息,我将非常乐意为您提供帮助:http://groups.google.com/group/simplex3d-dev

下一版本的文档将得到改进。