跳转至内容

Celestia/Celx 脚本/CELX Lua 方法/Celx 向量

来自维基教科书,自由的教学读物

Celx 脚本: 向量

[编辑 | 编辑源代码]

Celestia 中的 "向量" 对象是三个双精度浮点数的元组,它代表一个几何对象,在三维坐标系中具有长度和方向 [X, Y, Z]。

在 CELX 脚本中,向量方法需要以获取的 "向量" 对象为前缀,用分号隔开。

可以使用以下方法来获取 "向量" 对象

注意

  1. Celestia 中的向量分量 (X,Y,Z) 存储为百万分之一光年。因此,当您在脚本中定义了以公里或英里为单位的向量时,您需要将这些向量进行转换。您可以使用一个常量,它必须首先在您的脚本中初始化。
    • 从公里转换为百万分之一光年,使用常量 uly_to_km = 9460730.4725808。
    • 从英里转换为百万分之一光年,使用常量 uly_to_mls = 5912956.5453630。
  2. 接下来,您可以将公里或英里转换为百万分之一光年,如下所示
    • 百万分之一光年 = 数字:公里 / 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)


返回 vector 方法索引。

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)


返回 vector 方法索引。

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 方法索引。

normalize

[编辑 | 编辑源代码]

vector vector:normalize()

返回一个归一化的 "向量" 对象。
归一化向量是指一个向量,它与原始向量指向相同的方向,但 长度 = 1

注意

  1. 此方法不会修改原始向量。
  2. 归一化零长度向量会导致除以零。结果将是一个 NaN 向量。
  3. CELX "向量" 对象是一个几何对象,它在三维坐标系中具有长度和方向 [X, Y, Z]。
  4. 向量方法可以用于 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()


返回 vector 方法索引。

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)


返回 vector 方法索引。

华夏公益教科书