Перенести координаты в новую систему

Я хотел бы преобразовать координаты точки в новую сгенерированную систему координат, исходная система начинается в верхнем левом углу изображения (0,0)

Информация, которая у меня есть в новой системе: 1- у меня есть значение нового оригинала (x0,y0) где-то на изображении 2- также у меня есть 2 точки на обеих новых осях (всего 4 точки 2 в каждую строку), используя это, я могу рассчитать линейное уравнение для двух линий осей (y=a1x+b1), (y=a2x+b2) 3- У меня есть вектор для каждой линии (Vx, Vy)

Примечание: иногда новые оси вращаются (линии не точно горизонтальны или вертикальны)

Как я могу преобразовать координаты точек в эту новую систему

любая помощь будет так оценена

вот изображение

http://i.imgur.com/ByDR7Vq.png


person seereen    schedule 11.04.2013    source источник
comment
Я хотел бы загрузить изображение, чтобы описать, что я имею в виду, но я не могу, потому что у меня недостаточно баллов на этом веб-сайте, которые позволяют мне загружать !!! ... вы знаете, как я могу загрузить его?   -  person seereen    schedule 11.04.2013
comment
Перейдите на imgur.com, загрузите свое изображение и отредактируйте сообщение со ссылкой. Я вставлю картинку в более позднем редактировании.   -  person John Alexiou    schedule 11.04.2013


Ответы (1)


Сначала выразите свои линии как a1*(x-x0)+b1*(y-y0)=0 и a2*(x-x0)+b2*(y-y0)=0, и их пересечение x0,y0 уже учтено в уравнениях.

обновлены вывески

Преобразование от x,y к z,w это

z = -sqrt(a1^2+b1^2)*(a2*(x-x0)+b2*(y-y0))/(a2*b1-a1*b2)
w =  sqrt(a2^2+b2^2)*(a1*(x-x0)+b1*(y-y0))/(a1*b2-a2*b1)

и обратное

x = x0 - b1*z/sqrt(a1^2+b1^2) + b2*w/sqrt(a2^2+b2^2)
y = y0 + a1*z/sqrt(a1^2+b1^2) - a2*w/sqrt(a2^2+b2^2)

Было бы полезно масштабировать коэффициенты так, чтобы sqrt(a1^2+b1^2)=1 и sqrt(a2^2+b2^2)=1.

Обратите внимание, что это работает и для неортогональных линий. Пока они не параллельны и a2*b1-a1*b2!=0 это сработает.

Пример

Линии z (-2)*(x-3) + (1)*(y-1) = 0 и линии w (-1)*(x-3) + (-4)*(y-1) = 0 пересекаются в (3,1). Таким образом, коэффициенты равны a1=-2, b1=1, a2=-1, b2=-4.

Координаты (x,y)=(2,1) преобразуются в

z = -sqrt((-2)^2+1^2) ((-1) (x-3)+(-4) (y-1))/((-1) 1-(-2) (-4)) = 0.2484
w = sqrt((-1)^2+(-4)^2) ((-2) (x-3)+1 (y-1))/((-2) (-4)-(-1) 1) = 0.9162

С обратным

x = -1 z/sqrt((-2)^2+1^2)+(-4) w/sqrt((-1)^2+(-4)^2)+3 = 2
y = (-2) z/sqrt((-2)^2+1^2)-(-1) w/sqrt((-1)^2+(-4)^2)+1 = 1

Разработка

Для линии a1*(x-x0)+b1*(y-y0)=0 вектор направления вдоль линии равен e1 = [e1x,e1y]= [-b1/sqrt(a1^2+b1^2),a1/sqrt(a1^2+b1^2)]. Аналогично для другой строки.

Экранные координаты локальной точки [z,w] находятся, начиная с исходной точки x0, y0 и перемещаясь на z по первой линии, а затем на w по второй линии. Так

x = x0 + e1x*z + e2x*w = x0 -b1/sqrt(a1^2+b1^2)*z - b2/sqrt(a2^2+b2^2)*w
y = y0 + e1y*z + e2y*w = y0 +a1/sqrt(a1^2+b1^2)*z + a2/sqrt(a2^2+b2^2)*w

Теперь мне нужно изменить направление второй строки, чтобы она работала в соответствии с исходной визуализацией публикации, изменив знак w.

Чтобы найти z, w из x, y, инвертируйте два приведенных выше уравнения.

person John Alexiou    schedule 11.04.2013
comment
Я вижу (x0,y0) новое начало координат, как насчет (x,y), вы имеете в виду координаты зеленой точки? - person seereen; 11.04.2013
comment
Я немного смущаю местора, вы хотите выразить строку как a1*(x-x0)+b1*(y-y0)=0 и a2*(x-x0)+b2*(y-y0)=0 ( что вы подразумеваете под этим, как я могу вычесть начало координат из неизвестного в уравнении), Кроме того, вы присоединяете b к y, как насчет третьего члена c например, ax+by+c=0 - person seereen; 11.04.2013
comment
Уравнение a1*(x-x0)+b1*(y-y0)=0 представляет собой линию, если известны a1, b1, x0, y0. Если ваши линии определяются двумя точками с координатами (p1x,p1y) и (q1x,q1y), то a1=(p1y-q1y)/d и b1=(q1x-p1x)/d с d=sqrt((p1x-q1x)^2+(p1y-q1y)^2). - person John Alexiou; 12.04.2013
comment
a*x+b*x+c=0 проходит через (x0,y0), когда c=-a*x0-b*y0 такое, что a*x+b*x+(-a*x0-b*y0)=0 или a*(x-x0)+b*(y-y0)=0. - person John Alexiou; 12.04.2013
comment
Я ценю ваш ответ: D Я приложу некоторые усилия, чтобы понять это. - person seereen; 13.04.2013
comment
Эта формула дает мне выходную отрицательную точку вывода, я хотел бы получить положительные очки, как я могу изменить знак? - person seereen; 13.04.2013
comment
Попробуйте инвертировать знак z в вычислениях выше. - person John Alexiou; 14.04.2013
comment
Привет, мастер, я получил этот вывод, когда применил точки решения вашего предложения в линии Z (325,25), (373,422), точки в линии W (154,280), (552,232), источник (353,256) текущая точка = (299,228), перевод на = (34,-50) есть проблема со знаком рисую новое фото чтобы подробнее объяснить что это за знак что я смотрю i.imgur.com/we48K1r.png - person seereen; 15.04.2013
comment
сэр, можете ли вы объяснить, как вы получили эту формулу для расчета x, w? - person seereen; 15.04.2013
comment
Чувак, просто переверни знак w везде, где ты его используешь. Это произведение, которое является направлением линий. - person John Alexiou; 18.04.2013
comment
Я ценю вашего пациента :*) - person seereen; 18.04.2013