![]() |
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]() ![]() ![]() |
|
akolit |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 22.2.2008 Репутация: нет Всего: нет |
Здраствуйте.Мне необходимо вычислить координату точек.Не могу вспомнить какие лучше формулы применить.
итак вот картинка ![]() Координаты точек A,B,C,D нам известны. прямая AB параллельна MN прямая BC параллельна NO прямая CD параллельна OP прямая DA параллельна PM расстояние между этими прямыми одинаковое и равно допустим 100мм. Точки ABCD могут распологаться как угодно...образуя четырёхугольньик. Необходимо вычислить координаты точек MNOP. Просьба не писать ответы типа "Почитай книги о графике или посмотры в google...учебнике по геометрии" итд. Помогите с алгоритмом действий.Как и по каким формулам вести расчёт. Заранее благодарен. |
|||
|
||||
C/L |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 31.7.2004 Где: Самара Репутация: нет Всего: 1 |
Это похоже на масштабирование. Линейное преобразование системы координат. Переход из одной системы в другую можно выполнить с помощью матриц. Вычисляем центр масштабирования, коэффициент масштаба и строим матрицу...
Добавлено через 14 минут и 3 секунды Матрицу преобразования строим из 3 матриц: K = K1 * K2 * K3 K1 - перенос центра в точку 0 K2 - масштабирование K3 - обратный перенос в исходную точку. После построения матрицы для каждой точки выполняем преобразование. V2 = K * V1 где V1 - исходный вектор (для точек ABCD) K - матрица преобразования V2 - вектор в преобразованной системе координат (для точек MNOP) Может есть и более легкий способ... ![]() |
|||
|
||||
C/L |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
Hypertonyc |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 19.10.2008 Репутация: нет Всего: нет |
C/L, Вот вот...мы тоже поначалу подобным образом мыслили но когда угол поменялся с 90 всё стало плохо(...
А расскажи поподробней про вариант с масштабом...както недогнали...вот какой код получился(на GDI+)
походу ты совсем не так говорил,да? Заранее спасибо. |
|||
|
||||
C/L |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 31.7.2004 Где: Самара Репутация: нет Всего: 1 |
||||
|
||||
C/L |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 31.7.2004 Где: Самара Репутация: нет Всего: 1 |
На счет кода на GDI+ не знаю, я сам писал на DirectX. Там D3DMATRIX используется. Но сначала нужно посчитать центр масштабирования - это точка относительно которой все будет масштабироваться. Вывести ее например как среднее арифмитическое координат:
X0 = (X1 + X2 + X3 + X4) / 4 и тоже самое для Y. Еще нужно посчитать масштабирующий коэффициент... Добавлено через 7 минут и 10 секунд Первый способ подойдет скорее всего только для выпуклых многоугольников. Для более сложных фигур будет пересечние исходного многоугольника с конечным. А при расчете вторым способом при сильном уменьшении могут проподать некоторые линии и это надо отдельно отслеживать иначе фигура получится неправильно формы с собственными пересечениями. |
|||
|
||||
Hypertonyc |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 19.10.2008 Репутация: нет Всего: нет |
C/L, Нам подходит вариант с нормализацией...невыпуклых фигур поидее небудет...
Ты вообще красафчик)Но если б ты объяснил подробней из каких формул ты взял Lv = корень( (L^2) / ((2 + cos(a) ) * (sin (a/2))^2) ) , чтоб нам в след раз опираться на этот пример и не спрашивать,то цены б тебе не было.А вообще огромное спасибо.Всё заработало. |
|||
|
||||
C/L |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 31.7.2004 Где: Самара Репутация: нет Всего: 1 |
||||
|
||||
C/L |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
Hypertonyc |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 19.10.2008 Репутация: нет Всего: нет |
C/L,Огромное спасибо...отлично помог!Вопрос считаю решённым.Закрываем тему.
|
|||
|
||||
![]() ![]() ![]() |
Вы можете найти полезным что... | |
|
|
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |