Как определить точки на линии по порядку от P1 до P2? - PullRequest
0 голосов
/ 07 февраля 2010

Привет, ребята.Я пытаюсь сделать простую игру для Android, в которой игрок перетаскивает космический корабль одним большим пальцем и стреляет по вражеским кораблям, постукивая пустым пространством другим большим пальцем.Дело в том, что для анимации пуль, проходящих через пространство, мне нужен список точек между космическим кораблем пользователя и концом экрана, линией, проходящей через место, куда пользователь нажал.

Я знаю, что должен параметризовать строку и кое-что прочитал о предмете, но я не совсем понимаю, особенно о том, как преобразовать его в код.На мой взгляд, мне нужно преобразовать отрезок между кораблем пользователя (P1) и местом, куда пользователь нажимает (P2), наименьший возможный отрезок, скорость изменения между x и y, уклон, я полагаю.Получив это, я могу просто умножить скорость изменения на расстояние от P1, чтобы получить желаемую точку.

Но это не совсем работает.Любая помощь будет оценена.Спасибо.

РЕДАКТИРОВАТЬ: Это то, что я делал.Это все, чтобы вычислить скорость изменения, которую я использую в методе обновления Beam, чтобы обновить его позицию, умножив его на скорость ...

Beam(Renderer r, float OX, float OY, float TX, float TY)
{
    super(r);

    p.x = (int) OX;
    p.y = (int) OY;

    paint = new Paint();
    paint.setColor(Color.BLUE);


    float X = TX - OX;
    float Y = TY - OY;

    boolean xPositive = X >= 0;
    boolean yPositive = Y >= 0;

    if(X < Y)
    {
        RateOfChangeX = Math.abs(X) / Math.abs(Y);
        RateOfChangeY = 1;
    }
    else
    {
        RateOfChangeX = 1;
        RateOfChangeY = Math.abs(Y) / Math.abs(X);
    }
    if(RateOfChangeX < 0 & xPositive)
    {
        RateOfChangeX = RateOfChangeX * -1;
    }
    if(RateOfChangeY < 0 & yPositive)
    {
        RateOfChangeY = RateOfChangeY * -1;
    }
}

Ответы [ 3 ]

2 голосов
/ 07 февраля 2010

Это пример того, как интерполировать, какие точки лежат между двумя точками. Код для рисования линии очень отличается и намного проще

Этот пример написан на C, но код может быть полезен. im - это изображение, step - это шаг изображения, sx и sy - это величина, которую вы перемещаете вверх / вниз или влево / вправо.

float x=sx, y=sy;
  for ( int i=1; i < int(totalLength); i++ ) { 
    int  top = stride*int(y)    + int(x),
         bot = stride*int(y+1)  + int(x);
    float xr = x-int(x),
          xl = 1-xr,
          yt = y-int(y),
          yb = 1-yt;
    newLine[i]= im[top]*xr*yt   +
                im[top-1]*xl*yt + 
                im[bot]*xr*yb   +
                im[bot-1]*xl*yb;
    x+=xgain;
    y+=ygain;
  }

Получение sx / sy (x1, y1) (x2, y2) - это точки, между которыми вы рисуете ... Код представляет собой python:

totalLength = math.sqrt(math.pow(x2-x1,2) + math.pow(y2-y1,2))

if x1 < x2:
  sx,sy,ex,ey=(x1,y1,x2,y2)
else:
  sx,sy,ex,ey=(x2,y2,x1,y1)

xgain = float(ex-sx)/totalLength
ygain = float(ey-sy)/totalLength

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

Этот алгоритм немного упрощается за счет рисования блока размером 1 на 1 пиксель в обратном направлении от этой точки с использованием интерполяции между четырьмя точками сетки, которых касается этот блок. Обратите внимание, что первый пиксель пропускается, поскольку это особый случай. Первый пиксель представляет проблему, так как он может находиться за пределами изображения, и вам необходимо проверить, что вы можете выполнить вычисления, прежде чем выполнять вычисления.

1 голос
/ 07 февраля 2010

В основном вы можете использовать Наклон-форма перехвата линейного уравнения. Чтобы сделать это без использования арифметики с плавающей запятой, вы можете использовать один из следующих алгоритмов:

0 голосов
/ 07 сентября 2010

Кривая Безье - лучший способ сделать это ..... ссылка для этого

http://en.wikipedia.org/wiki/B%C3%A9zier_curve

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...