Здравствуйте, MBo, Вы писали:
MBo>Здесь A B C D E F- это коэффициенты уравнения общего вида для конических сечений (которое приводилось в скобках выше)
MBo>Из этих данных уже можно вытащить все параметры эллипса. Например, наклон оси Tg(fi)=B/(A-C)
Хорошо. А как узнать вершины, фокусы и длины радиусов эллипса? Мне нужны формулы или книга...
Re[2]: Эллипс вписанный в параллелограмм. Нужна книга или фо
Здравствуйте, MBo, Вы писали:
MBo>Окружность, вписанная в квадрат, имеет уравнение (в общем виде для конических сечений Ax^2+Bxy+Cx^2+Dx+Ey+F=0, иногда B,D,E с коэффициентом 2 пишут) MBo>x^2+y^2-x-y-1/4=0 MBo>или в матричном виде MBo>[x y 1] * [CRCL] * [x y 1]^T = 0 (^T — транспозиция) MBo>где СRCL = (1 0 -1/2)(0 1 -1/2)(-1/2 -1/2 1/4) MBo>аффинное преобразование переводит уравнение в MBo>[x y 1] * [AFF] * [CRCL] * [AFF]^T * [x y 1]^T = 0 MBo>произведение трех матриц в середине даст матрицу E, которую я посчитал в Maple, выписывать ее не буду, а сразу извлеку из нее параметры уравнения конического сечения MBo>A=bx^2+by^2 MBo>B=2*(bx*cx+by*cy) MBo>C=cx^2+cy^2 MBo>D=-bx-by MBo>E=-cx-cy MBo>F=1/4 MBo>Из этих данных уже можно вытащить все параметры эллипса. Например, наклон оси Tg(fi)=B/(A-C) MBo>Но это уже самостоятельно..
Интересно, а как у Вас получилось так элегантно разложить уравнение окружности на матричное произведение? И более общий вопрос — как уравнение кривой (допустим, общее 2-го порядка) преобразовать аффинными преобразованиями, т.е. получить новое уравнение? Если можно, то укажите источник
Re[11]: Эллипс вписанный в параллелограмм. Нужна книга или ф
Здравствуйте, VovaMulder1983, Вы писали:
VM> — как уравнение кривой (допустим, общее 2-го порядка) преобразовать аффинными преобразованиями, т.е. получить новое уравнение?
Так это как раз и сделано. Матрица (CRCL в данном случае):
A B/2 D/2
B/2 C E/2
D/2 E/2 F
(в скане книги Роджерса она приведена с опечаткой)
VM>> Если можно, то укажите источник
Прямого источника нет, идеи разложения из Роджерса — Математические основы машинной графики и, возможно, что-то из Schneider P.J., Eberly D.H. Geometric tools for computer graphics. Eberly еще пописывает в news-группу comp.graphics.algorithms
Re[12]: Эллипс вписанный в параллелограмм. Нужна книга или ф
Спасибо за матрицу разложения, но Вы не ответили, как разложить уравнение, имея такую матрицу. Насколько я понял из Вашего примера, то уравнение f(x,y) с матрицей разложения М приобретает следующий матричный вид
MBo>[x y 1] * [М] * [x y 1]^T = 0
А для того, чтобы подействовать на уравнение f(x,y) афинными преобразованиями и получить новое уравнение f'(x,y), Вы приводите следующую запись
MBo>[x y 1] * [AFF] * [М] * [AFF]^T * [x y 1]^T = 0
Вот, как она получилась? Я понимаю так: [AFF] здесь уместно, т.к. она собственно и есть афф.пр., а вот почему тут [AFF]^T — мне не ясно. Объясните, плиз, или киньте ссылку на источник
Re[13]: Эллипс вписанный в параллелограмм. Нужна книга или ф
Здравствуйте, VovaMulder1983, Вы писали:
VM>Здравствуйте, MBo, Вы писали:
VM>Спасибо за матрицу разложения, но Вы не ответили, как разложить уравнение, имея такую матрицу. Насколько я понял из Вашего примера, то уравнение f(x,y) с матрицей разложения М приобретает следующий матричный вид
MBo>>[x y 1] * [М] * [x y 1]^T = 0
VM>А для того, чтобы подействовать на уравнение f(x,y) афинными преобразованиями и получить новое уравнение f'(x,y), Вы приводите следующую запись
MBo>>[x y 1] * [AFF] * [М] * [AFF]^T * [x y 1]^T = 0
VM>Вот, как она получилась? Я понимаю так: [AFF] здесь уместно, т.к. она собственно и есть афф.пр., а вот почему тут [AFF]^T — мне не ясно. Объясните, плиз, или киньте ссылку на источник
Вот так если сгруппировать, должно быть понятнее
( [x y 1] * [AFF] ) * [М] * ( [AFF]^T * [x y 1]^T ) = 0
первая скобка — вектор-строка координат после преобразования, а последняя — он же транспонированный (вектор-столбец) (по свойству (A*B)^T = B^T*A^T)
Re[14]: Эллипс вписанный в параллелограмм. Нужна книга или ф
Здравствуйте, MBo, Вы писали:
MBo>Вот так если сгруппировать, должно быть понятнее MBo>( [x y 1] * [AFF] ) * [М] * ( [AFF]^T * [x y 1]^T ) = 0 MBo>первая скобка — вектор-строка координат после преобразования, а последняя — он же транспонированный (вектор-столбец) (по свойству (A*B)^T = B^T*A^T)
Спасибо, я уже догнал + Роджерс очень помог
Re[14]: Эллипс вписанный в параллелограмм. Нужна книга или ф
Здравствуйте, MBo, Вы писали:
MBo>Пусть одна вершина параллелограмма A находится в начале координат (реальные координаты проще добавить в конце), смежные с ней B и С имеют координаты (bx,by) и (cx, cy). MBo>Тогда аффинное преобразование, переводящее единичный квадрат с углом в начале координат в данный параллелограмм, описывается матрицей MBo>AFF = (bx by 0)(cx cy 0)( 0 0 1) MBo>Окружность, вписанная в квадрат, имеет уравнение (в общем виде для конических сечений Ax^2+Bxy+Cx^2+Dx+Ey+F=0, иногда B,D,E с коэффициентом 2 пишут) MBo>x^2+y^2-x-y-1/4=0 MBo>или в матричном виде MBo>[x y 1] * [CRCL] * [x y 1]^T = 0 (^T — транспозиция) MBo>где СRCL = (1 0 -1/2)(0 1 -1/2)(-1/2 -1/2 1/4) MBo>аффинное преобразование переводит уравнение в MBo>[x y 1] * [AFF] * [CRCL] * [AFF]^T * [x y 1]^T = 0 MBo>произведение трех матриц в середине даст матрицу E, которую я посчитал в Maple, выписывать ее не буду, а сразу извлеку из нее параметры уравнения конического сечения MBo>A=bx^2+by^2 MBo>B=2*(bx*cx+by*cy) MBo>C=cx^2+cy^2 MBo>D=-bx-by MBo>E=-cx-cy MBo>F=1/4 MBo>Из этих данных уже можно вытащить все параметры эллипса. Например, наклон оси Tg(fi)=B/(A-C) MBo>Но это уже самостоятельно..
1) Вы уверены в правильности матрицы AFF? у меня вышло (сx сy 0)(bx by 0)( 0 0 1) (это 3 строки)
2) Я вычислил коэффициенты A — F, после чего вычислил угол ФИ, центр и радиусы (исходя из коэффициентов), но они явно неправильные, я всё трижды перепроверил, использовал Вашу матрицу афф.пр. вместо своей, но ничего не помогает. Вычисления параметров эллипса брал отсюда http://mathworld.wolfram.com/Ellipse.html
Если есть какие-то замечания, буду признателен
Re[15]: Эллипс вписанный в параллелограмм. Нужна книга или ф
Здравствуйте, VovaMulder1983, Вы писали:
VM>1) Вы уверены в правильности матрицы AFF? у меня вышло (сx сy 0)(bx by 0)( 0 0 1) (это 3 строки)
это просто разный порядок именования вершин, наверно. Иначе различие скажется в виде отраженного параллелограмма
VM>2) Я вычислил коэффициенты A — F, после чего вычислил угол ФИ, центр и радиусы (исходя из коэффициентов), но они явно неправильные, я всё трижды перепроверил, использовал Вашу матрицу афф.пр. вместо своей, но ничего не помогает. Вычисления параметров эллипса брал отсюда http://mathworld.wolfram.com/Ellipse.html
Учтено, что часть коэффициентов в общем уравнении кривой у меня удвоенные, а на этой страничке нет?
Re[15]: Эллипс вписанный в параллелограмм. Нужна книга или ф
Здравствуйте, MBo, Вы писали:
MBo>При проверке примера нашел у себя принципиальную ошибку. Место и причину пока не локализовал, найду, есди появится время.
и в Вашей, и в моей результирующих матрицах эллипса коэф В зависит от bx*cx+by*cy (у меня он равен bx*cx+by*cy , у Вас равен 2*(bx*cx+by*cy)). Привожу пример:
есть прямоугольник с вершинами B(-b, b) A(0, 0) C(c, c) D (c — b, c + b)
b > 0, c > 0
это прямоугольник, лежащий одной вершиной (A) в начале координат, "правой" смежной вершиной (B) на прямой y = x и "левой" смежной вершиной (C) на прямой y = -x
Таким образом, B = bx*cx+by*cy = | bx = -b, cx = c, by = b, cy = c| = -b * c + b * c = 0
Отсюда выходит, что эллипс, вписанный в такой прямогульник, выложен по координатным осям (его оси параллельны коорд. осям), но ведь это не так — угол наклона большой оси такого эллипса будет = 45 градусов.
Выходит, что принципиальная ошибка находится в изначальном подходе вычисления матрицы коэффициентов для уравнения эллипса
[x y 1] * [AFF] * [CRCL] * [AFF]^T * [x y 1]^T
Буду очень признателен, если у Вас появится время
Re[17]: Эллипс вписанный в параллелограмм. Нужна книга или ф
Здравствуйте, VovaMulder1983, Вы писали:
MBo>>При проверке примера нашел у себя принципиальную ошибку. Место и причину пока не локализовал, найду, есди появится время. VM>Буду очень признателен, если у Вас появится время
Матрица обратная нужна была!
Вот так работает:
procedure CalcEllParams(bx, by, cx, cy: Integer; var A, B, C, D, E, F: Double);
var
Cross, CrossSqr: Double;
begin
Cross := 1/(bx * cy - cx * by);
CrossSqr := Sqr(Cross);
A := CrossSqr*(Sqr(cy) + Sqr(by));
B := - 2 * CrossSqr* (cy * cx + by * bx);
C := CrossSqr * (Sqr(cx) + Sqr(bx));
D := Cross * (by - cy);
E := Cross * (cx - bx);
F := 1/4;
end;
Здравствуйте, VovaMulder1983, Вы писали:
VM>но не могли бы Вы привести изначальную модель (в матричном виде) и показать, где там нужна была обратная матрица
Матрица аффинного преобразования была нужна обратная (т.е. преобразования из параллелограмма в единичный квадрат).