Vetores (std::vec)
Nesta página
std::vec fornece vetores de ponto flutuante com 2, 3 ou 4 componentes —
úteis para matemática de jogos, animação, física e manipulação de cores.
Importe com use std::vec. As operações são funções (vec.add, vec.dot…);
um tipo primitivo nativo com sobrecarga de operadores é planejado para uma
iteração futura.
Construtores e aritmética
vec.vec2, vec.vec3 e vec.vec4 criam vetores; vec.zero(n) cria o vetor
nulo de dimensão n. Os componentes são acessados como campos .x, .y,
.z, .w.
Adição, subtração, escala, produto interno, produto vetorial, comprimento, normalização, distância e interpolação linear.
// Feature: vec stdlib — 2/3/4-component float vectors
// When to use: creative coding, gameplay math, color math, plugin interop.
//
// MVP scope (today): vectors are plain tables with named axes; ops are
// functions, not operators. A future iteration will add primitive
// `vec3<f32>` types with operator overloading and full swizzling.
//
// See `specs/vec-primitive-types.md` for the full target spec.
use std::vec
// Constructors — vec2 / vec3 / vec4 plus a `zero(n)` shortcut.
let p = vec.vec3(1.0, 2.0, 3.0)
let q = vec.vec3(0.5, 0.5, 0.5)
let z3 = vec.zero(3)
// Field access by axis name.
print("p = ({p.x}, {p.y}, {p.z})") // (1, 2, 3)
print("z3 = ({z3.x}, {z3.y}, {z3.z})") // (0, 0, 0)
// Arithmetic — addition, subtraction, scalar scale.
let sum = vec.add(p, q)
print("p + q = ({sum.x}, {sum.y}, {sum.z})") // (1.5, 2.5, 3.5)
let diff = vec.sub(p, q)
print("p - q = ({diff.x}, {diff.y}, {diff.z})") // (0.5, 1.5, 2.5)
let doubled = vec.scale(p, 2.0)
print("p * 2 = ({doubled.x}, {doubled.y}, {doubled.z})") // (2, 4, 6)
// Dot product (scalar).
print("p . q = {vec.dot(p, q)}") // 3
// Cross product (vec3-only).
let cross = vec.cross(vec.vec3(1.0, 0.0, 0.0), vec.vec3(0.0, 1.0, 0.0))
print("x x y = ({cross.x}, {cross.y}, {cross.z})") // (0, 0, 1)
// Length / length squared.
print("|p| = {vec.length(p)}") // 3.7416...
print("|p|^2 = {vec.length_sq(p)}") // 14
// Normalize — handles zero-length gracefully (returns zero vector).
let n = vec.normalize(p)
print("normalize(p) = ({n.x}, {n.y}, {n.z})")
// Distance.
print("distance(p, q) = {vec.distance(p, q)}")
// Componentwise linear interpolation.
let mid = vec.lerp(p, q, 0.5)
print("lerp(p, q, 0.5) = ({mid.x}, {mid.y}, {mid.z})")
Aliases de cor e swizzle
Os vetores vec3/vec4 expõem também os campos .r, .g, .b, .a —
sinônimos de .x, .y, .z, .w. Acesso multi-componente (.rgb, .bgr,
.xxxx…) retorna um novo vetor reordenado ou replicado. Misturar os conjuntos
xyzw e rgba no mesmo swizzle retorna nil.
Aliases rgba; swizzles rgb, bgr, xy, xxxx, bgra; swizzle inválido xr retorna nil; lerp entre cores.
// Feature: vec stdlib — color aliases and multi-component swizzling
// When to use: graphics code that reads better with rgba than xyzw.
//
// vec3/vec4 expose both .x/.y/.z/.w and .r/.g/.b/.a fields pointing at
// the same component values. Multi-component access (`.xyz`, `.bgr`,
// `.xxxx`, etc.) returns a NEW vector via the swizzle metamethod —
// reorder, reduce, or replicate components as needed.
use std::vec
let color = vec.vec4(1.0, 0.5, 0.25, 0.9)
// Single component (existing):
print("xyzw: ({color.x}, {color.y}, {color.z}, {color.w})")
print("rgba: ({color.r}, {color.g}, {color.b}, {color.a})")
// Multi-component swizzles return a NEW vector componentwise.
// Same set must be used end-to-end — `.xr` mixes xyzw with rgba and
// returns nil.
let rgb = color.rgb // vec3(1, 0.5, 0.25)
print("rgb = ({rgb.r}, {rgb.g}, {rgb.b})")
let bgr = color.bgr // vec3(0.25, 0.5, 1) — reordered
print("bgr = ({bgr.r}, {bgr.g}, {bgr.b})")
let xy = color.xy // vec2(1, 0.5)
print("xy = ({xy.x}, {xy.y})")
let xxxx = color.xxxx // vec4(1, 1, 1, 1) — replicated
print("xxxx = ({xxxx.x}, {xxxx.y}, {xxxx.z}, {xxxx.w})")
let bgra = color.bgra // vec4(0.25, 0.5, 1, 0.9) — color swap
print("bgra = ({bgra.r}, {bgra.g}, {bgra.b}, {bgra.a})")
// Invalid swizzles return nil. Mixing sets and oversize keys:
let mixed = color.xr
print("xr (mixed set) = {mixed}") // nil
// Composing colors with lerp:
let red = vec.vec4(1.0, 0.0, 0.0, 1.0)
let blue = vec.vec4(0.0, 0.0, 1.0, 1.0)
let purple = vec.lerp(red, blue, 0.5)
print("red+blue/2 = ({purple.r}, {purple.g}, {purple.b}, {purple.a})")
Desafio
Crie dois vetores vec3 representando dois pontos no espaço, calcule a distância
entre eles com vec.distance e verifique que o vetor normalizado de direção tem
comprimento ~= 1.0.
Veja também