Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24

Нарисовать фигуру по характеристической функции

16.10.2012, 13:16. Показов 1607. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

У меня есть характеристическая функция некоторой фигуры, выраженная следующим интерфейсом:
Java
1
2
3
4
5
6
public interface Fig {
    /**
     * @return true iff a point (x,y) is inside the figure.
     */
    public Boolean hi(double x, double y);
}
Я хочу отобразить это фигуру на экране. Как мне это сделать?
Про фигуру известно, что она наверняка ограничена, то есть существуют такие (double xm,double ym), что для любого (double x, double y) при abs(x)>xm && abs(y)>ym выполняется (hi(x,y)==false). Поэтому хотелось бы, чтоб вся фигура умещалась целиком на экране. (xm,ym) нам неизвестны.

P.S. я очень прошу помочь мне довести эту задачу до конца, потому что с графикой я не дружу и на примере этой модельной задачи хотел бы устранить свои пробелы. Но мне нужна помощь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.10.2012, 13:16
Ответы с готовыми решениями:

Нарисовать фигуру 1, в её середине фигуру 2, в которую вписать текст – свою фамилию и инициалы
срочно нужно написать программу по следующему условию: В заданной части графического экрана нарисовать фигуру 1, в её середине фигуру 2,...

Интеграл в характеристической функции
Добрый день, дамы и господа! Недавно такой вопрос возник. Как решить интеграл: \int_{0}^{1}{e}^{i\zeta x}{x}^{k}dx Пробовал разбить...

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

6
7 / 2 / 0
Регистрация: 02.08.2012
Сообщений: 17
16.10.2012, 16:41
Интересная задача.
На ум приходит только такой алгоритм:
выбрать начальную область(можно и точку)
если в области нет ни одной точки фигуры, то расширять ее на 1 пиксель пока не встретится хотя бы одна точка
после этого продолжать увеличивать размер области до тех пор, пока на границе(или на некотором расстоянии от последней найденной точки) не останется ни одной точки.
Конечно есть шанс что часть фигуры останется не отрисована, но тут уж ничего не поделаешь.
Данные удобно вначале просто заносить например в Map<Double, Boolean> и только потом выводить на экран.
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
16.10.2012, 17:12  [ТС]
В упрощенной постановке мы знаем, где находится фигура и каких размеров она. Поэтому всё сводится к тому, как бы её отрисовать. В первой задаче требуется ещё её локализовать, найти.

Цитата Сообщение от Sworfly Посмотреть сообщение
Данные удобно вначале просто заносить например в Map<Double, Boolean> и только потом выводить на экран.
Тогда лучше Map<Pair<Double,Double>,Boolean>, но Map, насколько мне известно, не позволяет записывать бесконечное число записей (Entry), поэтому в таком представления нам нужно исходно определениться со степенью точности и дискретизовать пространство некоторой сеткой. Теряется общность. Впрочем, общность не теряется, если корректно решена задача о выборе шага сетки.

Поскольку я не знаю, как вывести на экран эту фигуру, я не знаю, с каким шагом достаточна дескретизация. В случае массива пикселей всё понятно: 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
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
18.10.2012, 04:46  [ТС]
Попробую объяснить полностью, что я хочу и что я имею.
Сразу скажу, что этот подход мне не нравится. Он возможен, но он не красив, не понятен. К тому же, я совершенно не уверен, насколько он быстр (по производительность) и универсален (а изменять программу придется часто под нужды глобальной задачи).
Сначала отвечу на Ваше, Sworfly, сообщение.
Глобальная задача, условие которой я не привожу, не предполагает, что размеры выходного изображения в пикселях можно задавать изнутри программы. Вполне может оказаться, что размер определяется свободной областью на мониторе. Это я говорю сразу, чтоб понятнее было ответы к следующим двум цитатам.
Цитата Сообщение от Sworfly Посмотреть сообщение
Шаг сетки можно определять динамически
да, шаг нельзя фиксировать единожды. В моей задаче, где шаг зависит от размеров фигуры и параметров (размером и разрешением) выходного устройства (панели, экрана, на котором фигура отрисуется), требуется изменение шага при уточнении, какую фигуру выводим и куда.
Цитата Сообщение от Sworfly Посмотреть сообщение
И я не понимаю зачем нужно пересчитывать все? Данные о найденых точках у нас уже хранятся в мэпе.
А почему старые рассчёты можно использовать в новых условиях? Пусть была область 100x100 пикселей, размер изображения 1x1 (у.е.). Шаг: 1 пиксель в 0.01 (у.е.). Посчитали, отобразили.
Потом меняются параметры: меняется размер 150x150 пикселей и шаг меняем на 0.00667 у.е. на пиксель. Тогда старыми результатами нельзя воспользоваться. Придется пересчитывать всё с нуля.
Или такой сценарий: меняется фигура. Например, был круг, а стал квадрат. Перерисовка необходима, пересчет неизбежен.
Цитата Сообщение от Sworfly Посмотреть сообщение
И еще, можно отрисовывать фигуру не точками, а отрезками.
Это я не знаю, как сделать.
0
7 / 2 / 0
Регистрация: 02.08.2012
Сообщений: 17
18.10.2012, 11:19
Увы, но другого подхода я не знаю.
Шаг сетки не должен зависеть от параметров устройства вывода. Он должен зависеть только от размеров фигуры.
Старые расчеты можно использовать. Зачем сразу переводить точки фиуры в точки на экране? Проще хранить их как они есть и уже при получении всех отрисовывать в нужном масштабе, это позволит вместо вычисления значения параметрической функции при каждом изменении шага сетки/размера изображения вычислять только новые экранные координаты.
При изменении фигуры естественно придется все пересчитать. Тому кто сможет этого не делать я премию выпишу большую
1
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
18.10.2012, 12:37  [ТС]
Да, спасибо.

