2011-03-25 6 views
0

J'ai une ligne identifiée par x1, y1, x2, y2 qui sont des valeurs doubles. Ensuite, j'ai plusieurs objets graphiques (nommons la classe TShape) qui coïncide sont gauche, haut, droite, bas: double. Seules les propriétés Top et Left sont modifiables en tant que valeur . Lorsque vous faites glisser le TShape autour des valeurs supérieure et gauche sont mises à jour. J'utilise une fonction à découvrir lorsque TShape est proche d'une ligne. La fonction définition est:Les points de force doivent être sur une ligne

function NearLine(const Target: TPoint; X1, Y1, X2, Y2: double; Off: integer = 5): boolean; 

NearLine retourne true si le point spécifié par la cible est près de la ligne spécifiée par Point1 et Point2. Le point doit être à la distance spécifiée par Off. J'utilise la fonction Off = 0;

Dans mon implémentation Target est le centre de la TShape que je garde à jour en le calculant à partir des propriétés Top et Left. Parce que la cible est TPoint que je fais:

1-

CPoint.X := Trunc(Center.X); 
CPoint.Y := Trunc(Center.Y); 

2- et lorsque la NearLine de fonction ci-dessus est vrai que je force la souris pour libérer avec:

3-

Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 

1,2 an 3 sont appelés dans un événement UpdateMove qui est appelé pendant que fait glisser la forme.

Cela me permet de "coller" la TShape presque près de la ligne, mais ce n'est pas exactement ce que je veux faire ... évidemment, il y a une erreur due à la fonction Trunc.
L'erreur est:

deltaX := Frac(Center.X); 
deltaY := Frac(Center.Y); 

Après avoir relâché la souris par programme comment je peux forcer tout le centre donc toutes les formes être parfaitement alignées (colinéaires) avec la ligne ?

Une aide? :(

+0

Si vos points ne sont pas déjà colinéaires (et vous besoin de 3 points pour cela parce que deux p les points d'articulation sont toujours colinéaires) vous pouvez les forcer à être colinéaires en enveloppant l'espace et en les faisant passer à travers la 4ème dimension (temps?) –

+0

@Cosmin: aimez ce commentaire. Doit anticiper les réponses rectilignes sur un site programmeur2 :) – sehe

+0

s'il vous plaît pouvez-vous formater la question afin qu'elle soit facilement lisible. –

Répondre

4

Vous vous posez la mauvaise question, c'est pourquoi vous ne pouvez pas voir la réponse vous-même Si 3 points ne sont pas colinéaires, vous n'allez pas les "forcer" colinéaires à moins que vous ne changiez les lois de mathématique et/ou physique

Ce que vous voulez probablement est de trouver un point sur la ligne définie par deux points qui est le plus proche de votre point de référence.C'est une géométrie assez simple: le point le plus proche est comme au "pied" de une perpendiculaire tirée de votre troisième point à la ligne définie par les deux premiers! Vous pouvez résoudre cela en utilisant la théorie de Pythagoran seul, vous n'avez même pas besoin de la géométrie analytique de fantaisie

+0

un échantillon de code?:( – marcostT

+0

avons-nous besoin d'un site mathoverflow? - oups je vais demander sur meta à la place – sehe

+0

@sehe: http://math.stackexchange.com existe déjà ... – Martijn

Questions connexes