Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 52

Изобразить отрезок, вращающийся в плоскости фрейма вокруг точки, движущейся по отрезку (оптимизация)

04.09.2015, 16:37. Показов 5987. Ответов 2
Метки нет (Все метки)

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

есть код

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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
 
/**
 * Задача 4. Изобразить в окне приложения (апплета) отрезок, вращающийся в
 * плоскости фрейма вокруг точки движущейся по отрезку.
 */
public class LB4 extends java.applet.Applet implements Runnable {
 
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int w, h;
    private BufferedImage bi;
    private Graphics2D big;
    private boolean stop = false;
    private Thread timer = null;
 
    private Color fonColor = Color.WHITE;
    private Color segmentColor = Color.LIGHT_GRAY;
    private Color pointColor = Color.GREEN;
    private Segment segment;
 
    // начальное расположение рисунка
    private double lengthSegment;
 
    // направление смещения оси вращения
    private double movePoint = -1;
    private double shift = 0;
    private double speedPoint = 1;
 
    // скорость изменения положения в пространстве
    private int speedRepaint = 30;
 
    // угол на который происходит изменения положения отрезка
    private int grad = 15;
 
    /** Этот метод будет вызван после загрузки апплета */
    public void init() {
        try {
            // Создаем объекты и устанавливаем начальные значения.
            Dimension dim = getSize();
            w = dim.width;
            h = dim.height;
 
            // Создаем Segment, задавая длину
            lengthSegment = (double) Math.min(w, h) / 3;
            segment = new Segment(lengthSegment, lengthSegment / 2, grad,
                    segmentColor, pointColor, fonColor);
 
            bi = (BufferedImage) createImage(w, h);
            big = bi.createGraphics();
            big.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
 
            // Создаем поток, который будет периодически вызывать метод update.
            timer = new Thread(this);
            timer.start();
        } catch (Exception e) {
            System.out.println(e);
        }
    } // end init
 
    // Этот метод выполняет перерисовку окна апплета
    public void update(Graphics g) {
 
        try {
            // Получаем указатель на объект Graphics2D
            Graphics2D g2 = (Graphics2D) g;
            grawSegment();
 
            // Рисуем готовое изображение на экране
            g2.drawImage(bi, 0, 0, this);
 
        } catch (Exception error) {
            System.out.println(error.getMessage());
        }
    } // end update
 
    private void grawSegment() {
 
        /*
         * //Очищаем рисунок big.setBackground(Color.BLUE); big.clearRect(0, 0,
         * w, h);
         */
        // Рисуем отрезок
 
        shift += movePoint * speedPoint;
        if (shift < -lengthSegment / 2) {
            movePoint *= -1;
            shift = -lengthSegment / 2;
        } else if (shift > lengthSegment / 2) {
            movePoint *= -1;
            shift = lengthSegment / 2;
        }
        segment.setPos(shift, speedPoint);
        segment.rotate();
        big.drawImage(segment.getSegment(), null, 0, 0);
    }
 
    // Этот метод выполняется в отдельном потоке (timer).
    // Он вызывает перерисовку окна апплета каждую секунду.
    public void run() {
        while (!stop) {
            try {
                repaint();
                Thread.currentThread();
                Thread.sleep(speedRepaint);
            } catch (Exception err) {
            }
        }
    }
 
    // Этот метод выполняется если пользователь покинул страницу
    // с апплетом. Он останавливает поток (timer) и, соответственно,
    // перерисовку окна апплета.
    public void stop() {
        super.stop();
        stop = true;
    }
 
    // Этот метод выполняется когда пользователь попадает на страницу
    // с апплетом. Он запускает парралельный поток (timer).
    public void start() {
        super.start();
        stop = false;
        if (timer == null) {
            timer = new Thread(this);
            timer.start();
        }
 
    } // end start
 
    // Этот метод выполняется при закрытии страницы с апплетом.
    public void destroy() {
        super.destroy();
        stop = true;
        Thread.currentThread();
        // Ждем пока парралельный поток (timer) завершит работу.
        Thread.yield();
    } // end destroy
} // end public class RotatingSegment
 
// создание отрезка
class Segment {
    private static double x = 0;
    final double RAD = 10;
    private double length;
    private BufferedImage segment;
    private Color segmentColor;
    private Color pointColor;
    private Color backGroundColor;
 
    private Rectangle2D.Double r;
    private Ellipse2D.Double p;
    private double rotationAxis;
 
    private Point2D.Double center;
    private double shift;
    // угол на который происходит изменения положения отрезка
    private int grad;
 
