gpt4 book ai didi

Java/JavaME : Quicker geometric vector addition

转载 作者:行者123 更新时间:2023-11-30 09:28:15 25 4
gpt4 key购买 nike

我正在制作一个使用简单的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com