Celestia/Celx 脚本/CELX Lua 方法/Celx 向量
Celestia 中的 "向量" 对象是三个双精度浮点数的元组,它代表一个几何对象,在三维坐标系中具有长度和方向 [X, Y, Z]。
在 CELX 脚本中,向量方法需要以获取的 "向量" 对象为前缀,用分号隔开。
可以使用以下方法来获取 "向量" 对象
- 使用 celestia:newvector() 方法。
- 使用 position:vectorto() 方法。
- 使用 vector:normalize() 方法。
- 使用 rotation:imag() 方法。
- 使用 rotation:transform() 方法。
- 通过减去两个 "位置" 对象。
注意
- Celestia 中的向量分量 (X,Y,Z) 存储为百万分之一光年。因此,当您在脚本中定义了以公里或英里为单位的向量时,您需要将这些向量进行转换。您可以使用一个常量,它必须首先在您的脚本中初始化。
- 从公里转换为百万分之一光年,使用常量 uly_to_km = 9460730.4725808。
- 从英里转换为百万分之一光年,使用常量 uly_to_mls = 5912956.5453630。
- 接下来,您可以将公里或英里转换为百万分之一光年,如下所示
- 百万分之一光年 = 数字:公里 / uly_to_km
- 百万分之一光年 = 数字:英里 / uly_to_mls
"向量" 对象可以相互加减。
也可以将 "位置" 对象与 "向量" 对象相加,或从 "位置" 对象中减去 "向量" 对象。
- position + vector → position
- position - vector → position
- vector + vector → vector
- vector - vector → vector
标量乘以 "向量" 对象
- number * vector → vector
- vector * number → vector
* 运算符给出两个向量 v 和 w 的 点积
- v * w = v.x*w.x + v.y*w.y + v.z*w.z → number
^ 运算符给出两个向量 v 和 w 的 叉积
- v ^ w = [(v.y*w.z - v.z*w.y), (v.z*w.x - v.x*w.z), (v.x*w.y - v.y*w.x)] → vector
新向量垂直于包含两个输入向量的平面(根据右手定则)。
- v ^ w = - w ^ v
使用时要注意:^ 通常是 Lua 中的指数运算符,因此优先级高于几乎所有其他运算符,包括一元减号。
您可以直接访问和分配 "向量" 对象的 x、y 和 z 分量,例如
vec = celestia:newvector(0, 0, 0) vec.x = vec.x + 1
本章包含所有可用于 "向量" 对象的可用向量方法的列表。
number vector:getx()
将向量的 X 坐标作为数字返回。
示例
获取一个向量,该向量给出地球的日心位置,并在屏幕左下角显示该向量的 X、Y 和 Z 分量。
now = celestia:gettime() sunpos = celestia:find("Sol"):getposition(now) earthpos = celestia:find("Sol/Earth"):getposition(now) heliovector = sunpos:vectorto(earthpos) heliovector_x = heliovector:getx() heliovector_y = heliovector:gety() heliovector_z = heliovector:getz() celestia:print("Heliocentric position of Earth:\nX = " .. heliovector_x .. "\nY = " .. heliovector_y .. "\nZ = " .. heliovector_z, 10, -1, -1, 1, 6) wait(10.0)
number vector:gety()
将向量的 Y 坐标作为数字返回。
示例
获取一个向量,该向量给出地球的日心位置,并在屏幕左下角显示该向量的 X、Y 和 Z 分量。
now = celestia:gettime() sunpos = celestia:find("Sol"):getposition(now) earthpos = celestia:find("Sol/Earth"):getposition(now) heliovector = sunpos:vectorto(earthpos) heliovector_x = heliovector:getx() heliovector_y = heliovector:gety() heliovector_z = heliovector:getz() celestia:print("Heliocentric position of Earth:\nX = " .. heliovector_x .. "\nY = " .. heliovector_y .. "\nZ = " .. heliovector_z, 10, -1, -1, 1, 6) wait(10.0)
number vector:getz()
将向量的 Z 坐标作为数字返回。
示例
获取一个向量,该向量给出地球的日心位置,并在屏幕左下角显示该向量的 X、Y 和 Z 分量。
now = celestia:gettime() sunpos = celestia:find("Sol"):getposition(now) earthpos = celestia:find("Sol/Earth"):getposition(now) heliovector = sunpos:vectorto(earthpos) heliovector_x = heliovector:getx() heliovector_y = heliovector:gety() heliovector_z = heliovector:getz() celestia:print("Heliocentric position of Earth:\nX = " .. heliovector_x .. "\nY = " .. heliovector_y .. "\nZ = " .. heliovector_z, 10, -1, -1, 1, 6) wait(10.0)
vector vector:normalize()
返回一个归一化的 "向量" 对象。
归一化向量是指一个向量,它与原始向量指向相同的方向,但 长度 = 1。
注意
- 此方法不会修改原始向量。
- 归一化零长度向量会导致除以零。结果将是一个 NaN 向量。
- CELX "向量" 对象是一个几何对象,它在三维坐标系中具有长度和方向 [X, Y, Z]。
- 向量方法可以用于 CELX "向量" 对象。"向量" 对象也可以用在其他方法中,这些方法需要 "向量" 对象作为参数。
示例
创建一个向量,该向量从地球的实际位置指向月球的实际位置,长度 = 1。
earth = celestia:find("Sol/Earth") moon = celestia:find("Sol/Earth/moon") now = celestia:gettime() earthpos = earth:getposition(now) moonpos = moon:getposition(now) vector = earthpos:vectorto(moonpos) n_vector = vector:normalize()
number vector:length()
将此向量的长度(以百万分之一光年为单位)作为数字返回。
示例
以公里为单位显示从地球 中心 到月球 中心 的实际距离。
uly_to_km = 9460730.4725808 earth = celestia:find("Sol/Earth") moon = celestia:find("Sol/Earth/moon") now = celestia:gettime() earthpos = earth:getposition(now) moonpos = moon:getposition(now) vector = earthpos:vectorto(moonpos) distance = vector:length() * uly_to_km celestia:print("Actual distance center Earth - center Moon: " .. distance .. " km.", 10.0, -1, -1, 2, 4) wait(10.0)