    Segment(double length, double posPointRotating, int grad,
            Color segmentColor, Color pointColor, Color backGroundColor)
            throws Exception {
        // проверяем параметры
        if (length <= 0 || posPointRotating < 0 || length < posPointRotating)
            throw new Exception(
                    "Ошибка: неверно задан параметр в классе Segment");
 
        this.grad = grad;
        this.segmentColor = segmentColor;
        this.pointColor = pointColor;
        this.backGroundColor = backGroundColor;
        this.length = length;
        // создаем рисунок
        segment = new BufferedImage((int) length * 3, (int) length * 3,
                BufferedImage.TYPE_INT_ARGB);
 
        center = new Point2D.Double(length, 3 * length / 2);
        // создаем отрезок
        rotationAxis = center.x + posPointRotating - RAD / 2;
        r = new Rectangle2D.Double(center.x, center.y, length, RAD);
        p = new Ellipse2D.Double(rotationAxis, center.y, RAD, RAD);
 
        // получаем графический контекст
        Graphics2D g2 = segment.createGraphics();
 
        // закрашиваем все заданным цветом
        g2.setBackground(backGroundColor);
        g2.clearRect(0, 0, (int) (3 * length), (int) (3 * length));
 
        // устанавливаем цвет отрезка
        g2.setColor(segmentColor);
        // рисуем отрезок
        g2.fill(r);
        // устанавливаем цвет точки
        g2.setColor(pointColor);
        // рисуем точку
        g2.fill(p);
    }
 
    // смещает точку вращения
    public void setPos(double shiftX, double shiftY) {
 
        // создаем отрезок
        this.shift = shiftX;
        center.y = center.y + shiftY * Math.sin(Math.toRadians(grad * x));
        r = new Rectangle2D.Double(center.x, center.y, length, RAD);
        p = new Ellipse2D.Double(rotationAxis + shift, center.y, RAD, RAD);
    }
 
    // вращает отрезок
    public void rotate() {
        AffineTransform at = AffineTransform.getRotateInstance(
                Math.toRadians(grad * (++x)), rotationAxis + RAD / 2 + shift,
                center.y);
 
        // получаем графический контекст
        Graphics2D g2 = segment.createGraphics();
 
        // закрашиваем все заданным цветом
        g2.setBackground(backGroundColor);
        g2.clearRect(0, 0, (int) (3 * length), (int) (3 * length));
 
        g2.setTransform(at);
        g2.setColor(segmentColor);
        // рисуем отрезок
        g2.fill(r);
        // устанавливаем цвет точки
        g2.setColor(pointColor);
        // рисуем точку
        g2.fill(p);
 
    }
 
    // Возвращает изображение
    public BufferedImage getSegment() {
        return segment;
    }
}
задача, разобрать весь код по строчке (прокоментировать) , что бы понять не просто что делают те или иные куски кода,но и те или иные методы и функции, а еще лучше оптимизировать код до минимума...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2015, 16:37
Ответы с готовыми решениями:

Изобразить в окне приложения отрезок, вращающийся в плоскости экрана
Ребята подскажите. &quot;Нужно изобразить в окне приложения отрезок, вращающийся в плоскости экрана. Цвет прямой должен изменяться при...

Изобразить разносторонний треугольник, вращающийся в плоскости апплета вокруг своего центра тяжести
вот условие: Изобразить разносторонний треугольник, вращающийся в плоскости апплета вокруг своего центра тяжести. Вот то что у меня...

Изобразить отрезок, вращающийся в плоскости фрейма вокруг точки, движущейся по отрезку
Парни выручайте, нужно сделать задание на JAVA. Нашел код задания на этом форуме. Создаю новый проект в NetBeans IDE 8.1 вставляю...

2
61 / 61 / 15
Регистрация: 18.05.2015
Сообщений: 322
04.09.2015, 16:41
Там и так каждая строка прокомментирована. Если что-то непонятно, можно поискать в Google справку по конкретному методу.
0
1 / 1 / 1
Регистрация: 27.03.2014
Сообщений: 52
04.09.2015, 16:44  [ТС]
klopik, скажите, а можно сократить этот код?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.09.2015, 16:44
Помогаю со студенческими работами здесь

Изобразить на экране отрезок, вращающийся в плоскости экрана вокруг точки, делящей отрезок в отношении 1:3
Изобразить на экране отрезок, вращающийся в плоскости экрана вокруг точки, делящей отрезок в отношении 1:3. P.S.В задаче должны...

Изобразить отрезок, вращающийся вокруг точки
Изобразить на экране отрезок, вращающийся в плоскости экрана вокруг точки, делящей отрезок в отношении 1:3.

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

Изобразить на экране отрезок, вращающийся в плоскости экрана вокруг своей середины
Изобразить на экране отрезок, вращающийся в плоскости экрана вокруг своей середины.

Изобразить на экране отрезок, вращающийся в плоскости экрана вокруг своего конца
Всем буду презнателен за помощь! Нужно 1) Построить семейство кривых y = f(x) для указанных значений параметра...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru