2010-11-22 13 views
6

Je travaille sur un jeu tactile, et j'ai des problèmes pour dessiner un chemin que l'utilisateur a touché. J'essaie d'imiter quelque chose comme ces applications http://www.youtube.com/watch?v=G3CECr6mT1Q ou http://www.youtube.com/watch?v=r34-_0wrVC4Tracer un chemin entre deux points

Je le fais en XNA/C#.

Mon numéro est: J'ai l'ensemble des points de cheminement qui définissent le chemin d'accès des utilisateurs. Je ne savais pas comment je pourrais obtenir une ligne stylisée entre tous ces points, alors j'ai pensé "hé, je vais juste avoir une très petite image qui est 'la ligne', et la dessiner à chaque endroit entre les waypoints, et la tourner en conséquence Je ne suis pas sûr si c'est la meilleure solution ou pas

Mais j'étais coincé parce que je ne savais pas comment obtenir toutes les coordonnées entre ces deux points. vecteur de la première à la deuxième, etc, mais je ne peux pas l'air d'obtenir le calcul correct.

Toute suggestion ou de l'aide? Merci!

Répondre

5

Pour calculer un point intermédiaire entre deux points, trouvez le vecteur de direction d'un point à l'autre et la distance entre les points. Mettre à l'échelle la distance d'un facteur t entre 0 et 1 où t = 0 correspond au premier point t = 0,5 est à mi-chemin entre eux et t = 1 correspond au deuxième point. Redimensionnez ensuite le vecteur de direction par cette valeur et ajoutez-le au point d'origine.

Vector2 IntermediatePoint(Vector2 p0, Vector2 p1, float t) 
{ 
    Vector2 delta = p1 - p0; 

    float distance = delta.Length(); 

    if (distance == 0.0f) 
    { 
     return p0; 
    } 
    else 
    { 
     Vector2 direction = delta/distance; 

     return p0 + direction * (distance * t); 
    } 
} 

Si vous calculez plusieurs points entre p0 et p1, vous ne devez calculer la distance et la direction qu'une seule fois.

Vous pouvez également utiliser XNA RoundLine pour connecter vos points. Une autre suggestion est de set up a textured rotated quad.

+0

+1 pour RoundLine. –

+0

Empyrean - MERCI! Cela a fonctionné comme un charme! Très appréciée! Savez-vous si votre code est plus ou moins la même manière que XNA dessinerait des primitives, ou est-ce que je prendrais un coup de perf? En outre, je posterai mon extrait de code au cas où quelqu'un s'aventurerait sur ce fil dans le futur. De plus, roundLine a l'air vraiment cool, je vais vérifier. – Steve

+0

Le calcul de la longueur d'un vecteur est une opération coûteuse. Mais pas trop cher pour ce que vous faites ici. XNA ne fait pas cela dans le cadre de sa primitive de dessin au trait. Cependant, je ne recommande pas d'utiliser la primitive de dessin au trait. Comme vous le suggérez dans votre question, il n'est pas personnalisable du tout. – Empyrean

0

Découvrez l'échantillon à http://create.msdn.com/en-US/education/catalog/sample/primitives pour plus de détails sur la façon de dessiner simples "Primitives" incluant une ligne.

+0

merci, mais j'ai déjà jeté un coup d'oeil à cela avant. En regardant ça, je ne savais pas comment je pourrais personnaliser leur ligne pour qu'elle soit quelque peu plus attrayante - la seule personnalisation que j'ai trouvée était l'option de couleur. Je pense aussi qu'ils ont XNA faire beaucoup de calculs pour le dessin, donc je ne peux pas voir leurs calculs pour la façon dont ils l'ont fait. – Steve

1
pointA = waypointsToDraw.ElementAt(i); 
pointB = waypointsToDraw.ElementAt(i + 1); 
deltaVector = pointB - pointA; 
distance = deltaVector.Length(); 
direction = deltaVector/distance; 
for (int z = 1; z < distance; z++) 
{ 
    newPoint = pointA + direction * (distance * (z/distance)); 
    //this is the newPoint - it will be every point/pixel between pointA and pointB. Put drawing code here 

} 

Échantillons de code ci-dessus. PointA et pointB sont les deux extrémités, newPoint sera chaque point entre eux

+0

Je suggère de faire z être de type float pour éviter que la conversion float ne soit effectuée une fois par boucle lorsque vous divisez par la distance. Essayez d'éviter de mélanger les types dans les opérations mathématiques pour des performances optimales. – Empyrean

+0

merci pour les commentaires, je le garderai à l'esprit. Juste pour continuer l'exercice d'apprentissage, si je voulais appliquer une courbe de bezier ou une spline catmull-rom à ce qui précède - serait-il facile de modifier ce qui précède pour cela? :) – Steve

Questions connexes