|
|
||||||
Нарисовать фигуру по характеристической функции16.10.2012, 13:16. Показов 1607. Ответов 6
Метки нет (Все метки)
Добрый день.
У меня есть характеристическая функция некоторой фигуры, выраженная следующим интерфейсом:
Про фигуру известно, что она наверняка ограничена, то есть существуют такие (double xm,double ym), что для любого (double x, double y) при abs(x)>xm && abs(y)>ym выполняется (hi(x,y)==false). Поэтому хотелось бы, чтоб вся фигура умещалась целиком на экране. (xm,ym) нам неизвестны. P.S. я очень прошу помочь мне довести эту задачу до конца, потому что с графикой я не дружу и на примере этой модельной задачи хотел бы устранить свои пробелы. Но мне нужна помощь.
0
|
||||||
| 16.10.2012, 13:16 | |
|
Ответы с готовыми решениями:
6
программа для определения характеристической функции |
|
7 / 2 / 0
Регистрация: 02.08.2012
Сообщений: 17
|
|
| 16.10.2012, 16:41 | |
|
Интересная задача.
На ум приходит только такой алгоритм: выбрать начальную область(можно и точку) если в области нет ни одной точки фигуры, то расширять ее на 1 пиксель пока не встретится хотя бы одна точка после этого продолжать увеличивать размер области до тех пор, пока на границе(или на некотором расстоянии от последней найденной точки) не останется ни одной точки. Конечно есть шанс что часть фигуры останется не отрисована, но тут уж ничего не поделаешь. Данные удобно вначале просто заносить например в Map<Double, Boolean> и только потом выводить на экран.
0
|
|
|
|
||
| 16.10.2012, 17:12 [ТС] | ||
|
В упрощенной постановке мы знаем, где находится фигура и каких размеров она. Поэтому всё сводится к тому, как бы её отрисовать. В первой задаче требуется ещё её локализовать, найти.
Поскольку я не знаю, как вывести на экран эту фигуру, я не знаю, с каким шагом достаточна дескретизация. В случае массива пикселей всё понятно: 1 пиксель = 1 значение, сколько точек на экране отведено, столько пикселей и будет, отсюда получаем шаг (при известной ширине фигуры). Но я не знаю, как всё будет работать. Насколько я знаю, swing-компоненты тягатеют к резиновой верстке, когда практически не реально угадать размеры компонент, определяемые раскладкой (layout). Не уверен, что пересчитывать всё при каждой перерисовке — самая удачная идея. Сейчас я читаю про ImageProducer, Customer и фильтры. Это вроде то, что надо. Единственное реализуемое решение, которое я знаю, заключается в использовании MemoryImageSource, которая позволяет массиву цветов сопоставить изображение, и формированию этого массива по заданной фигуре. Но это, ИМХО, бред. Я так понял, JAVA предоставляет более совершенные и абстрактные инструменты для работы с графикой.
0
|
||
|
7 / 2 / 0
Регистрация: 02.08.2012
Сообщений: 17
|
|
| 17.10.2012, 16:31 | |
|
Да, действительно, описался с Map.
Шаг сетки можно определять динамически(получится достаточно сложно, сходу не могу придумать ничего). Или просто уменьшать вручную после каждого прохода. И я не понимаю зачем нужно пересчитывать все? Данные о найденых точках у нас уже хранятся в мэпе. Можно достаточно простым условием пропускать расчет для этих точек. Кто мешает одновременно с вычислением точек фигуры считать размеры? А отрисовывать компоненты уже после того как все точки найдены? Да, в swing, ЕМНИП, возможно сделать фиксированный layout. Точнее фиксированный размер контейнера, а уже в этом контейнере изменять размер картинки(сделать скролл при превышении размеров). И еще, можно отрисовывать фигуру не точками, а отрезками. Тогда проще будет корректировать шаг сетки в процессе.
1
|
|
|
|
||||
| 18.10.2012, 04:46 [ТС] | ||||
|
Попробую объяснить полностью, что я хочу и что я имею.
Сразу скажу, что этот подход мне не нравится. Он возможен, но он не красив, не понятен. К тому же, я совершенно не уверен, насколько он быстр (по производительность) и универсален (а изменять программу придется часто под нужды глобальной задачи). Сначала отвечу на Ваше, Sworfly, сообщение. Глобальная задача, условие которой я не привожу, не предполагает, что размеры выходного изображения в пикселях можно задавать изнутри программы. Вполне может оказаться, что размер определяется свободной областью на мониторе. Это я говорю сразу, чтоб понятнее было ответы к следующим двум цитатам. Потом меняются параметры: меняется размер 150x150 пикселей и шаг меняем на 0.00667 у.е. на пиксель. Тогда старыми результатами нельзя воспользоваться. Придется пересчитывать всё с нуля. Или такой сценарий: меняется фигура. Например, был круг, а стал квадрат. Перерисовка необходима, пересчет неизбежен.
0
|
||||
|
7 / 2 / 0
Регистрация: 02.08.2012
Сообщений: 17
|
|
| 18.10.2012, 11:19 | |
|
Увы, но другого подхода я не знаю.
Шаг сетки не должен зависеть от параметров устройства вывода. Он должен зависеть только от размеров фигуры. Старые расчеты можно использовать. Зачем сразу переводить точки фиуры в точки на экране? Проще хранить их как они есть и уже при получении всех отрисовывать в нужном масштабе, это позволит вместо вычисления значения параметрической функции при каждом изменении шага сетки/размера изображения вычислять только новые экранные координаты. При изменении фигуры естественно придется все пересчитать. Тому кто сможет этого не делать я премию выпишу большую
1
|
|
|
|
|||||||||||
| 18.10.2012, 12:37 [ТС] | |||||||||||
|
Да, спасибо.
Я действительно долго отпирался, хоть нельзя сдалать по-другому. Последнее: помогите мне нарисовать статичное изображение на фрейме. Есть следующий код: Кликните здесь для просмотра всего текста
Он делает следующее: создаётся окно, на нём появляется на мгновение картинка (как я понимаю, за счёт 92 строки), потом отрисовываются все компоненты и картинка исчезает. После нажатия на кнопку картинка снова появляется (51 строка, mouseClicked). Как сделать так, чтоб она не исчезала, но продолжала отображаться на протяжении всего времени существования компоненты? Второй вопрос: как сделать этот код рабочим и можно ли рисовать на JFrame как на холсте? Кликните здесь для просмотра всего текста
В обоих случаях используется DefaultImageObserver — класс интерфейса, всегда возвращающий true. Благодарен за помощь.
0
|
|||||||||||
| 18.10.2012, 12:37 | |
|
Помогаю со студенческими работами здесь
7
Нарисовать фигуру
Нарисовать фигуру
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|