2010-02-02 21 views
1

En partant d'un point de départ, d'un en-tête, d'une distance et d'un segment de ligne, trouvez le premier point le long de cet en-tête à la distance spécifiée de ce segment de ligne.Comment puis-je trouver le premier point le long d'un en-tête à une distance spécifiée d'un segment de ligne?

J'ai couvert deux cas, mais je n'ai pas été en mesure de couvrir le dernier.

Premier cas: départ de la ligne. Ignorez-le même si le point de départ est dans la distance spécifiée.

Deuxième cas: Il coupe la ligne. Je l'ai résolu en utilisant trig et triangles. Initialement n'a pas considéré le cas suivant.

Troisième cas: Il se dirige vers la ligne, mais il ne l'intersecte pas. Je pense que cela résoudra le deuxième cas si c'est fait correctement.

Trois sous-cas:

  1. La distance minimale de ligne est supérieure à la distance spécifiée. Ignorez-le.

  2. La distance de ligne minimale est égale à la distance spécifiée. Trouvé les points déjà.

  3. La distance de ligne minimale est inférieure à la distance spécifiée. Cela signifie qu'il y a une ligne perpendiculaire entre le long de la ligne et une extrémité du segment de ligne qui est inférieure à la distance nécessaire. Cela signifie également que de chaque côté de cette ligne perpendiculaire sera deux lignes de la distance nécessaire. L'un est perpendiculaire au cap, tandis que l'autre est le plus proche du même point final et non perpendiculaire au cap. Juste une question de trouver ces points et de voir lequel est le plus proche du point de départ.

C'est où je suis coincé aujourd'hui. Le faire était facile, mais faire le vecteur calc ou tout ce qui était difficile.

Il est possible de reformuler ce que:

A quelle heure (s) est P(t) = P0 + t*v à une distance D du segment de ligne L((x1,y1), (x2,y2))?

v=(sin(heading), -cos(heading)) dans mon cas.

Répondre

0

Merci, cela fonctionne. J'ai trouvé l'alpha de cette façon:

heading = 45.0*pi/180. #heading 45 degrees. 
if x1 > x2: #line segment (x1,y1)<->(x2,y2) 
    dx = x2 - x1 
    dy = y2 - y1 
else: 
    dx = x1 - x2 
    dy = y1 - y2 

segmentHeading = atan2(dx, dy) 

if heading > 0: 
    alpha = segmentHeading + heading 
else: 
    alpha = -segmentHeading + heading 

t = abs((dStart - D)/-cos(alpha)) #-cos in python, sin in C. 
0

Pousse Mang votre solution ne fonctionne pas toujours. J'ai trouvé un contre-exemple:

ligne segment = (0,0) -> (0.14)

Point de départ = (19, 6) @ tête ou -159,5 200,5 dans l'ouest/anti-horaire

Il croisera la ligne à (2.952, 0.0) donc je demande, d'où vient-il à une distance de 0.0.

Le résultat obtenu est incorrect.

http://img5.imageshack.us/i/failuref.png/

Comment puis-je dire à ceux qui vont travailler en utilisant votre solution et ceux qui ne fonctionnent pas dépend si la distance de départ minimale entre le point et le segment de ligne crée une ligne perpendiculaire.

Si je peux poster une autre photo dans le prochain post, je vais mettre l'exemple avec succès.

J'aurais aimé poster du code pour Sage qui produisait ces images, mais malheureusement les tags de code acceptent python.

0

Salut la solution que je suis finalement venu avec. Est-ce que le rayon intersecte des segments de ligne parallèles et la distance D spécifiée à l'écart du segment de ligne? Il suffit de dessiner un rectangle et de vérifier les côtés parallèles au segment de droite.

  • -ce que le rayon se coupent cercles de rayon D à chaque point d'extrémité du segment de ligne.

  • Réduire au minimum pour l'unité de temps totale pour trouver le premier point le long du rayon qui est D loin du segment de ligne. Cas limite possible: Le point de départ dans D est-il éloigné de la ligne? Jusqu'à l'utilisateur comment gérer ce cas.