![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Immortal |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 15.8.2003 Репутация: нет Всего: нет |
Я вот решился наконец написать логическую игру "точки". Сделал кучу возможно никому и ненужных настроек (размер поля, изменение точек при захвате и многое другое).
Написал нерекурсивный и довольно экономичный алгоритм поиска самой короткой линии захвата, но вот одна проблема мне надо залить область ограниченную этими линиям (значения массива 2- линия захвата, 0 - пустая клетка). Я использовал рекурсивную заливку, но она сильно долгая На algolist.manual.ru есть хороший (я думаю) алгоритм заливки, но все алгоритмы, что там есть написаны на C, а C я не знаю Если у кого есть предложения по заливке или желание перевести алгоритмы из C в Delphi, то буду благодарен. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
А может можно построить регион(CreatePolygonRgn) по этим точкам и заполнять его функцией FillRgn? Или я что то не так понял?
Это сообщение отредактировал(а) <Spawn> - 15.8.2003, 13:33 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Вот тебе примерчик:
Это сообщение отредактировал(а) <Spawn> - 15.8.2003, 13:34 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
А я так понял, что у Immortal есть матрица, состоящая из 2 и 0. Например:
0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 2 0 0 0 0 2 0 0 2 0 2 0 2 2 0 0 2 0 0 0 2 0 0 0 2 0 0 0 2 2 2 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 И это должно закраситься вот так: 0 0 0 0 0 0 0 0 0 0 0 0 * * 0 0 0 * 0 0 0 0 * * * * 0 * * * * 0 0 * * * * * * * * * 0 0 0 * * * 0 * * * 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Т.е. координаты концов отрезков ему как бы так сразу и неизвестны. Хотя это только предположения... -------------------- С уважением, г-н Посол. |
|||
|
||||
| &-ray |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 406 Регистрация: 15.4.2003 Где: Казахстан, г Аста на Репутация: нет Всего: нет |
Если это та игра в точки, про которую я думаю, то любую "захваченную" область можно разбить на элементарные составляющие - треугольники.
Таким образом, обработав все игровое поле, можно построить соответствующие треугольники с заливкой (используй Canvas.Poligon) -------------------- "Совсем неважно от чего помрешь, ведь куда важнее - для чего родился..." С.Б. -------------------- И снова мышь беру я в руки Куда иду? - Конечно в сруки! |
|||
|
||||
| Immortal |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 15.8.2003 Репутация: нет Всего: нет |
Конечно сиасмбо за предоставленную информуцию, но мне нодо нечто иное.
У меня есть массив в котором я собираюсь производить заливку в начале кождого хода он пуст (все 0) игра происходит на другом массиве. Как только ставится точка которая образует замкнутую линию, я нахожу эту линию (уже написал алгоритм) и уже тогда эту линию я отмечаю на этом массиве. Точку внутри области я тоже знаю. Мне надо что бы программа из точки внутри прошлась по области оганиченной линией (этими самыми 2), побывав на каждой точке всего желательно один раз. Что программа будет изменять, оказавшись на кождой из внутренних точек это моя забота (там организуется счётчик захваченных тобою точек). Например: 0 0 0 0 0 0 0 2 2 0 0 0 2 * * 2 0 0 2 * * * 2 0 0 2 2 2 0 0 0 0 0 0 0 0 * - точки (элементы массива), которые должны просматриваться прогой. А закрашивать область в какой-то цвет мне совсем не надо За раннее спасибо. |
|||
|
||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 8 Всего: 57 |
Immortal, Я так понимаю, массивы максимум 100х100 (ни фига себе захват! |
|||
|
||||
| Immortal |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 15.8.2003 Репутация: нет Всего: нет |
Заливка медленна относительно.
Моя заливка такая;
tempArray - мой массив по которому я реализую заливку vector - массив Point с напрвлениями 1. Алгоритм рекурсивный, отсюда следует требуется довольно много памяти; 2. При просмотре окружающих точек за каждый вызов просматриваются 4 точки, отсюда следует, что при захвате области в 100 точек просмотров будут 400. Если ставишь точку ты это работает быстро, но в алгоритме интеллекта таких просмитров будет довольно много. |
|||
|
||||
| &-ray |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 406 Регистрация: 15.4.2003 Где: Казахстан, г Аста на Репутация: нет Всего: нет |
А ты проверял свой код, он рабочий
Я имею ввиду: он полностью обходит весь замкнутый "регион" и заполняет массив единицами? Мне кажется, что нет, так как у тебя рекурсия происходит сразу же после первого найденного значения 0 в массиве, и остальные рядом находящиеся ячейки могут так и остаться нулями (а возможно и нет, все зависит от формы "региона" и выбора начальной точки для "заливки") -------------------- "Совсем неважно от чего помрешь, ведь куда важнее - для чего родился..." С.Б. -------------------- И снова мышь беру я в руки Куда иду? - Конечно в сруки! |
|||
|
||||
| Immortal |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 15.8.2003 Репутация: нет Всего: нет |
Ты ошибаешься &-ray Рекурсия успешно обходит 4-х связную область.
Объясню тебе: да рекурсия вызывается сразу как обнаружит вокруг текущей точки хотя бы один 0, но даже если эта ветка не зальёт всю область, то вокруг этой точки будут проверятся оставшиеся 3 точки и если какая-то будет не залита, то будет создана ещё ветка (я поэтому и написал эту тему в форум, так как в каждом вызове функции приходится просматривать четыре точки вокруг текущей). Такой алгоритм зальёт любую 4-х связную область при любой начальной точки (лишь бы точка была внутри области) Только после такой заливки приходится пробегать всё поле (без этого никак) и очищять от 1 и 2, да и рекурсия долгая и требует много памяти. ------ Я был бы благодарен если бы у кого нибудь нашёлся алгоритм, заливающий область имея в распоряжении массив всех вершин (в данном случае всех точек цепи), Причём желательно без необходиимости временного массива (в рекурсии приходится заполнять 1, что бы она не стала бесконечной). Такой алгоритм есть на algolist.manual.ru, но он на C, а я С не знаю. |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 14 Всего: 154 |
Запостите сюда этот код на С, думаю найдутся люди, кому будет не лень перевести. А вообще батенька надо С изучать.....
-------------------- |
|||
|
||||
| Immortal |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 15.8.2003 Репутация: нет Всего: нет |
Ну ладно я хотел по хорошему, а вы сами напросились
Это заливка графической области по пикселям, но ведь что мне мешает использовать вместо пикселей мои точки. И ещё здесь заливается многоугольник если известны его вершины, а у меня изветно не только это, но и координаты кождого граничащего элемента (точки), може это можно использовать для упрощения. Но это не главное, главное переведите кто-нибудь её на Delphi :-( Кстати к ней пралагалась Сортировка методом распределяющего подсчета:
Help me :-) |
||||
|
|||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 8 Всего: 57 |
Вообще, есть замечательная функция FloodFill, она вполне может подойти тебе - если найдёшь её исходники. Она существует с первых версий паскаля и до D7
|
|||
|
||||
| Immortal |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 15.8.2003 Репутация: нет Всего: нет |
Я конечно поищу, но FloodFill функция заливки области то есть во время заливки она будет просматривать соседние пиксели на поиск границы, а выше приведённому исходнику насколько я понял нужен только массив вершин.
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Immortal, может тебе просто твой Enemy под asm переделать ?
Я проверял - ускорение на больших площадях от 3 до 5 раз... -------------------- С уважением, г-н Посол. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |