Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача по геометрии), Помогите с вычислением координат точек 
V
    Опции темы
akolit
Дата 27.2.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.2.2008

Репутация: нет
Всего: нет



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

расстояние между этими прямыми одинаковое и равно допустим 100мм.
Точки ABCD могут распологаться как угодно...образуя четырёхугольньик.
Необходимо вычислить координаты точек MNOP.
Просьба не писать ответы типа "Почитай книги о графике или посмотры в google...учебнике по геометрии" итд. Помогите с алгоритмом действий.Как и по каким формулам вести расчёт.
Заранее благодарен.
PM MAIL   Вверх
C/L
Дата 28.2.2009, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 31.7.2004
Где: Самара

Репутация: нет
Всего: 1



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

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

K = K1 * K2 * K3

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

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

V2 = K * V1

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

Может есть и более легкий способ... smile 
PM MAIL WWW ICQ   Вверх
C/L
Дата 28.2.2009, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 31.7.2004
Где: Самара

Репутация: нет
Всего: 1



Вариант 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 градусов

Это сообщение отредактировал(а) C/L - 28.2.2009, 09:20
PM MAIL WWW ICQ   Вверх
Hypertonyc
Дата 28.2.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 19.10.2008

Репутация: нет
Всего: нет



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]);
}


походу ты совсем не так говорил,да?
Заранее спасибо.
PM MAIL   Вверх
C/L
Дата 28.2.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 31.7.2004
Где: Самара

Репутация: нет
Всего: 1



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

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

user posted image
PM MAIL WWW ICQ   Вверх
C/L
Дата 28.2.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 31.7.2004
Где: Самара

Репутация: нет
Всего: 1



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

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

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

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

А при расчете вторым способом при сильном уменьшении могут проподать некоторые линии и это надо отдельно отслеживать иначе фигура получится неправильно формы с собственными пересечениями.
PM MAIL WWW ICQ   Вверх
Hypertonyc
Дата 1.3.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 19.10.2008

Репутация: нет
Всего: нет



C/L, Нам подходит вариант с нормализацией...невыпуклых фигур поидее небудет...
Ты вообще красафчик)Но если б ты объяснил подробней из каких формул ты взял Lv = корень( (L^2) / ((2 + cos(a) ) * (sin (a/2))^2) ) , чтоб нам в след раз опираться на этот пример и не спрашивать,то цены б тебе не было.А вообще огромное спасибо.Всё заработало.
PM MAIL   Вверх
C/L
Дата 2.3.2009, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 31.7.2004
Где: Самара

Репутация: нет
Всего: 1



Ну это же элементарно smile . Вот. Все должно быть понятно из следующего рисунка:

user posted image

И еще отдельно нужно рассмотреть случай a = 0 и a = 180!
PM MAIL WWW ICQ   Вверх
C/L
Дата 2.3.2009, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 31.7.2004
Где: Самара

Репутация: нет
Всего: 1



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

Это сообщение отредактировал(а) C/L - 2.3.2009, 08:22
PM MAIL WWW ICQ   Вверх
Hypertonyc
Дата 2.3.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 19.10.2008

Репутация: нет
Всего: нет



C/L,Огромное спасибо...отлично помог!Вопрос считаю решённым.Закрываем тему.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0926 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.