A resposta depende do contexto : se você estiver investigando apenas um pequeno número (limitado) de segmentos, poderá conseguir uma solução computacionalmente cara. No entanto, parece provável que você queira incorporar esse cálculo a algum tipo de pesquisa de bons pontos de etiqueta. Nesse caso, é de grande vantagem ter uma solução que seja computacionalmente rápida ou permita atualização rápida de uma solução quando o segmento de linha candidato varia ligeiramente.
Por exemplo, suponha que você pretenda realizar uma pesquisa sistemáticaatravés de todo um componente conectado de um contorno, representado como uma sequência dos pontos P (0), P (1), ..., P (n). Isso seria feito inicializando um ponteiro (índice na sequência) s = 0 ("s" para "start") e outro ponteiro f (para "finish") para ser o menor índice para o qual a distância (P (f), P (s))> = 100 e, em seguida, avançando s pela distância (P (f), P (s + 1))> = 100. Isso produz uma polilinha candidata (P (s), P (s + 1) ..., P (f-1), P (f)) para avaliação. Depois de avaliar sua "adequação" para suportar um rótulo, você aumentaria s em 1 (s = s + 1) e aumentaria f para (digamos) f 'es para s' até que uma polilinha candidata exceda o mínimo é produzido um intervalo de 100, representado como (P (s '), ... P (f), P (f + 1), ..., P (f')). Ao fazer isso, os vértices P (s) ... P (s ' É altamente desejável que a aptidão possa ser rapidamente atualizada a partir do conhecimento apenas dos vértices descartados e adicionados. (Esse procedimento de digitalização continuará até s = n; como sempre, f deve ter permissão para "contornar" de n de volta a 0 no processo.)
Essa consideração exclui muitas medidas possíveis de adequação ( sinuosidade , tortuosidade etc.) que, de outra forma, poderiam ser atraentes. Isso nos leva a favorecer medidas baseadas em L2 , porque elas geralmente podem ser atualizadas rapidamente quando os dados subjacentes mudam ligeiramente. Fazer uma analogia com a análise de componentes principais sugere que adotarmos a seguinte medida (onde menor é melhor, conforme solicitado): use o menor dos dois valores próprios da matriz de covariânciadas coordenadas do ponto. Geometricamente, essa é uma medida do desvio "típico" de um lado para o outro dos vértices na seção candidata da polilinha. (Uma interpretação é que sua raiz quadrada é o semi-eixo menor da elipse, representando os segundos momentos de inércia dos vértices da polilinha.) Será igual a zero apenas para conjuntos de vértices colineares; caso contrário, excederá zero. Ele mede um desvio médio de um lado para o outro em relação à linha de base de 100 pixels criada pelo início e pelo final de uma polilinha e, portanto, possui uma interpretação simples.
Como a matriz de covariância é de apenas 2 por 2, os valores próprios são rapidamente encontrados através da resolução de uma única equação quadrática. Além disso, a matriz de covariância é uma soma das contribuições de cada um dos vértices de uma polilinha. Assim, ele é atualizado rapidamente quando pontos são eliminados ou adicionados, levando a um algoritmo O (n) para um contorno de n pontos: ele será bem dimensionado para os contornos altamente detalhados previstos no aplicativo.
Aqui está um exemplo do resultado desse algoritmo. Os pontos pretos são vértices de um contorno. A linha vermelha sólida é o melhor segmento de polilinha candidato de comprimento de ponta a ponta maior que 100 nesse contorno. (O candidato visualmente óbvio no canto superior direito não é suficientemente longo.)