2016-04-21 3 views
1

J'essaie de déterminer le point auquel mon robot croisera un mur étant donné son emplacement dans une carte et un angle pointant en radians. Donc pour résumer le problème, étant donné une grille carrée de n'importe quelle taille [1-infini], un objet dans cette grille, et l'angle auquel cet objet est confronté (radians), trouvez le point d'intersection avec la bordure de la grille . Par exemple vous avez une grille de 10 x 10, votre objet est en position (5,5), et il fait face à un angle de pi/8 radians (direction nord-est). Si cet objet devait se déplacer en ligne droite, où se croisait-il avec le mur? Y a-t-il une solution généralisée qui fonctionnerait pour n'importe quelle position et n'importe quel angle? Jusqu'à présent ce que je fais est de calculer un point en dehors de la grille sur la même trajectoire et en regardant tous les points jusqu'à ce que je trouve un mur, mais je pense qu'il y a probablement une solution plus élégante. Merci pour l'aide!Point d'intersection de la grille carrée de la robotique

+0

Votre grille est-elle composée de 100 cellules et vous avez besoin d'intersections avec chaque ligne de la grille? Ou juste rectangle simple, et vous avez besoin d'intersection avec son périmètre? – MBo

Répondre

0

Vous pouvez simplement trouver le point d'intersection de deux segments de ligne.

Premier segment: Le segment à partir de la position du robot à l'angle de pointage. Faites en sorte que ce segment soit plus grand que la diagonale de votre grille afin de vous assurer qu'elle recoupe la limite si elle devait l'être. Deuxième segment: Le segment de ligne qui constitue le mur en question.

Voir http://www.faqs.org/faqs/graphics/algorithms-faq/ Section 1.03 pour l'algorithme d'intersection de deux segments de ligne.

La FAQ comp.graphics.algorithms est une ressource utile pour les problèmes de géométrie courants en robotique.

0

pseudocode pour rayons avec des points de départ dans le rectangle:
Point de départ (X0, Y0)
angle Ray Theta, c = Cos(Theta), s = Sin(Theta);
coordonnées Rectangle: bottom left (X1,Y1), top right (X2,Y2)

if c >= 0 then //up 
    XX = X2 
else 
    XX = X1 

if s >= 0 then //right 
    YY = Y2 
else 
    YY = Y1 

if c = 0 then //vertical ray 
    return Intersection = (X0, YY) 

if s = 0 then //horizontal ray 
    return Intersection = (XX, Y0) 

tx = (XX - X0)/c //parameter when vertical edge is met 
ty = (YY - Y0)/s //parameter when horizontal edge is met 

if tx <= ty then //vertical first 
    return Intersection = (XX, Y0 + tx * s) 
else   //horizontal first 
    return Intersection = (X0 + ty * c, YY)