Я действительно долго отпирался, хоть нельзя сдалать по-другому.

Последнее: помогите мне нарисовать статичное изображение на фрейме.

Есть следующий код:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package GUI;
 
import javax.swing.*;
import java.awt.event.*;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.image.*;
import java.awt.Image;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
 
public class FrameSet {
 
    private JFrame frame = new JFrame("Clock");
    private JPanel panel = new JPanel(null) {
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            /*
            g.drawImage(createImage(
                new MemoryImageSource(10,10,px,0,10)),0,0,
                new ImageObserver() {
                    @Override
                    public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
                        return false;
                    }
                }
            );
            */
            doAsInDocs(this);
        }
 
        @Override
        public void repaint(long tm, int x, int y, int width, int height) {
            super.repaint(tm, x, y, width, height);
            if(this.getGraphics()==null) System.out.print("Graphics is null. ");
            else doAsInDocs(this);
        }
    };
    private JButton button = new JButton("Draw");
 
    public FrameSet() {
        button.setPreferredSize(new Dimension(200,80));
        panel.setPreferredSize(new Dimension(300,700));
        frame.setLayout(new GridLayout(2,1));
        frame.add(panel, 0);
        frame.add(button,1);
        button.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {
                doAsInDocs(panel);
            }
            public void mousePressed(MouseEvent e) {
            }
            public void mouseReleased(MouseEvent e) {
            }
            public void mouseEntered(MouseEvent e) {
            }
            public void mouseExited(MouseEvent e) {
            }
        });
 
        frame.setVisible(true);
        frame.setSize(200,400);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
 
    /** Snatched from java documentation */
    public static void doAsInDocs(JComponent c) {
        int w = 100;
        int h = 100;
        int pix[] = new int[w * h];
        int index = 0;
        for (int y = 0; y < h; y++) {
            int red = (y * 255) / (h - 1);
            for (int x = 0; x < w; x++) {
                int blue = (x * 255) / (w - 1);
                pix[index++] = (255 << 24) | (red << 16) | blue;
            }
        }
        System.out.print("Setting an image. ");
        Image img = c.createImage(new MemoryImageSource(w, h, pix, 0, w));
        c.getGraphics().drawImage(img, 0, 0,new DefaultImageObserver());
    }
 
    public static void main(String[] args) {
        FrameSet fs = new FrameSet();
        System.out.print("Initialized. ");
        // Arrays.fill(px,0);
        // fs.frame.createImage(new MemoryImageSource(10,10,px,0,10));
 
        doAsInDocs(fs.panel);
    }
 
}

Он делает следующее: создаётся окно, на нём появляется на мгновение картинка (как я понимаю, за счёт 92 строки), потом отрисовываются все компоненты и картинка исчезает. После нажатия на кнопку картинка снова появляется (51 строка, mouseClicked). Как сделать так, чтоб она не исчезала, но продолжала отображаться на протяжении всего времени существования компоненты?

Второй вопрос: как сделать этот код рабочим и можно ли рисовать на JFrame как на холсте?
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package Graphics;
 
import GUI.DefaultImageObserver;
 
import javax.swing.*;
import java.awt.*;
import java.awt.image.ColorModel;
import java.awt.image.MemoryImageSource;
 
public class BtMapTest {
 
    public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        frame.setSize(400, 400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 
        int[] ps = new int[100];
        for(int i=0; i<10; ++i)
            for(int j=0; j<10; ++j)
                ps[i*10+j] = new Color(i,i,i).getRed();
        MemoryImageSource img = new MemoryImageSource(10, 10, ColorModel.getRGBdefault(), ps, 0, 10);
 
        frame.getGraphics().drawImage(frame.createImage(img), 0, 0, new DefaultImageObserver());
 
        JPanel panel = new JPanel();
        frame.add(panel);
        panel.setSize(400,400);
        panel.getGraphics().drawImage(panel.createImage(img), 0, 0, new DefaultImageObserver());
    }
 
}


В обоих случаях используется DefaultImageObserver — класс интерфейса, всегда возвращающий true.

Благодарен за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.10.2012, 12:37
Помогаю со студенческими работами здесь

обобщенная частная производная характеристической функции
Чему равная обобщенная частная производная от характеристической функции: L(t,s) = { 1, t&gt;s { 0, t&lt;=s ...

Нарисовать фигуру
Товарищи, кто знает как реализовать такую фигуру с помощью языков программирования, помогите пожалуйста. Или кто знает куда можно...

Нарисовать фигуру C++
Помогите. Нужно вывести фигуру, размер которой (общее кол-во строчек) будет задаваться в консоли. C++

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

Нарисовать фигуру
Нужно сделать так чтобы при запуске программы появлялась вот такая фигура: ********* *________* *________* *________* *________* ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
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. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru