2012-05-30 1 views
2

Я уверен, что это можно решить с помощью некоторых основных уравнений тригонометрии, но, к сожалению, я не могу это понять.Рассчитать следующую точку на линейном векторе 2d

Что мне нужно:

how to find next point on linear vector path 2d

Учитывая х, у координаты двух точек в 2d мне нужно найти следующий точку вектора из одной точки к другой. В основном находим ближайший линейный путь.

Например: на изображении выше даны две точки, мы хотим перейти от синей точки к красной точке, движущейся по пути, поэтому нам нужно найти следующую (серая точка) каждый шаг, пока мы не достигнем ее.

Любая помощь очень ценится!

+0

Звучит так, как будто вам нужно свернуть http://en.wikipedia.org/wiki/Slope – AJak

+0

Вам просто нужно найти точки между двумя заданными точками? Тогда алгоритм Брешенема - это то, что вы хотите. Хотя, если вы планируете отображать его на Java, вам лучше придерживаться внутренней реализации Java (это будет аппаратное ускорение). Если вам нужно покрасить точки в соответствии с некоторым алгоритмом (anti-alias?), Тогда это может быть более сложным, но снова лучше использовать внутренние функции Java. Так что посоветуйте, нужно ли это сделать или разработать алгоритм – BlacKow

+0

Мне нужно, чтобы он перемещал изображение вдоль линии, поэтому мне нужен алгоритм. Я уже смотрю решение Брешенема. Благодаря! – YemSalat

ответ

0

Спасибо всем за ваши советы! Я, наконец, понял это. Вот базовая реализация Java-метода, который находит следующую точку линейного вектора (в предположении, что мы переходим 1 балл за шагом)

public int[] getNextLinePoint(int x,int y,int x2, int y2) { 
    int w = x2 - x; 
    int h = y2 - y; 
    int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0; 
    if (w<0) dx1 = -1; else if (w>0) dx1 = 1; 
    if (h<0) dy1 = -1; else if (h>0) dy1 = 1; 
    if (w<0) dx2 = -1; else if (w>0) dx2 = 1; 
    int longest = Math.abs(w); 
    int shortest = Math.abs(h); 
    if (!(longest>shortest)) { 
     longest = Math.abs(h); 
     shortest = Math.abs(w); 
     if (h<0) dy2 = -1; else if (h>0) dy2 = 1; 
     dx2 = 0;    
    } 
    int numerator = longest >> 1; 
    numerator += shortest; 
    if (!(numerator<longest)) { 
     numerator -= longest; 
     x += dx1; 
     y += dy1; 
    } else { 
     x += dx2; 
     y += dy2; 
    } 
    int[] res = {x, y}; 
    return res; 
} 

Этот код возвращает следующие х, у координаты в виде 2-элементный массив int []. Еще раз спасибо!

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