Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разбиение на равные части [Delphi, Windows]


D-Man ©   (2005-04-20 01:48:00) 

Такая задача:
Есть прямоугольник (или треугольник, если так проще), надо разбить его на заданое количество треугольников одинаковой площади.
Кто-нибудь знает как? Или где?


D-Man   (2005-04-20 14:31:00) [1]

Но опять же форма у них помоему будет одинаковая


boalse   (2005-04-20 12:06:00) [2]

Может тогда взять прямоугольник, разрезать его на ЛЮБОЕ количетво треугольников, сколько получиться, главное с одинаковой площадью. Затем каждый из получившихся треугольников разбить на N частей по указанной выше схеме схеме. N=(ТребуемоеКоличество/КоличествоПолучившихся), если будет остаток, то тогда один какой-нибудь треугольник разбить не на N, а на N+1 частей.


D-Man   (2005-04-20 11:37:00) [3]

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

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

Кстати, если кто играл в Космических Рейнджеров, то видел там карту космоса, она как раз строится случайно. Прямоугольник делится на заданное кол-во полигонов, что помоему можно получить из деления на треугольники. Площадь у них там правда вариируется в заданных пределах. Сделали же как-то люди? Спросить бы у них... но они же не скажут :(


boalse   (2005-04-20 08:56:00) [4]

А разбить прямоугольник на одинаковые треугольники таким методом ещё проще.
Если количество треугольников чётное:
Сначала выбираем одну из сторон и строим от неё N штук перпендикуляров через равное расстояние, по сути делим прямоугольник на N+1 маленьких одинаковых прямоугольников, где N=(КоличествоТреугольников/2)-1. Теперь просто проводим диагонали в построенных прямоугольниках.

Если количество треугольников нечётное:
Разбиваем на два треугольника и  делаем в каждом из них по схеме boalse ©   (20.04.05 08:38) [4]


boalse   (2005-04-20 08:38:00) [5]

Ну, понятно, что плошадь каждого треугольника будет находиться как общая плошадь/количество. Выбираем две любые стороны большого треугольника, на них будут лежать две стороны первого маленького, причём так, что одна из выбранных сторон большого=одной из сторон маленькой. Таким образом нам во первых известна площадь первого искомого треугольника, во вторых одна из его сторон, в третьих можно найти угол между двумя выбранными нами сторонами, по сути один из углов искомого треугольника. По этим трём параметрам мы вполне можем найти третью сторону, только я фомулу не знаю, не задумывался. Теперь нам известен первый треугольник. Дальше всё похоже. Выбираем найденную нами сторону первого треугольника и ту сторону большого треугольника, которую мы не выбрали прошлый раз. Опять нам известна площадь, одна сторона и один из углов между сторонами искомого треугольника. Находим третью сторону. Далее опять тоже самое. Берём только что найденную сторону и сторону большого, только ту которую мы брали первый раз (в дальнейшем берём по очереди то одну то другую сторону). В конце концов таким образом можно разбить ЛЮБОЙ треугольник.


D-Man   (2005-04-20 08:03:00) [6]

Хотя бы примерный принцип?


XProger   (2005-04-20 02:36:00) [7]

"надо разбить его на заданое количество треугольниководинаковой площади."
Это не всегда возможно...


D-Man   (2005-04-20 02:11:00) [8]

Забыл, нужно чтобы треугольники могли получиться и в середине, т.е. просто поделить прямоугольник симетрично отрезками, проходящими через центр не пойдет. В идеале если еще добавить некоторый рандом, то каждый раз делиться должно в разных местах


Наверх

Титульная страница Поиск, карта сайта Написать письмо