2009-07-28 6 views
1

Existe-t-il un algorithme (de préférence en implémentation C#) qui me permet de comparer la similarité de deux lignes? Dans mon cas, j'ai une ligne de référence, et j'ai beaucoup de lignes secondaires, je dois choisir, parmi tant de lignes secondaires, qui est la plus proche de la ligne de référence. Editer: C'est une ligne 2D, avec des points de départ et d'arrêt. Lorsque vous comparez les similitudes, vous devez prendre en compte la ligne pleine. La direction de la ligne (c'est-à-dire, de gauche à droite ou vice versa) n'est pas importante. Et oui, cela a à voir avec la façon dont il est proche les uns des autresMétrique à comparer Similaire à deux lignes linéaires 2D

Je sais que c'est un peu subjectif (la similitude, pas la question), mais je suis sûr qu'il y a des gens qui ont travaillé sur ce.

+0

Dans combien de dimensions? – Nosredna

+0

Pourriez-vous fournir un peu plus de contexte? Est-ce que les lignes ont des points de début et de fin, ou sont-elles des vecteurs de direction à travers un point? Est-il plus important qu'une ligne soit proche de la ligne de référence, ou que ce soit la même longueur/direction? À quoi sert ce test? –

+1

J'ai peur que vous deviez être celui qui décide de ce que signifie "similaire". Cela a-t-il quelque chose à voir avec la distance qui les sépare? Ou est-ce juste une question de direction? – Nosredna

Répondre

0

Si vous parlez de lignes dans le sens graphique, alors je regarderais une combinaison de choses comme la longueur de ligne et l'angle. En fonction de votre situation, vous pouvez effectuer des optimisations telles que l'utilisation du carré de la longueur (sauvegarde une racine carrée) et dy/dx pour l'angle (sauvegarde une fonction trig, mais veillez à la division par zéro cas).

+0

La pente fonctionne en 2 dimensions. En plus de dimensions, il voudrait faire un produit scalaire de vecteurs unitaires extraits des lignes. Je retiens une réponse jusqu'à ce que j'obtienne une question qui a une réponse. ;-) – Nosredna

+0

Vrai ... il pourrait parler de modifier la distance après tout. – geofftnz

3

Les mesures évidentes incluent la pente, la longueur et la distance entre les points milieu. Vous pouvez les calculer et ensuite trouver les pondérations que vous aimez.

Si vous souhaitez les regrouper en une seule chose, essayez la somme des distances entre les extrémités.

Vous allez devoir essayer quelques trucs et voir quels cas vous irritent, puis comprendre pourquoi.

0

lignes (et en général hyperplans) assis sur un appel d'objet Grassmanian; par exemple. les droites dans le plan se trouvent dans Gr (1,3), qui est isomorphe à l'espace projectif bidimensionnel, et le vôtre est le plus simple non trivial: Gr (2,4). C'est un espace métrique compact, qui est livré avec une métrique standard (découlant de l'intégration de plucker - voir le lien ci-dessus). Cependant, cette métrique est un peu coûteuse à calculer, donc vous pouvez envisager une approximation (tout comme vous envisageriez d'utiliser le produit scalaire au lieu de l'angle en 2 dimensions - cela fonctionne pour les petits angles). explication (basée sur la métrique définie dans l'article wikipedia lié):

Pour chaque ligne, prenez deux points (x1, y1, z1) et (x2, y2, z2). Soit A la matrice 4 par 2 dont les colonnes sont (1, x1, y1, z1)^t et (1, x2, y2, z2)^t. Définir P comme étant la matrice 4 par 4 A (A^tA)^(- 1) A^t. Alors P dépend uniquement de l et non du choix des deux points.

La métrique que vous voulez est la valeur absolue de la valeur propre supérieure de la différence entre les matrices correspondant aux deux lignes.

+0

Merci pour le lien, mais tout est grecque pour moi. Tout pseudo code que je peux utiliser? – Graviton

Questions connexes