Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 3

Рисование графиков java

09.12.2012, 15:38. Показов 4687. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые друзья! Вопрос вот в чем. Имеется следующий код для построения графиков функции:
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
96
97
98
99
100
101
102
103
104
105
106
107
108
import javax.swing.*;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.geom.*;
 
 
@SuppressWarnings("serial")
class GraphicFrame extends JFrame {
    public GraphicFrame () {
    super();
    setTitle("GraphicBuilder");
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setSize(1000, 1000);
    this.setResizable(false);
    setDefaultLookAndFeelDecorated(true);
    this.setPreferredSize(new Dimension(1200, 700));
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = getPreferredSize();
        if (frameSize.height > screenSize.height) {
           frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
           frameSize.width = screenSize.width;
        }
 setLocation((screenSize.width-frameSize.width) / 2,
(screenSize.height-frameSize.height) / 2);
    pack();
    JPanel panel=new DrawPanel();
    add(panel);
    setVisible(true);
    }
}
 @SuppressWarnings("serial")
class DrawPanel extends JPanel { 
    Rectangle2D rect;
    public DrawPanel() {
    this.rect=new Rectangle2D.Double(300,90,550,550);   
    }
    public void paintComponent (Graphics g) {
    Graphics2D g2=(Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setColor(Color.BLACK);
    g2.clip(rect);
    // Axis X
    double leftBoundX=-10;
    double rightBoundX=10;
    double stepX=(rightBoundX-leftBoundX)/rect.getWidth(); //1 pt=stepX sm
 
    // Axis Y
    double leftBoundY=-10;
    double rightBoundY=10;
    double stepY=(rightBoundY-leftBoundY)/rect.getHeight(); // 1 pt=stepY sm
    
    // drawing Axis X 
    double zeroPlaceY=-leftBoundY; //sm
    double zeroPlacePtY=zeroPlaceY/stepY;
    g2.drawLine((int)rect.getMinX(),(int)(rect.getMaxY()-zeroPlacePtY),(int)rect.getMaxX(),(int)(rect.getMaxY()-zeroPlacePtY));
    
    // drawing Axis Y
    double zeroPlaceX=-leftBoundX;
    double zeroPlacePtX=zeroPlaceX/stepX;
    g2.drawLine((int)(rect.getMinX()+zeroPlacePtX),(int)rect.getMinY(),(int)(rect.getMinX()+zeroPlacePtX),(int)rect.getMaxY());
    
    // drawing function
    g2.setColor(Color.RED);
    double x=leftBoundX;
    double pointX1=0;
    double pointY1=0;
    boolean flag=false;
    for (double i=rect.getMinX(); i<=rect.getMaxX(); i++) {
    double y=1/x;     // function 
    if (Double.isNaN(y) || Double.isInfinite(y)) {
    x+=stepX;
    flag=true;
    continue;
    }
    double removal=y-leftBoundY;
    double pointY=rect.getMaxY()-removal/stepY; //pixelY
    if (flag) {
    pointX1=i;
    pointY1=pointY;
    flag=false;
    continue;
    }
    x+=stepX;
    if (i==rect.getMinX()) {
    pointX1=rect.getMinX();
    pointY1=pointY;
    continue;
    }
    g2.drawLine((int)pointX1, (int)pointY1, (int)i, (int)pointY);
    pointX1=i;
    pointY1=pointY;
    }
    }
 }
 
public class GraphicBuilder {
    public static void main (String[] args) {
    @SuppressWarnings("unused")
    JFrame frame=new GraphicFrame();
    }
}
Графики рисуются нормально, все рассчитывается до единого пикселя, но проблема в том, что при очень точных значениях Х может построиться левая фигня вместе с основным графиком и на разных экранах по своему проявляется эта проблема. Также это всё зависит от заданных диапазонов. Скажите пожалуйста, как можно устранить эту проблему, чтобы всё везде отображалось одинаково.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.12.2012, 15:38
Ответы с готовыми решениями:

Рисование графиков
Здравствуйте, уважаемые программисты. Есть задачка: Создать класс, который выводит окно, и рисует график по точкам, интерактивно...

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

Создание графиков с помощью Java
Мне нужно сделать апплет, который бы создавал графики из данных которые лежат в файле. Но тут я столкнулся с большой проблемой! Чтобы...

4
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
10.12.2012, 15:15
Покажите скриншот, выложите проблемный код. Приведенный код плохо работает?
1
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 3
10.12.2012, 20:46  [ТС]
я вроде понял в чём смысл. Некоторые графики такие как 1/х состоят из нескольких частей, а при рисовании линии каждая точка соединяется с последующей. Может получиться нормально, например
а может и нет

т.е. конец первого графика соединяется с началом второго.
Непрерывные графики строятся нормально
0
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 13
15.05.2013, 12:15
а как нарисовать к примеру такие функции: x''+Sinx=0
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
15.05.2013, 15:00
Цитата Сообщение от Вадим2011 Посмотреть сообщение
я вроде понял в чём смысл. Некоторые графики такие как 1/х состоят из нескольких частей, а при рисовании линии каждая точка соединяется с последующей. Может получиться нормально, например
а может и нет

т.е. конец первого графика соединяется с началом второго.
Непрерывные графики строятся нормально
Тогда определяйте точки разрыва и на каждом отрезке стройте непрерывную кривую
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2013, 15:00
Помогаю со студенческими работами здесь

Рисование в Java
Если нарисовать линию с помощью graphics2D.drawLine(oldX, oldX, oldX, oldX); Как ею можно манипулировать?

Рисование в Java
Здравствуйте подкажите пожалуйста как написать в одном проекте чтоб в одном окне отобразить и 2 квадрата и кнопку, а то у меня получается...

Рисование в java
Учусь прогать в Java, хочу нарисовать квадрат в окне GUI, но как-то не очень рисуется, не могли бы вы указать на ошибки? Спасибо. /* ...

Простой построитель графиков Java [Swing]
Написал графический редактор, стоящий и изменяющий сплайны в режиме реального времени на основе библиотеки JFreeChart. Не устраивает время...

Графика в java: вывод графиков в Swing
Практикуюсь с графикой в java. Если конкретно, то пытаюсь нарисовать графики функций. Решил логически в коде отделить рисование осей...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru