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

Алгоритм поворота 2д фигуры, swing

04.05.2017, 16:34. Показов 3613. Ответов 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
import javax.swing.*;
import java.awt.*;
 
import static java.lang.Math.pow;
 
public class LineStt {
    public static void main(String[] args) {
        MyJFrame myJFrame = new MyJFrame();
        myJFrame.setTitle("Lab3.Graphics");
        myJFrame.setBounds(45, 45, 600, 600);
        myJFrame.setResizable(false);
        myJFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        myJFrame.setVisible(true);
    }
 
    static class MyJFrame extends JFrame {
        public void paint(Graphics graphics) {
            //Первый треугольник
            int[] ax = {100, 140, 180};
            int[] ab = {190, 130, 190};
            graphics.drawPolygon(ax, ab, 3);
 
            //Вычисляем координаты центра
            int x0 = (ax[0] + ax[1] + ax[2]) / 3;
            int y0 = (ab[0] + ab[1] + ab[2]) / 3;
 
            //Вычисляем расстояние от центра до каждой из вершин
            int R1 = (int) Math.sqrt(pow(ax[0] - x0, 2) + pow(ab[0] - y0, 2));
            int R2 = (int) Math.sqrt(pow(ax[1] - x0, 2) + pow(ab[1] - y0, 2));
            int R3 = (int) Math.sqrt(pow(ax[2] - x0, 2) + pow(ab[2] - y0, 2));
 
            //Вычисляем координаты нового треугольника с градусным смещением( не спрашивайте, почему сделано через одно место)
            int a = (30);
            double x1 = R1 * Math.cos(Math.toRadians(a)) + x0, x2= R2 * Math.cos(Math.toRadians(a)) + x0, x3 = R3 * Math.cos(Math.toRadians(a)) + x0,
                    y1= R1 * Math.sin(Math.toRadians(a)) + y0, y2 = R2 * Math.sin(Math.toRadians(a)) + y0, y3 = R3 * Math.sin(Math.toRadians(a)) + y0;
            int[] bx = {(int) (x1), (int) (x2), (int) (x3)};
            int[] bb = {(int) (y1), (int) (y2), (int) (y3)};
 
            graphics.drawPolygon(bx, bb, 3);
        }
    }
}
Уже несколько часов сижу и не понимаю, почему не переворачивает-то
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.05.2017, 16:34
Ответы с готовыми решениями:

Превращение, масштабирование и поворота фигуры.
Помогите пожалуйста с этим заданием:нужно получить эту фигуру с помощью превращений, масштабирования и поворота. Заранее благодарен

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

Матрица поворота , поворот объёмной фигуры , формула
...Взял из вики формулу , всё чётко выполняется , но есть одна проблема при повороте не по базисным ортам (например при повороте вокруг оси...

4
77 / 77 / 77
Регистрация: 29.01.2017
Сообщений: 167
04.05.2017, 17:23
а если так
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
        public void paint(Graphics graphics) {
            //Первый треугольник
            int[] ax = {100, 140, 180};
            int[] ab = {190, 130, 190};
            graphics.drawPolygon(ax, ab, 3);
 
            //Вычисляем координаты центра
            int x0 = (ax[0] + ax[1] + ax[2]) / 3;
            int y0 = (ab[0] + ab[1] + ab[2]) / 3;
 
            //Вычисляем расстояние от центра до каждой из вершин
            int R1x = (ax[0] - x0), R1y = (ab[0] - y0);
            int R2x = (ax[1] - x0), R2y = (ab[1] - y0);
            int R3x = (ax[2] - x0), R3y = (ab[2] - y0);
//            int R2 = (int) Math.sqrt(pow(ax[1] - x0, 2) + pow(ab[1] - y0, 2));
//            int R3 = (int) Math.sqrt(pow(ax[2] - x0, 2) + pow(ab[2] - y0, 2));
 
            //Вычисляем координаты нового треугольника с градусным смещением( не спрашивайте, почему сделано через одно место)
            int a = (30);
            double x1 = R1x * Math.cos(Math.toRadians(a)) + x0, x2 = R2x * Math.cos(Math.toRadians(a)) + x0, x3 = R3x * Math.cos(Math.toRadians(a)) + x0,
                    y1 = R1y * Math.sin(Math.toRadians(a)) + y0, y2 = R2y * Math.sin(Math.toRadians(a)) + y0, y3 = R3y * Math.sin(Math.toRadians(a)) + y0;
            int[] bx = {(int) (x1), (int) (x2), (int) (x3)};
            int[] bb = {(int) (y1), (int) (y2), (int) (y3)};
 
            graphics.drawPolygon(bx, bb, 3);
        }
0
0 / 0 / 2
Регистрация: 12.02.2016
Сообщений: 59
04.05.2017, 17:31  [ТС]
Второй треугольник появляется, но он не поворачивается, почему-то, а ведет себя как-то странно)
0
77 / 77 / 77
Регистрация: 29.01.2017
Сообщений: 167
04.05.2017, 17:52
Лучший ответ Сообщение было отмечено supercep как решение

Решение

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
        public void paint(Graphics graphics) {
            //Первый треугольник
            int[] ax = {100, 140, 180};
            int[] ab = {190, 130, 190};
            graphics.drawPolygon(ax, ab, 3);
 
            //Вычисляем координаты центра
            int x0 = (ax[0] + ax[1] + ax[2]) / 3;
            int y0 = (ab[0] + ab[1] + ab[2]) / 3;
 
            //Вычисляем расстояние от центра до каждой из вершин
            int R1x = (ax[0] - x0), R1y = (y0 - ab[0]);
            int R2x = (ax[1] - x0), R2y = (y0 - ab[1]);
            int R3x = (ax[2] - x0), R3y = (y0 - ab[2]);
 
            //Вычисляем координаты нового треугольника с градусным смещением( не спрашивайте, почему сделано через одно место)
            double a = Math.toRadians(30);
            double cosA = Math.cos(a), sinA = Math.sin(a);
            double x1 = R1x * cosA + R1y * sinA + x0,  y1 = R1y * cosA - R1x * sinA + y0,
                    x2 = R2x * cosA + R2y * sinA + x0, y2 = R2y * cosA - R2x * sinA + y0,
                    x3 = R3x * cosA + R3y * sinA + x0, y3 = R3y * cosA - R3x * sinA + y0;
 
            int[] bx = {(int) (x1), (int) (x2), (int) (x3)};
            int[] bb = {(int) (y1), (int) (y2), (int) (y3)};
 
            graphics.drawPolygon(bx, bb, 3);
        }
1
0 / 0 / 2
Регистрация: 12.02.2016
Сообщений: 59
04.05.2017, 18:07  [ТС]
ОГОООО, спасибо огромное!!))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.05.2017, 18:07
Помогаю со студенческими работами здесь

Надо найти площадь фигуры над и под дугой с помощью ИНТЕГРАЛОВ, и поворота осей
У декартовій площині задано відрізок прямої із кординатами дуги кола, із координатами кінців і координатами центра кола до якого належить...

Алгоритм поворота изображения
Добрый день! Нашел алгоритм поворота изображения, на одном из ресурсов. С некоторыми моментами разобрался, но не до конца. Помогите,...

Алгоритм поворота изображения
Есть картинка, такого вида: ,они могут быть разными, то наклон в одну сторону то в другую, Приблизительно от -20 до 20(может от -30 до 30,...

Составить алгоритм и программу для поворота объекта вокруг вертикальной оси 0Z
Составить алгоритм и программу для поворота объекта вокруг вертикальной оси ОZ

После поворота TextView занимает столько же места как и до поворота
собственно как поворачивать средствами xml или в коде я знаю. Проблема в другом при повороте textview по горизонтали он занимает место как...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru