Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опять геометрия, Теперь с треуголками 
:(
    Опции темы
YURIC
Дата 20.10.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Подскажите товарисчи как построить параллельный треугольник?

Для примера покажу картинку:

--Resize_Images_Alt_Text--

Нужно найти координаты точек с вопросиками. Подскажите как? Пожалуйста.

P/S/ Нарисовал как мог, треугольники должны быть параллельными, расстояние на которое нужно расширить треугольник известно.
Добавлено @ 14:22
http://softwill.com.ru/treug.gif

Это сообщение отредактировал(а) YURIC - 20.10.2005, 14:20
PM MAIL   Вверх
maxim1000
Дата 20.10.2005, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



первое, что приходит в голову:
1. выбираем одну сторону
2. пишем для нее уравнение прямой
3. сдвигаем прямую на необходимое расстояние
4. проделываем то же самое для двух других сторон, получаем 3 прямых
5. находим точки их попарных пересечений - их будет 3
это и будут точки треугольника


--------------------
qqq
PM WWW   Вверх
YURIC
Дата 20.10.2005, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



maxim1000

Блин, это классно конечно, а можно пример?
smile smile smile
PM MAIL   Вверх
maxim1000
Дата 20.10.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ага... или второй вариант:
1. берем точку
2. выбираем любое ребро, которое из нее выходит
3. выбираем перпендикулярное ему направление - в сторону "от треугольника"
4. сдвигаем ее на заданное расстояние
5. смотрим на другую сторону, пишем ее уравнение прямой
6. начинаем сдвигать точку параллельно первой стороне пока, она не окажется на заданном расстоянии от прямой второй стороны
7. повторяем эту процедуру для двух других точек...
Добавлено @ 14:31
так... вот третий вариант и он последний...
для каждой точки записываем два уравнения:
1. находится на нужном расстоянии от прямой одной стороны
2. находится на нужном расстоянии от прямой второй стороны
решаем, получаем ее координаты, так для каждой из трех
фуух... ну и флудер я smile
а пример сейчас для третьего варианта будет...


--------------------
qqq
PM WWW   Вверх
YURIC
Дата 20.10.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



maxim1000

ага, у тебя получается писать быстрее, чем у меня читать smile
PM MAIL   Вверх
maxim1000
Дата 20.10.2005, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



так... пример будет позже, ибо работа...


--------------------
qqq
PM WWW   Вверх
YURIC
Дата 20.10.2005, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



maxim1000

Я подожду smile
PM MAIL   Вверх
sergejzr
Дата 20.10.2005, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Поищи матрицу для проекции. на неё потом каждую точку умножишь и будут новые координаты.

Добавлено @ 15:06
В мат. справочнике. У меня просто под рукой нет сейчас.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
YURIC
Дата 20.10.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



sergej.z

Вот и уменя тоже нет... smile

Поэтому и прошу помощи.
PM MAIL   Вверх
maxim1000
Дата 20.10.2005, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



хм... все-таки не удержался и придумал четвертый
этак меня и забанить могут за флейм smile
задача такая: добавить по очереди три полоски (трапеции) к треугольнику
после каждого добавления треугольник будет расширяться в нужную нам сторону
например, добавляем полоску к стороне BC:
полученный треугольник будет подобен исходному, верщины A и A' будут совпадать
потому новые вершины можно будет найти так:
B'=A+k*(B-A)
C'=A+k*(C-A)
k - коэффициент подобия
его вычисление:
мы точно знаем, что высота, опущенная с точки A, должна увеличиться на d (заданное расстояние), с другой стороны она должна увеличиться в k раз (т.к. подобие)
вот и получаем:
k=(hA+d)/hA
где, hA - длина высоты из A на BC в исходном треугольнике...
вычислить ее можно, как угодно, например, по всяким косинусам-синусам или по площади...

если что - спрашивай...

Это сообщение отредактировал(а) maxim1000 - 20.10.2005, 15:21


--------------------
qqq
PM WWW   Вверх
YURIC
Дата 20.10.2005, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата
вычислить ее можно, как угодно, например, по всяким косинусам-синусам или по площади...


smile

мож по аське?
PM MAIL   Вверх
YURIC
Дата 20.10.2005, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



smile
PM MAIL   Вверх
maxim1000
Дата 20.10.2005, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
мож по аське?

нету у меня аськи smile

высота, на самом деле вычисяется довольно просто
есть две формулы площади треугольника:
1. s=BC*hA/2
2. s=sqrt(p*(p-a)*(p-b)*(p-c)), где p=(a+b+c)/2
вчитаем площадь по второй формуле, подставляем в первую, находим высоту...


--------------------
qqq
PM WWW   Вверх
YURIC
Дата 20.10.2005, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



smile smile
PM MAIL   Вверх
sergejzr
Дата 20.10.2005, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Треугольник задан точками:
P1(x1,y1); P2(x2,y2); P3(x3,y3)
Задан фактор расширения fx, fy; (Соответственно по x и y)
Составляем матрицу для скалирования:
Код

     fx 0  0  0
     0  fy 0  0
 S1( 0  0  0  0 )
     0  0  0  1 


Находим геометрический центр треугольника Pc1:

xc1=(x1+x2+x3)/3;
yc1=(y1+y2+y3)/3;
Получили:
Pc1(xc1,yc1);

Скалируем центр и получаем центр большого треугольника Pc2(естесственно сдвинутый).
Pc2 = S1 x Pc1
Получаем:Pc2(хc2,xc2);

Находим разницу dX=(xc2-xc1) dY=(yc2-yc1)

Подставляем разницу в нашу матрицу (она теперь будет сдвигать большой треугольник нa маленький)
Код
     fx 0  0  -dX
     0  fy 0  -dY
 S2( 0  0  0  0 )
     0  0  0  1 

Умножем матрицу S2 нс каждую из точек и получаем новые проавильные координаты точек.

Всё smile Это была теория. Теперь практика

Код

function scale(x1,y1,x2,y2,x3,y3,x4,y4,fx,fy)
{
 //Gеом. середина
 xc1=(x1+x2+x3)/3;
 yc1=(y1+y2+y3)/3;

 //Oна же для большого тр.
 xc2=xc1*fx;
 yc2=yc1*fx;

 //Дельты для трансляции
 dx=xc2-xc1;
 dy=yc2-yc1;

 //Решаем точки:
 nx1=fx*x1-dx;
 ny1=fy*y1-dy;

 nx2=fx*x2-dx;
 ny2=fy*y2-dy;

 nx3=fx*x3-dx;
 ny3=fy*y3-dy;
}
//nx1,ny1... .идт - координаты углов большого треугольника



PS:
Возможно надо будет сперва транслировать всю фигуру в положительный квадрант координат(из за знаков +/-). Хотя по идее должно работать везде. Не охота доказательств искать. На практике просто замерь..
PPS:
Во только от деления к сож. не удалось избавится.. Но думаю, это и невозможно... Что скажете?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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