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? :(
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?) –
@Cosmin: aimez ce commentaire. Doit anticiper les réponses rectilignes sur un site programmeur2 :) – sehe
s'il vous plaît pouvez-vous formater la question afin qu'elle soit facilement lisible. –