2017-10-02 3 views
-1

Désolé pour le titre, c'est vraiment pas bon. J'ai donc créé un chemin de points pour mon jeu. Ce chemin est "généré aléatoirement" donc je ne sais jamais à quoi ça va ressembler, tout ce que je sais c'est que ça ne se croisera jamais. Ce que j'essaye de faire est de prendre n'importe quel point le long de ce chemin et de calculer 2 points exactement à 10 unités de la ligne dans la direction des vecteurs normaux de chaque côté. Un exemple serait que j'ai les points des marqueurs de voie au centre d'une route à deux voies. Je veux calculer l'emplacement des deux bordures pour un point donné sur les marqueurs de voie. J'ai essayé de calculer simplement la pente normale, je pense que j'obtiens le résultat correct pour cela, mais je ne sais pas comment je peux dire "un point 10 unités sur cette ligne".Comment est-ce que je peux calculer deux points le long de la normale d'un chemin donné seulement deux points de ce chemin?

Si vous avez besoin d'informations supplémentaires je peux le fournir avec plaisir.

Quelqu'un a demandé le code:

//These are set elsewhere 
float x1; 
float y1; 
float x2; 
float y2; 
float Distance = 10; 

En fait, ce que je veux faire, mais dans le code:

((x1+x2)/2, (y1+y2)/2) +- Distance * (-(y2-y1), (x2-x1))/sqrt((x2-x1)^2+(y2-y1)^2) 
+0

Il semble que votre question concerne davantage les mathématiques que la programmation. –

+0

Dans une certaine mesure. Cependant si je demande sur mathoverflow j'obtiendrai des formules et des équations que quand essayant de convertir en code n'a aucun sens. Je peux le faire sur papier, je ne peux pas le traduire en code. La publication ici m'aidera à obtenir une réponse plus spécifique au code. –

+0

Eh bien, nous aurons besoin de code pour pouvoir vous donner une réponse dans le code. En ce moment nous n'avons rien. (Certains livres de mathématiques pourraient vous aider si vous faites ce genre de travail.Je pense que * Graphic Gems I * a divers algorithmes pour le paramétrage des segments de ligne.) – markspace

Répondre

0

Je ne peux pas prendre le crédit pour cela parce que je l'ai trouvé quelque part sinon, mais c'est la mise en œuvre de l'équation que je tentais de résoudre. Je vais poster au cas où d'autres trébucheraient à travers cela à l'avenir.

Veuillez noter: ceci est horriblement optimisé et les noms de variables sont un peu inexacts (particulièrement gauche/droite), mais c'était une preuve de concept que je vais mettre en œuvre dans un projet plus important.

  //Calculate left 
      float left_x1 = current.x; 
      float left_y1 = current.y; 
      float left_x2 = previous.x; 
      float left_y2 = previous.y; 
      float D = 30; 

      float left_dx = left_x1-left_x2; 
      float left_dy = left_y1-left_y2; 
      float left_dist = (float) Math.sqrt(left_dx*left_dx + left_dy*left_dy); 
      left_dx /= left_dist; 
      left_dy /= left_dist; 
      float left_x3 = left_x1 + D * left_dy; 
      float left_y3 = left_y1 - D * left_dx; 
      float left_x4 = left_x1 - D * left_dy; 
      float left_y4 = left_y1 + D * left_dx; 

      //Calculate right 
      float right_x1 = previous.x; 
      float right_y1 = previous.y; 
      float right_x2 = old.x; 
      float right_y2 = old.y; 

      float right_dx = right_x1-right_x2; 
      float right_dy = right_y1-right_y2; 
      float dist = (float) Math.sqrt(right_dx*right_dx + right_dy*right_dy); 
      right_dx /= dist; 
      right_dy /= dist; 
      float right_x3 = right_x1 + D * right_dy; 
      float right_y3 = right_y1 - D * right_dx; 
      float right_x4 = right_x1 - D * right_dy; 
      float right_y4 = right_y1 + D * right_dx; 

      //Draw bounds 
      shapeRenderer.line(right_x3, right_y3, left_x3, left_y3); 
      shapeRenderer.line(right_x4, right_y4, left_x4, left_y4);