As respostas existentes não levam em consideração que os pontos finais são arbitrários (e não dados). Portanto, ao medir a retidão da curva, não faz sentido usar os pontos finais (por exemplo, para calcular o comprimento, ângulo, posição esperados). Um exemplo simples seria uma linha reta com as duas extremidades torcidas. Se medirmos usando a distância da curva e a linha reta entre os pontos finais, isso será bastante grande, pois a linha reta que desenhamos é deslocada da linha reta entre os pontos finais.
Como sabemos se a curva é reta? Supondo que a curva seja suave o suficiente, queremos saber quanto, em média, a tangente à curva está mudando. Para uma linha, isso seria zero (como a tangente é constante).
Se deixarmos a posição no tempo t ser (x (t), y (t)), a tangente é (Dx (t), Dy (t)), onde Dx (t) é a derivada de x no tempo t (este site parece estar com falta de suporte TeX). Se a curva não for parametrizada pelo comprimento do arco, normalizamos dividindo por || (Dx (t), Dy (t)) ||. Portanto, temos um vetor unitário (ou ângulo) da tangente à curva no tempo t. Então, o ângulo é a (t) = (Dx (t), Dy (t)) / || (Dx (t), Dy (t)) ||
Estamos interessados em || Da (t) || ^ 2 integrado ao longo da curva.
Dado que provavelmente temos pontos de dados discretos em vez de uma curva, devemos usar diferenças finitas para aproximar as derivadas. Então, Da (t) se torna (a(t+h)-a(t))/h
. E, a (t) se torna ((x(t+h)-x(t))/h,(y(t+h)-y(t))/h)/||((x(t+h)-x(t))/h,(y(t+h)-y(t))/h)||
. Em seguida, obtemos S somando h||Da(t)||^2
todos os pontos de dados e possivelmente normalizando pelo comprimento da curva. Muito provavelmente, usamos h=1
, mas é realmente apenas um fator de escala arbitrário.
Para reiterar, S será zero para uma linha e maior quanto mais se desvia de uma linha. Para converter para o formato necessário, use 1/(1+S)
. Dado que a escala é um tanto arbitrária, é possível multiplicar S por algum número positivo (ou transformá-lo de outra maneira, por exemplo, use bS ^ c em vez de S) para ajustar a retidão de certas curvas.