Em topografia e navegação, a reseção (ou problema de Snellius) consiste em determinar as coordenadas desconhecidas de um ponto P(x, y) a partir de medições angulares entre três pontos de referência A(xA, yA), B(xB, yB) e C(xC, yC) de posições conhecidas.
Dados do problema:
- Pontos conhecidos: A, B, C com coordenadas conhecidas.
- Ângulos medidos em campo: α = ∠APB (ângulo em P entre A e B) e β = ∠BPC (ângulo em P entre B e C).
- Objetivo: encontrar P(x, y) que satisfaça simultaneamente as duas medições angulares.
Passo 1: Vetores posição relativos a P
Definimos os vetores que ligam o ponto desconhecido P a cada referência:
$$\vec{PA} = (x_A - x,\; y_A - y), \quad \vec{PB} = (x_B - x,\; y_B - y), \quad \vec{PC} = (x_C - x,\; y_C - y)$$
Passo 2: Ângulo entre dois vetores
Pela definição do produto escalar: \(\vec{u} \cdot \vec{v} = \|\vec{u}\| \|\vec{v}\| \cos \theta\). Isolando o cosseno e aplicando o arco-cosseno, obtemos o ângulo θ ∈ [0, π]:
$$\theta = \arccos\left( \frac{\vec{u} \cdot \vec{v}}{\|\vec{u}\| \|\vec{v}\|} \right)$$
Passo 3: Ângulos calculados a partir de P(x, y)
Para um dado candidato P(x, y), calculamos os ângulos geométricos:
Produtos escalares (explicitados):
$$\vec{PA} \cdot \vec{PB} = (x_A - x)(x_B - x) + (y_A - y)(y_B - y)$$
$$\vec{PB} \cdot \vec{PC} = (x_B - x)(x_C - x) + (y_B - y)(y_C - y)$$
Normas (distâncias euclidianas):
$$\|\vec{PA}\| = \sqrt{(x_A - x)^2 + (y_A - y)^2}$$
$$\|\vec{PB}\| = \sqrt{(x_B - x)^2 + (y_B - y)^2}$$
$$\|\vec{PC}\| = \sqrt{(x_C - x)^2 + (y_C - y)^2}$$
Ângulos calculados:
$$\hat{\alpha}(x,y) = \arccos\left( \frac{(x_A - x)(x_B - x) + (y_A - y)(y_B - y)}{\sqrt{(x_A - x)^2 + (y_A - y)^2} \;\cdot\; \sqrt{(x_B - x)^2 + (y_B - y)^2}} \right)$$
$$\hat{\beta}(x,y) = \arccos\left( \frac{(x_B - x)(x_C - x) + (y_B - y)(y_C - y)}{\sqrt{(x_B - x)^2 + (y_B - y)^2} \;\cdot\; \sqrt{(x_C - x)^2 + (y_C - y)^2}} \right)$$
Passo 4: Funções residuais (sistema explícito)
No ponto verdadeiro P*, os ângulos calculados devem coincidir com os ângulos medidos. Definimos os resíduos:
$$f(x,y) = \hat{\alpha}(x,y) - \alpha = \arccos\left( \frac{(x_A - x)(x_B - x) + (y_A - y)(y_B - y)}{\sqrt{(x_A - x)^2 + (y_A - y)^2} \; \sqrt{(x_B - x)^2 + (y_B - y)^2}} \right) - \alpha$$
$$g(x,y) = \hat{\beta}(x,y) - \beta = \arccos\left( \frac{(x_B - x)(x_C - x) + (y_B - y)(y_C - y)}{\sqrt{(x_B - x)^2 + (y_B - y)^2} \; \sqrt{(x_C - x)^2 + (y_C - y)^2}} \right) - \beta$$
🎯 Sistema Não Linear 2×2 (Forma Explícita):
$$\begin{cases}
f(x,y) = 0 \\[8pt]
g(x,y) = 0
\end{cases}$$
Ou equivalentemente:
$$\begin{cases}
\arccos\left( \dfrac{(x_A - x)(x_B - x) + (y_A - y)(y_B - y)}{\sqrt{(x_A - x)^2 + (y_A - y)^2} \; \sqrt{(x_B - x)^2 + (y_B - y)^2}} \right) = \alpha \\[12pt]
\arccos\left( \dfrac{(x_B - x)(x_C - x) + (y_B - y)(y_C - y)}{\sqrt{(x_B - x)^2 + (y_B - y)^2} \; \sqrt{(x_C - x)^2 + (y_C - y)^2}} \right) = \beta
\end{cases}$$
Buscamos \((x^*, y^*)\) que zere simultaneamente ambas as equações. Como não há solução analítica fechada, aplicamos o Método de Newton-Raphson com diferenciação numérica e amortecimento para garantir convergência global.
Passo 5: Método de Newton-Raphson para resolução
O método de Newton-Raphson em 2D itera:
$$\begin{bmatrix} x_{k+1} \\ y_{k+1} \end{bmatrix} = \begin{bmatrix} x_k \\ y_k \end{bmatrix} - \mathbf{J}^{-1}(x_k, y_k) \begin{bmatrix} f(x_k, y_k) \\ g(x_k, y_k) \end{bmatrix}$$
onde J é a matriz Jacobiana:
$$\mathbf{J}(x,y) = \begin{bmatrix} \frac{\partial f}{\partial x} & \frac{\partial f}{\partial y} \\[6pt] \frac{\partial g}{\partial x} & \frac{\partial g}{\partial y} \end{bmatrix}$$
Como f e g envolvem arccos e raízes quadradas, calculamos as derivadas numericamente via diferenças finitas:
$$\frac{\partial f}{\partial x} \approx \frac{f(x+\epsilon, y) - f(x, y)}{\epsilon}, \quad \epsilon \text{ pequeno (ex: } 10^{-8})$$
Passo 6: Amortecimento para convergência global
Newton-Raphson puro pode divergir se o chute inicial estiver longe da solução. Introduzimos um fator de amortecimento λk ∈ (0, 1]:
$$\begin{bmatrix} x_{k+1} \\ y_{k+1} \end{bmatrix} = \begin{bmatrix} x_k \\ y_k \end{bmatrix} - \lambda_k \cdot \mathbf{J}^{-1}(x_k, y_k) \begin{bmatrix} f(x_k, y_k) \\ g(x_k, y_k) \end{bmatrix}$$
Escolhemos λk reduzindo-o (ex: dividindo por 2) enquanto a norma dos resíduos não diminuir:
$$||f_{k+1}|| + ||g_{k+1}|| < ||f_k|| + ||g_k||$$
⚠️ Estabilidade Numérica & Círculo de Perigo:
Clamping do arccos: Para evitar erros de arredondamento quando o argumento do arccos ultrapassa levemente ±1, aplicamos um clamping computacional:
$$\text{arg}_{\text{safe}} = \max(-1, \min(1, \text{arg}))$$
Círculo de perigo: Se P estiver sobre o círculo circunscrito ao triângulo ABC, o sistema torna-se singular (infinitas soluções). O algoritmo detecta essa condição automaticamente via det(J) ≈ 0 e ativa o fator de amortecimento ou reinicia a iteração com novo chute inicial.
Resumo da dedução explícita:
- Defina vetores \(\vec{PA}, \vec{PB}, \vec{PC}\) a partir de P desconhecido
- Calcule produtos escalares e normas em função de x, y
- Determine ângulos geométricos \(\hat{\alpha}(x,y)\) e \(\hat{\beta}(x,y)\) com arccos do produto escalar
- Forme resíduos \(f(x,y) = \hat{\alpha} - \alpha\) e \(g(x,y) = \hat{\beta} - \beta\)
- Use Newton-Raphson numericamente para resolver \(f=0, g=0\)
- Adicione amortecimento e clamping para robustez numérica
- Monitore singularidade pelo determinante da Jacobiana