PDA

Просмотр полной версии : программное рисование


KorneKrabb
15.04.2004, 14:08
как вычислить площадь программно нарисованной сложной фигуры ?

Dindin
15.04.2004, 14:35
Это зависит от фигуры. Если фигура действительно сложная, то проще всего разбить ее (условно) на примитивы и сосчитать сумму их площадей. Встроенного вычисления площади во flash, насколько я знаю, нет.

KorneKrabb
15.04.2004, 14:44
Да.... это можно представить если фигура выпуклая .... хотя и с трудом.... а что если она таковой не является ?

FreeLander
15.04.2004, 15:23
это можно представить если фигура выпуклая .... хотя и с трудом.... а что если она таковой не является ?

причём тут выпуклость?

ты ж фигуру на плоскости рисуешь - вот и считай площадь плосого объекта - ГЕОМЕТРИЯ.

или может ты имел в виду rectangle нарисованного объекта - тогда рисуй в новом мувике и смотри его высоту и ширину.

или я действительно чего-то не понял.

KorneKrabb
15.04.2004, 16:21
фигуре необязательно быть трехмерной чтобы называться выпуклой :)
в данном случае выпуклая фигура это некая фигура состоящая скажем из двух прямоугольников слепленных по сторонам
а вогнутая это один прямоугольник из которого (булевой операцией) "выкушен" второй ( С-образная фигура )

причем по замыслу фигура рисуется не прямоугольниками а скорее всего через угловые точки...
говоря грубым языком пользователь задает эти точки тем или иным образом, а программа проводит через них линии закрашивая контур . далее она должна вычислять ПЛОЩАДЬ фигуры

Nucer
15.04.2004, 16:53
Как как - с помощью интегралов. Если ты напишешь такой алгоритм то тебе дадут какую-нибудь премию. Лучше действительно с помощью циклов. Например находишь верхнюю,самую нижнюю, самую левую и самую правую точки объекта и спускаешься на одну точку вниз и проходишь цилом вправо, проверяя текущую точку на принадлежность к объекту. Только это лагать будет не слабо

KorneKrabb
15.04.2004, 17:12
Nucer я думаю то что в любом случае фигура будет состоять из N-ного количества прямоугольников это уже Плюс... дробить конечную фигуру на прямоугольники легко если она нарисована на листке бумаги перед носом.
а программно, опираясь лишь на координаты углов...... геммор...
в юности я работал на Бейсике ( самой древней его версии )
я применял там этот метод ( попиксельная проверка картинки ) но не хочу снова прибегать к нему так как представляю сколько это будет занимать времени...


может есть еще какие нибудь идеи ?

Nucer
15.04.2004, 17:14
Можно например так

KorneKrabb
15.04.2004, 17:33
ммм... а можно его [исходник] под Flash 6 сохранить ато он у меня не открывается....?... :)

FreeLander
15.04.2004, 17:39
у Nucerа классный исходник - мне понравилось, самому в голову такое не пришло, но это и есть та самая попиксельная проверка картинки.

posted by KorneKrabb

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

FreeLander
15.04.2004, 17:47
а можно его [исходник] под Flash 6 сохранить ато он у меня не открывается....?...

FreeLander
15.04.2004, 17:49
сорри, не получилось.
попытка номер двас: файл в МХ

Nucer
15.04.2004, 17:53
Но лучше так. И дейтвительно, если у тебя фигура образована прямыми то вполне реально вычислить другим методом

Dindin
15.04.2004, 18:13
Хороший алгоритм - фозьму на заметку (если ты не против) :)

KorneKrabb
15.04.2004, 18:23
Nucer, тестируему Celeronу потребовалось несколько секунд на то чтобы вычислить площадь (что огорчает)
представь сколько думал Бейсик ! :)
но как я понял это единственный на данный момент реальный способ вычисления , но вот что я думаю . что если поделить фигуру на прямоугольники опустив из каждой точки проекции и получив при этом некое количество прямоугольников ( в том числе и не относящихся к фигуре).
далее в каждом из них найти некую точку Z (точка с нбольшим отступом от угла прямоугольника ). и уже в этой точке проверить относиться ли он к фигуре или нет
если да то прибавить его площадь к общей если нет игнорировать ?
если слишком коряво объяснил смотрите рис.

Nucer
15.04.2004, 18:40
Насчёт нескольких секунд это ты загнул посмотри ещё вот это ( кстати в MX 2004 раз в десять (!) быстрее )

KorneKrabb
15.04.2004, 18:48
....в принципе то что я предлагаю это аналог попиксельной проверки hitTestoм заисключением того что проверяется не каждый пиксель а каждый прямоугольник образованный проекциями координат на оси...
это должно работать быстрее ....

Iv
15.04.2004, 18:49
нарисовал квадрат 100x100, получил площадь 90000
учитывая, то, что чаще правильные фигуры рисуют с целыми значениями и в целых координатах, строку можно заменить на такую:
if (MC.hitTest(j+.5, i+.5, true)) {

что касается // работает только при условии, что верхний левый угол фигуры находиться в точке 0x0 то это исправимо с помощью getBounds.

KorneKrabb
15.04.2004, 18:51
ну это сейчас секунду :)
а впроцессе игры при наличии еще кучи объектов будет тормозить сильнее
а последние два файла у меня не открылись ( ну нету у меня Flash MX 2004 )))) ))

Nucer
15.04.2004, 19:02
Да BitSky прав. Кстати у меня ведь тоже можно задавать размер квадрата

Nucer
15.04.2004, 19:05
....в принципе то что я предлагаю это аналог попиксельной проверки hitTestoм заисключением того что проверяется не каждый пиксель а каждый прямоугольник образованный проекциями координат на оси...
это должно работать быстрее ....
На одно нахождение проекций потребуется времени столько же

KorneKrabb
15.04.2004, 19:09
Nucer от изменения шага (STEP) уменьшается точность !!!

Nucer
15.04.2004, 19:15
Ну ясно дело уменьшается. Но не очень и сильно.

KorneKrabb
15.04.2004, 19:28
на счет проекций - честно сказать не знаю... пока не начал ....
но думаю что при рисовании пользователем фигуры - в массив будут заноситься координаты при поворотах....
потом будет происходит сортировка информации....
построение виртуальной сетки делящей фигуру на примитивы...
сверение данных методом hitTesta...
...хм.. да наверное если пользователь попробует нарисовать стото слишком многоугольное это и займет ощутимое кол-во времени...
но по самой задумке игры у него просто не будет на это времени :)

Nucer
15.04.2004, 20:29
А как будет происходить рисование? Юзер просто будет кликать в следующую точку?

KorneKrabb
15.04.2004, 21:46
....Nucer, пользователь будет управлять стрелками
попадая в определенную зону будет отчерчивать от нее куски которые и будут являться теми фигурами...

одним словом была очень давно такая игра - Xonix
меня всегда интересовал ее алгоритм....

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