2010-11-22 2 views
6

Я работаю над сенсорной игрой, и у меня возникают проблемы с созданием пути, к которому коснулся пользователь. Я пытаюсь имитировать что-то вроде этих приложений http://www.youtube.com/watch?v=G3CECr6mT1Q или http://www.youtube.com/watch?v=r34-_0wrVC4Рисуем дорожку между двумя точками

Я делаю это в XNA/C#.

Моя проблема: У меня есть набор путевых точек, которые определяют, что пользователи касаются пути. Я не был уверен, как я могу получить стилизованную линию между всеми этими пунктами, поэтому я подумал: «Эй, у меня будет просто очень маленькое изображение, это« линия », и нарисуйте его в каждом месте между путевыми точками и поверните его соответственно Я не уверен, если это лучшее решение или нет.

Но я застрял, потому что не знал, как получить все координаты между этими двумя точками. У меня есть две точки, я могу получить вектор от первой до второй, и т.д., но я не могу показаться, чтобы получить математику правильно.

Любые предложения или помощь? Спасибо!

ответ

5

Чтобы вычислить промежуточную точку между двумя точками, найдите вектор направления от одной точки к другой и расстояние между точками. Масштабируйте расстояние на множитель t между 0 и 1, где t = 0 соответствует первой точке t = 0,5, на полпути между ними, а t = 1 соответствует второй точке. Затем масштабируйте вектор направления по этому значению и добавьте его в исходную точку.

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

Если вы вычисляете несколько точек между p0 и p1, вы должны только рассчитать расстояние и направление один раз.

Вы также можете изучить XNA RoundLine, чтобы соединить свои очки.

Другое предложение set up a textured rotated quad.

+0

+1 для RoundLine. – 2010-11-22 22:55:08

+0

Empyrean - СПАСИБО! Это работало как шарм! Очень признателен! Знаете ли вы, что ваш код более или менее аналогичен тому, как XNA будет рисовать примитивы, или я возьму перфекционный хит? Кроме того, я опубликую свой фрагмент кода, если кто-то займется этим вопросом в будущем. Кроме того, roundLine выглядит действительно круто, я проверю его. – Steve 2010-11-22 23:13:38

0

Заканчивать образец в http://create.msdn.com/en-US/education/catalog/sample/primitives подробную информацию о том, как сделать простой «Примитивы», включая строку.

+0

спасибо, но я на самом деле уже посмотрел на это раньше. От взгляда на это, я не был уверен, как я смогу настроить их линию, чтобы быть чем-то более привлекательным - единственная настройка, которую я нашел, - это опция цвета. Я также думаю, что у них XNA делает много расчетов для рисования, поэтому я не вижу их математики, как они это сделали. – Steve 2010-11-22 19:16:32

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 

} 

Образцы образцов выше. PointA и pointB - это две конечные точки, newPoint будет каждой точкой между ними.

Смежные вопросы