我一直在寻找一整天。我试过Simplex3D Scala库。但它的文档记录很差,我甚至没有设法在下载旧版本后对矢量进行规范化,因为当前版本没有运行。
javax.vecmath不是不可变的,因此在Scala中使用它并不好。
commons-math更多地涉及科学数学方向,不便于2D(或3D)使用。
答案 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
下一版本的文档将得到改进。