Primitivas 2D

Point2D

Um ponto 2D imutável. A igualdade usa comparação com delta (≈ 1×10⁻¹⁰) para segurança numérica.

val p = Point2D(3.0, 4.0)
println(p.x)                    // 3.0
println(p.y)                    // 4.0
println(p.distanceFromOrigin)   // 5.0

Aritmética

Todos os operadores aritméticos padrão funcionam elemento a elemento ou com um escalar:

val a = Point2D(1.0, 2.0)
val b = Point2D(3.0, 4.0)

val soma    = a + b         // Point2D(4.0, 6.0)
val dif     = b - a         // Point2D(2.0, 2.0)
val escalado = a * 2.0      // Point2D(2.0, 4.0)
val metade  = b / 2.0       // Point2D(1.5, 2.0)
val neg     = -a            // Point2D(-1.0, -2.0)

Desestruturação

val (x, y) = Point2D(5.0, 7.0)

Distância

val p1 = Point2D(0.0, 0.0)
val p2 = Point2D(3.0, 4.0)
println(p1.distanceBetween(p2))  // 5.0

Rotação

import units.Angle

val p = Point2D(1.0, 0.0)

// Rotacionar 90° em torno da origem
val rotado = p.rotate(Angle.Degrees(90.0))
// → Point2D(0.0, 1.0)

// Rotacionar 45° em torno de um centro personalizado
val centro   = Point2D(1.0, 1.0)
val rotado2  = p.rotate(centro, Angle.Degrees(45.0))

Conversão para 3D

val p3D  = Point2D(1.0, 2.0).toPoint3D()        // z padrão = 0.0
val p3Dz = Point2D(1.0, 2.0).toPoint3D(z = 5.0)

Vector2D

Um vetor 2D definido por seus componentes e uma posição de cauda opcional (Point2D(0,0) por padrão).

// Vetor da origem com componentes (2, 3)
val v = Vector2D(2.0, 3.0)

// Vetor ancorado em um ponto
val v2 = Vector2D(1.0, 1.0, position = Point2D(2.0, 0.0))

// Construir a partir de dois pontos (cabeça − cauda)
val v3 = Vector2D(headPosition = Point2D(3.0, 4.0), tailPosition = Point2D(1.0, 1.0))

Propriedades

val v = Vector2D(3.0, 4.0)
println(v.module)           // 5.0   (magnitude euclidiana)
println(v.direction)        // Direction2D(0.6, 0.8)
println(v.headPosition)     // Point2D(3.0, 4.0)  (quando position é a origem)

Produto escalar e vetorial

val a = Vector2D(1.0, 0.0)
val b = Vector2D(0.0, 1.0)

println(a.dot(b))      // 0.0
val cross = a.cross(b) // VectorialEntity3D apontando ao longo de z

Ângulo entre vetores

import units.Angle

val a = Vector2D(1.0, 0.0)
val b = Vector2D(0.0, 1.0)
val angulo: Angle.Radians = a.angleBetween(b)

Direction2D

Um vetor de direção 2D unitário. Os componentes são normalizados automaticamente na construção.

val d = Direction2D(3.0, 4.0)   // armazenado como (0.6, 0.8)
println(d.module)               // 1.0

Constantes embutidas

Direction2D.MAIN_X_DIRECTION   // (1, 0)
Direction2D.MAIN_Y_DIRECTION   // (0, 1)

Direção perpendicular

Retorna a perpendicular no sentido anti-horário:

val direita = Direction2D.MAIN_X_DIRECTION
val cima    = direita.perpendicularDirection()  // Direction2D(0, 1)

Rotação

import units.Angle

val d = Direction2D.MAIN_X_DIRECTION
val rotado = d.rotate(Angle.Degrees(45.0))  // Direction2D(√2/2, √2/2)

PolarCoordinate

Representa um ponto na forma polar (raio, ângulo) e converte para Point2D.

import units.Angle

val polar = PolarCoordinate(radius = 5.0, angle = Angle.Degrees(53.13))
val cartesiano: Point2D = polar.toPoint2D()