2010-11-22 24 views
6

Ich arbeite an einem Touch-basierten Spiel, und ich habe Probleme beim Zeichnen eines Pfades, den der Benutzer berührt hat. Ich versuche, etwas wie diese Anwendungen zu imitieren http://www.youtube.com/watch?v=G3CECr6mT1Q oder http://www.youtube.com/watch?v=r34-_0wrVC4Einen Pfad zwischen zwei Punkten zeichnen

Ich mache das in XNA/C#.

Mein Problem ist: Ich habe die Menge der Wegpunkte, die Benutzer berühren Pfad definieren. Ich war mir nicht sicher, wie ich eine stilisierte Linie zwischen all diesen Punkten bekommen konnte, also dachte ich "hey, ich werde nur ein wirklich kleines Bild haben, das die Linie ist und es an jeder Stelle zwischen den Wegpunkten zeichnen und entsprechend rotieren Ich bin mir nicht sicher, ob dies die beste Lösung ist oder nicht.

Aber ich war stecken, weil ich nicht wusste, wie man alle Koordinaten zwischen diesen beiden Punkten bekommt. Ich habe die zwei Punkte, ich kann ein Vektor von der ersten Sekunde an, etc, aber ich kann nicht richtig, die Mathematik zu bekommen scheinen.

Vorschläge oder helfen? Dank!

Antwort

5

Um einen Zwischenpunkt zwischen zwei Punkten zu berechnen, finden Sie den Richtungsvektor von einem Punkt zum anderen und den Abstand zwischen den Punkten. Skaliere den Abstand um einen Faktor t zwischen 0 und 1, wobei t = 0 dem ersten Punkt entspricht, t = 0,5 die Hälfte zwischen ihnen ist und t = 1 dem zweiten Punkt entspricht. Dann skalieren Sie den Richtungsvektor um diesen Wert und fügen Sie ihn zum ursprünglichen Punkt hinzu.

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); 
    } 
} 

Wenn Sie mehrere Punkte zwischen p0 und p1 berechnen, sollten Sie Entfernung und Richtung nur einmal berechnen.

Sie könnten auch in XNA RoundLine suchen, um Ihre Punkte zu verbinden. Ein weiterer Vorschlag ist set up a textured rotated quad.

+0

+1 für RoundLine. –

+0

Empyrean - DANKE! Das hat wie ein Zauber funktioniert! Sehr geschätzt! Weißt du, ob dein Code mehr oder weniger genauso ist wie XNA Primitive zeichnen würde, oder würde ich einen Perf-Hit machen? Außerdem poste ich mein Code-Snippet, wenn sich jemand in Zukunft auf diesen Thread wagt. Außerdem sieht roundLine wirklich cool aus, ich werde es überprüfen. – Steve

+0

Berechnen der Länge eines Vektors ist eine teure Operation. Aber nicht zu teuer für das, was Sie hier tun. XNA macht dies nicht als Teil seiner Linienzeichnung primitiv. Ich empfehle jedoch nicht, das Linienzeichnungselement zu verwenden. Wie Sie in Ihrer Frage vorschlagen, ist es überhaupt nicht anpassbar. – Empyrean

0

Schauen Sie sich die Probe bei http://create.msdn.com/en-US/education/catalog/sample/primitives für Details, wie einfach zu zeichnen "Primitive" einschließlich einer Linie.

+0

danke, aber ich habe mir das schon mal angesehen. Davon abgesehen, war ich mir nicht sicher, wie ich ihre Linie anpassen könnte, um etwas attraktiver zu sein - die einzige Anpassung, die ich fand, war die Farboption. Ich denke auch, dass sie XNA viele Berechnungen für das Zeichnen machen lassen, daher kann ich ihre Berechnungen nicht sehen, wie sie es gemacht haben. – 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 

} 

Codebeispiele oben. PointA und PointB sind die zwei Endpunkte, NewPoint wird jeden Punkt zwischen ihnen sein

+0

Ich schlage vor, dass z vom Typ float ist, um int zu vermeiden, um die Konvertierung einmal pro Schleife zu floaten, wenn Sie durch die Entfernung dividieren. Versuchen Sie zu vermeiden, dass bei mathematischen Operationen Typen gemischt werden, um eine optimale Leistung zu erzielen. – Empyrean

+0

danke für das Feedback, ich werde es im Hinterkopf behalten. Nur um die Lernübung am Laufen zu halten, wenn ich eine Bezier-Kurve oder einen Catmull-Rom-Spline auf das Obige anwenden wollte - wäre es dann einfach, das Obige dafür zu optimieren? :) – Steve

Verwandte Themen