Guest
Новичок
|
Здравствуйте! Люди добрые поможите кто может icon_ . Задача явно не тривиальная. Я пишу программу в Flash8 в которой мне необходимо трансформировать треугольник (заданы координаты 3 точек - Декартова прямоугольная система система). Для этого я должен внести в соотвествующий метод матрицу коэффициентов (a,b,c,d,tx,ty): Xн = a*Xc+c*Yc+tx; Yн = b*Xc+d*Yc+ty; где Xн, Yн - новые координаты одной из трех точек; Xc, Yc - старые координаты одной из 3 точек (должна быть тойже, что и для Xн и Yн) a,b,c,d,tx,ty - искомые коэффициенты трансформации. Поскольу, в моем распоряжении есть старые и новые координаты 3 точек, я могу составить систему уравнений: 3 уравнения для расчета коэффициентов a, c ,tx и 3 уравнения для расчета коэффциентов b, d, ty. Рассчитать эти коэффициенты не составит труда, используя метод Крамера или Гаусса. Ситуация в корне меняется если в координатах "старых" 3 точек появляется необходимость задавать одно и то же значение для X (при этом Y для всех трех точек разный). Матрица становиться сингулярной (вырожденной) и определение коэффициентов, безусловно, становиться невозможным. Выходом из данной ситуации я счел использование на первом этапе вычисления коэффициентов использование полярных координат, что безусловно дало свои плоды - коэффициенты были рассчитаны, при подстановке в полученные уравнения "старых" координат точек я с удовлетворительной точностью могу получить новые. Уравнения в полярных координатах имеет вид: Roн = a'*Xc+c'*Yc+tx'; cos(PHI) = b'*Xc+d'*Yc+ty'; где Roн - полярное расстояние; cos(PHI) - косинус угла наклона вектора к точке; a',b',c',d',tx',ty' - коэффициенты уравнения трансформации точек в полярных координатах Все вроде бы хорошо, но вот загвоздка то в том, что реализация функции в Flash8 скрыта от глаз пользователя и для трансформации треугольника (3 точек) необходимо задавать коэффициенты для уравнения в прямоугольной системе координат, т.е. использовать коэффициенты a,b,c,d,tx,ty, а не a',b',c',d', tx', ty' и вот тут я пришел в тупик - <b>Как выразить коэффициенты a,b,c,d,tx,ty зная уравнение с коэффициентами a',b',c',d', tx', ty'</b> Прошу помочь мне. Заранее благодарен.
|
Всего сообщений: Нет | Присоединился: Never | Отправлено: 14 июля 2008 19:26 | IP
|
|
Roman Osipov
Долгожитель
|
Если я Вас целиком правильно понял, то: Если пара уравнений Roн = a'*Xc+c'*Yc+tx'; cos(PHI) = b'*Xc+d'*Yc+ty'; задает полярные координаты точки (Xн, Yn), полученной из точки (Xc,Yc), и таких групп уравнений 3, причем, (Xc,Yc), a',b',c',d', tx', ty' известны, то можно воспользоваться группами уравнений Xн = a*Xc+c*Yc+tx; Yн = b*Xc+d*Yc+ty; для отыскания a, c, tx, Yн, b, d, ty, учитывая, что Xн = Roн*cos(PHI)=const Yн = Roн*sin(PHI)=const, где sin(PHI) вычисляется по cos(PHI).
|
Всего сообщений: 2356 | Присоединился: май 2007 | Отправлено: 14 июля 2008 19:47 | IP
|
|
ProstoVasya
Долгожитель
|
Правильно ли я понял Вашу проблему? Вам нужно построить отображение плоскости на плоскость так, чтобы три заданные точки отображались в три указанные. Вы используете Flash8, где есть команда, которая умеет это делать, если преобразование сводится к линейному преобразованию и сдвигу (она не работает в вырожденных случаях). Если я правильно понял, то кроме этих преобразований есть другие. Например стандартное конформное преобразование, для которого есть формулы.
|
Всего сообщений: 1268 | Присоединился: июнь 2008 | Отправлено: 14 июля 2008 21:08 | IP
|
|
Roman Osipov
Долгожитель
|
Может бьть Вам просто подстановка координат нужна? Опишите цели, которые должны быть реализованы (для чего Вам необходимо произвести трансформацию треугольника).
|
Всего сообщений: 2356 | Присоединился: май 2007 | Отправлено: 14 июля 2008 21:14 | IP
|
|
Guest
Новичок
|
Здавствуйте уважаемые Roman Osipov и ProstoVasya! Спасибо что откликнулись на мой зов о помощи. Объясню для чего мне это нужно. Мне необходимо трансформировать цветовую заливку треугольника во Флеш 8 таким образом, чтобы каждая вершина заливаемого цветом треугольника имела значения цвета соотвествующие заданным. По умолчанию, заливка имеет вид прямоугольного полотна по длине которого слева на право градиентно изменяются цвет от значения 0 до 255. Теперь представьте треугольник на этом полотне. Зная целевые (требуемые) цвета 3 вершин треугольника можно рассчитать координаты точек в градиентном прямоугольнике, которые и есть те Xc и Yc, описанные в предыдущем моем посте. Формулы такого расчета я вывел уже. Они успешно работают. Проблема, как правильно заметил ProstoVasia заключается в том, что если исходный треугольник имеет во всех 3 точках равные X (Y у них разный), то формулы вычисления корней Крамера и Гаусса терпят фиаско из за вырожденной матрицы. Обход этой аномалии, по моему мнению, в использовании полярных координат. Есть во Флеш свойство transform.matrix которому нужно присвоить матрицу коэффициентов трансформации каждой точки градиентного прямоугольника, те. |a c tx| transform.matrix = |b d ty| |0 0 1 | После чего Флеш самостоятельно трансформирмирует каждую точку градиантного прямоугольника по формулам: Xн = a*Xc+c*Yc+tx; Yн = b*Xc+d*Yc+ty; Формулы представлены в прямоугольной декартовой системе координат и с этим во Флеше ничего не поделаешь -необходимо задавать коэффициенты в таком виде, но при использовании прямоугольной, а не полярной системы появляется "слепое пятно" при равенстве X (Y разный) всех 3 точек. Как, например при ипользовании уравнения линии: при 90 градусах поворота линии, уравнение линии не существует. Я хотел бы обойти это пользуясь полярными координатами. Для этого я представил уравнение координат "новой" точки через старые как: Roн = a'*Xc+c'*Yc+tx'; cos(PHI) = b'*Xc+d'*Yc+ty'; Коэффициенты a',b',c',d',tx',ty' удалось получить при условии равенства X у всех старых точек (могу представить файл MathCad где производится сравнение двух методов такого расчета - через прямоугольные координаты и полярные). Но выразить потом коэффцииенты a,b,c,d,e,tx,ty через a',b',c',d',tx',ty' мне не удалось. О чем сейчас я прошу Вас. Помогите люди добрые заблудшему разуму. Кстати, ProstoVasya, Вы упомянули стандартное конформное преобразование. Что это ? Можно по подробнее.
|
Всего сообщений: Нет | Присоединился: Never | Отправлено: 15 июля 2008 14:05 | IP
|
|
Roman Osipov
Долгожитель
|
По поводу конформного отображения см., например, для ознакомления с его идеей статью из БСЭ внешняя ссылка удалена Вообще см. книги по теории функций комплексного переменного (Лаврентьев М. А., Шабат Б. В.; Маркушевич А. И. и др.)
|
Всего сообщений: 2356 | Присоединился: май 2007 | Отправлено: 15 июля 2008 14:28 | IP
|
|
Guest
Новичок
|
Почитал про конформное преобразование. Я не силен в математике, но у меня сложилось впечатление, что это всетаки не то... Кстати я пробовал выразить коэффициенты a,b,c,d,tx,ty, приведя уравнение полученное произведением Rон на cos(PHI) к виду (например для Xн): Xн = a*Xc+c*Yc+tx; т.е., вот так: Xн = Roн*cos(PHI) = (a'*Xc+c'*Yc+tx')*(b'*Xc+d'*Yc+ty') Теперь, если пытаться выделить Xc , Yс и выражения перед ними, представляющие собой искомые коэффициенты a,c,tx, то ничего не выходит - Xc и Yc явно выразить не удается (по крайней мере мне). Может быть конечно Вам удасться. Спасибо.
|
Всего сообщений: Нет | Присоединился: Never | Отправлено: 15 июля 2008 14:49 | IP
|
|
Roman Osipov
Долгожитель
|
Итак дана система Roн(1) = a'*Xc(1)+c'*Yc(1)+tx'; cos(PHI(1)) = b'*Xc(1)+d'*Yc(1)+ty'; Roн(2) = a'*Xc(2)+c'*Yc(2)+tx'; cos(PHI(2)) = b'*Xc(2)+d'*Yc(2)+ty'; Roн(3) = a'*Xc(3)+c'*Yc(3)+tx'; cos(PHI(3)) = b'*Xc(3)+d'*Yc(3)+ty'; в которой a',c',tx';b',d',ty' ДАНЫ Xc(1),Yc(1),Xc(2),Yc(2),Xc(3),Yc(3) ДАНЫ и являются числами. Нужно найти коэффициенты a,c,tx,b,d,ty. Все верно? Если нет поставьте ЧЕТКО математическую задачу (напишите четко, что известно, запишите систему, из которой нужно выразить величины и т. д.), потому как разбираться во всех тонкостях Вашей работы нет времени.
|
Всего сообщений: 2356 | Присоединился: май 2007 | Отправлено: 15 июля 2008 15:05 | IP
|
|
Guest
Новичок
|
Постараюсь четко написать. Дана система: Roн(1) = a'*Xc(1)+c'*Yc(1)+tx'; cos(PHI(1)) = b'*Xc(1)+d'*Yc(1)+ty'; Roн(2) = a'*Xc(2)+c'*Yc(2)+tx'; cos(PHI(2)) = b'*Xc(2)+d'*Yc(2)+ty'; Roн(3) = a'*Xc(3)+c'*Yc(3)+tx'; cos(PHI(3)) = b'*Xc(3)+d'*Yc(3)+ty'; Для которой a',c',tx';b',d',ty' вычислены, на основании известных Xc и Yc, Roн, cos(PHIн) (для 3 точек), Нужно привести (не вычислить!!!) приведенную выше систему уравнений к виду: Xн = a*Xc+c*Yc+tx; Yн = b*Xc+d*Yc+ty; где a,c,tx,b,d как-то выражаются через a',b',c',d',tx',ty' (я не мог выразить), пользуясь, по моему мнению, соотношениями: Xн=Rон*cos(PHIн); Xс=Rос*cos(PHIс); Rон = корень_квадратный (Xн^2+Yн^2 ); Rос = корень_квадратный (Xc^2+Yc^2 ); cos(PHIc) = Xc/Rос; cos(PHIн) = Xн/Rон;
|
Всего сообщений: Нет | Присоединился: Never | Отправлено: 15 июля 2008 15:24 | IP
|
|
Roman Osipov
Долгожитель
|
Итак, из того, что сказано Вами выше следует: Xн(i)=Roн(i) cos(PHI(i)) =const=a*Xc(i)+c*Yc(i)+tx Yн(i)=Roн(i) sin(PHI(i)) =const=b*Xc(i)+d*Yc(i)+ty Roн(i) cos(PHI(i)) =(a'*Xc(i)+c'*Yc(i)+tx')( b'*Xc(i)+d'*Yc(i)+ty') Roн(i) sin(PHI(i)) =(a'*Xc(i)+c'*Yc(i)+tx')sqrt(1-(cos(PHI(i)))^2)*(delta) delta — число, отвечает за четверть, в которой находится угол PHI(i)) i=1,2,3 Получается система 6 линейных уравнений с 6 неизвестными. Совместна ли она, не знаю. (Сообщение отредактировал Roman Osipov 15 июля 2008 15:56)
|
Всего сообщений: 2356 | Присоединился: май 2007 | Отправлено: 15 июля 2008 15:33 | IP
|
|
|