Java/JavaME : Quicker geometric vector addition

标签 java vector geometry addition

我正在制作一个具有简单用法的简单 Vector 类,因此我不想导入整个库(例如 JScience...)来完成我自己可以做的事情。

目前我已经编写了这段代码:

public void add(Vector2D v){
    double ang = this.angle*Math.PI/180;
    double mag = this.magnitude;
    double ang0 = v.angle*Math.PI/180;
    double mag0 = v.magnitude;
    //vector to coordinates
    double x1 = mag*Math.cos(ang);
    double y1 =-mag*Math.sin(ang);
    //adding the other vector's coordinates
    double x2 =x1+mag*Math.cos(ang0);
    double y2 =y1-mag*Math.sin(ang0);
    //back to vector form
    double newMagnitude = Math.sqrt(x2*x2+y2*y2);
    double newAngle = Math.atan2(y2,x2);
    this.magnitude = newMagnitude;
    this.angle = newAngle;

}

它将两个 vector 转换为坐标,然后用三角函数转换回来,但这些速度非常慢,并且该方法将非常频繁地使用。

还有更好的办法吗?

最佳答案

首先,一些术语 101:

点:构成空间的无量纲实体。

空间:一组点。

欧几里得空间:一组点、一组线以及紧密度(拓扑)的概念。该组线受欧几里得公理的约束。它由其维度唯一定义。

vector :欧几里德空间中两点之间的平移不变关系。

坐标系:从实数元组到某个空间中的点或 vector 的映射。

笛卡尔坐标系:特定的映射,其属性(在欧几里德二维空间的情况下)是点集ax+by+c=0一条线,除非 a,b 都为零,否则 vector [0,1][1,0] 垂直且单位长度,并且空间中的点靠近,当且仅当它们在所有坐标中都靠近。这就是您所说的“坐标”。

极坐标系:另一个特定的映射,可以从笛卡尔坐标定义:极坐标中的[arg,mag]映射到[cos( arg)*mag, sin(arg)*mag] 在笛卡尔坐标中。这就是您所说的“vector 形式”。


与极坐标系相比,笛卡尔坐标系具有多个优点。其中之一是更简单的加法:[x1,y1]+[x2,y2]=[x1+x2,y1+y2] 和标量乘法:[x1,y1].[x2 ,y2]=x1*x2+y1*y2。加法反转也稍微容易一些:-[x,y]=[-x,-y]

另一个好处是,虽然极坐标是严格的二维(没有唯一的扩展 - 尽管球坐标系是一个候选),但笛卡尔坐标可以自然地扩展到任意数量的维度。

因此,始终以笛卡尔坐标形式存储 vector 是有益的(而且通常是这样)。

如果您需要极坐标形式的 vector ,那么(并且只有这样)才能一劳永逸地进行转换。

极坐标没那么有用。它们可用于输入和输出,但很少用于计算。


您继续以极坐标形式存储 vector 。您将它们转换为笛卡尔形式进行计算,然后转换回极坐标 - 只是再次将它们转换为笛卡尔形式。

您应该以笛卡尔形式存储 vector 。如果放弃冗余转换,性能改进应该是显而易见的。

即使您想要旋转 vector ,转换为极坐标和反向也没有什么好处。按符号角度 a 旋转就像 [x*cos(a)+y*sin(a), y*cos(a)-x*sin(a)]。这是两个三角函数(最多 - 您可以缓存这些值)来旋转整个 vector 数组。

关于Java/JavaME : Quicker geometric vector addition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14107279/

相关文章:

mysql - 在 phpMyAdmin 中导入带有多边形数据的 CSV

css - 如何在 css 中构建 3d 室内 View ?

java - 将 CLOB 插入 Oracle 数据库

java - 是否可以使用 java 文件系统创建一个新的 zip 文件?

c++ - std::vector 超出范围

java - 查找 vector 的重复项并删除,保留平行 vector 的顺序

java - 从文件对象枚举加载

java - 检测 JTabbedPane 中具有多个 JTable 的 onChanged() 事件的表

c++ - 访问冲突 C++(删除 vector 中的项目)

opengl - OpenGL立方体贴图中的面约定