Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Задача по геометрии)


Автор: akolit 27.2.2009, 23:38
Здраствуйте.Мне необходимо вычислить координату точек.Не могу вспомнить какие лучше формулы применить.
итак вот картинка
user posted image
Координаты точек A,B,C,D нам известны.
прямая AB параллельна MN
прямая BC параллельна NO
прямая CD параллельна OP
прямая DA параллельна PM

расстояние между этими прямыми одинаковое и равно допустим 100мм.
Точки ABCD могут распологаться как угодно...образуя четырёхугольньик.
Необходимо вычислить координаты точек MNOP.
Просьба не писать ответы типа "Почитай книги о графике или посмотры в google...учебнике по геометрии" итд. Помогите с алгоритмом действий.Как и по каким формулам вести расчёт.
Заранее благодарен.

Автор: C/L 28.2.2009, 01:18
Это похоже на масштабирование. Линейное преобразование системы координат. Переход из одной системы в другую можно выполнить с помощью матриц. Вычисляем центр масштабирования, коэффициент масштаба и строим матрицу...

Добавлено через 14 минут и 3 секунды
Матрицу преобразования строим из 3 матриц:

K = K1 * K2 * K3

K1 - перенос центра в точку 0
K2 - масштабирование
K3 - обратный перенос в исходную точку.

После построения матрицы для каждой точки выполняем преобразование.

V2 = K * V1

где V1 - исходный вектор (для точек ABCD)
K - матрица преобразования
V2 - вектор в преобразованной системе координат (для точек MNOP)

Может есть и более легкий способ... smile 

Автор: C/L 28.2.2009, 09:04
Вариант 2:
Для точки A:
Найти значения двух векторов AB и AD.
Нормализовать их, чтобы длина была равна единице.
Умножить вектора на расстояние, на которое должны отстоять прямые (в данном случае 100 мм).

Результирующие координаты:

VM = VA + Lab*norm(AB) + Lad*norm(AD)

VA, VM - координаты точек A и M
Lab, Lad - расстояние между прямыми
norm  - функция нормализации

И так далее для каждой точки...

Поправлюсь: Формула здесь не верная совсем получилась: Lab, Lad должны зависеть от угла между AB и AD. Она верна только при угле 90 градусов

Автор: Hypertonyc 28.2.2009, 10:30
C/L, Вот вот...мы тоже поначалу подобным образом мыслили но когда угол поменялся с 90 всё стало плохо(...
А расскажи поподробней про вариант с масштабом...както недогнали...вот какой код получился(на GDI+)

Код

Point ABCD[4] = {Point(60, 120),Point(220, 120),Point(280, 200),Point(60, 280)};
Point MNOP[4] = {Point(60, 120),Point(220, 120),Point(280, 200),Point(60, 280)};

Matrix* m_1=new Matrix();

for(int i=0;i<4;i++)
{
    m_1->Reset();
    m_1->Translate(-ABCD[i].X,-ABCD[i].Y);

    m_1->Scale(0.1,0.1);

    m_1->Translate(ABCD[i].X,ABCD[i].Y);

    TransformPoints(&MNOP[i]);
}


походу ты совсем не так говорил,да?
Заранее спасибо.

Автор: C/L 28.2.2009, 14:06
Не знаю на сколько правильно посчитал но для второго метода вот что получилось что Lv = корень( (L^2) / ((2 + cos(a) ) * (sin (a/2))^2) )

VM = VA + Lv*norm(AB) + Lv*norm(AD)

http://ipicture.ru/

Автор: C/L 28.2.2009, 14:24
На счет кода на GDI+ не знаю, я сам писал на DirectX. Там D3DMATRIX используется. Но сначала нужно посчитать центр масштабирования - это точка относительно которой все будет масштабироваться. Вывести ее например как среднее арифмитическое координат:

X0 = (X1 + X2 + X3 + X4) / 4

и тоже самое для Y. Еще нужно посчитать масштабирующий коэффициент...

Добавлено через 7 минут и 10 секунд
Первый способ подойдет скорее всего только для выпуклых многоугольников. Для более сложных фигур будет пересечние исходного многоугольника с конечным.

А при расчете вторым способом при сильном уменьшении могут проподать некоторые линии и это надо отдельно отслеживать иначе фигура получится неправильно формы с собственными пересечениями.

Автор: Hypertonyc 1.3.2009, 12:47
C/L, Нам подходит вариант с нормализацией...невыпуклых фигур поидее небудет...
Ты вообще красафчик)Но если б ты объяснил подробней из каких формул ты взял Lv = корень( (L^2) / ((2 + cos(a) ) * (sin (a/2))^2) ) , чтоб нам в след раз опираться на этот пример и не спрашивать,то цены б тебе не было.А вообще огромное спасибо.Всё заработало.

Автор: C/L 2.3.2009, 07:55
Ну это же элементарно smile . Вот. Все должно быть понятно из следующего рисунка:

http://ipicture.ru/

И еще отдельно нужно рассмотреть случай a = 0 и a = 180!

Автор: C/L 2.3.2009, 08:12
Ну если подробнее:
1. Т.к. отступ линий от AB и от AD одинаков и равен L, то геометрическим местом точек, где может располагаться M будет биссектриса АМ к углу между AB и AD. Поэтому угол DAM = a/2.
2. T.к. вектора по AB и AD у нас равны, треугольник равнобедренный и углы при основании тоже равны (a/2). Ну а сумма углов треугольника 180, отсюда третий угол 180 - a.
3. Угол между векторами известен, длина определена как Lv, поэтому легко определяем уравнение для противолежащей стороны с.
4. Эту же сторону с можно найти из другого прямоугольного треугольника через синус угла, противолежащего L.
5. Подставляя одно в другое находим неизвестное.

Автор: Hypertonyc 2.3.2009, 09:31
C/L,Огромное спасибо...отлично помог!Вопрос считаю решённым.Закрываем тему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)