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

Рисование треугольников используя Graphics2D

04.01.2014, 15:33. Показов 5215. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Нужно написать небольшую программу, которая по трём нажатиям рисует треугольник. А самый большой треугольник выделяется цветов.
Я сделал так. treugs это ArrayList из треугольников. Треугольник - это два массива размера 3.
Сейчас погуглил. Прочитал что нужно переопределять paintComponent. Я его сделал таким:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
        protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        Graphics2D g2 = (Graphics2D) g; 
        for(int y = 0;y<treugs.size();y++){
           if (draw){
              g2.setColor(Color.BLACK);
              g2.drawPolygon(treugs.get(y).getPointX(), treugs.get(y).getPointY(), 3);
           }
        }
        draw = false;
        g2.setColor(Color.RED);
        g2.drawPolygon(b.getPointX(), b.getPointY(), 3);
        g2.setColor(Color.BLACK);
        super.paintComponent(g);
    }
b - это самый большой треугольник. То есть красным должен рисоваться только он. Остальные чёрным. Но почему то все рисуются красным. Хотя после добавления треугольника в массив и поиска самого большого я вызываю repaint();
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2014, 15:33
Ответы с готовыми решениями:

Graphics2D
Подскажите хорошие статьи о графике в Java.Нужно освоить примитивы и с их помощью нарисовать &quot;Шашки&quot;.

Graphics2D
Здравствуйте! Я что-то туплю, но, тем не менее, помогите разобраться! package quadro; import java.awt.Graphics; import...

Из C++ в C#. Рисование треугольников
Help, нужно перевести в C# Windows Forms #include &lt;iostream&gt; using namespace std; int main() { cout&lt;&lt;&quot;Enter number of...

1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
05.01.2014, 01:24
Если не заморачиваться тем, что самый большой треугольник рисуется первым и, как следствие, оказывается в самом низу, а за отсутствием контуров накладывающиеся треугольники сливаются, можно сказать - работает...
Triangle.java
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
package easybudda.bigtriangle;
 
import java.awt.Point;
import java.awt.Graphics;
 
class Triangle implements Comparable<Triangle> {
    private int[] xPoints;
    private int[] yPoints;
    private double square;
    
    Triangle(Point a, Point b, Point c) {
        if ( ( ( a.x == b.x ) && ( b.x == c.x ) ) || ( ( a.y == b.y ) && ( b.y == c.y ) ) )
            throw new IllegalArgumentException();
        
        xPoints = new int[] { a.x, b.x, c.x };
        yPoints = new int[] { a.y, b.y, c.y };
        
        double ab = a.distance(b);
        double bc = b.distance(c);
        double ac = a.distance(c);
        double pp = ( ab + bc + ac ) / 2.0;
        square = Math.sqrt(pp * (pp - ab) * (pp - bc) * (pp - ac));
    }
    
    public double getSquare() {
        return square;
    }
 
    @Override
    public int compareTo(Triangle another) {
        double dif = square - another.getSquare();
        return ( dif > 0 ) ? -1 : 1;
    }
    
    public void paint(Graphics g) {
        g.fillPolygon(xPoints, yPoints, 3);
    }
 
}

PaintPanel.java
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
package easybudda.bigtriangle;
 
import javax.swing.JPanel;
import javax.swing.JOptionPane;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.Point;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.RenderingHints;
import java.util.Set;
import java.util.TreeSet;
import java.util.Iterator;
 
@SuppressWarnings("serial")
class PaintPanel extends JPanel {
    public static final Color BACKGROUND_COLOR = Color.WHITE;
    public static final Color BIGGEST_COLOR = Color.RED;
    public static final Color ORDINAL_COLOR = Color.GREEN;
    public static final Color STROKE_COLOR = Color.BLACK;
    public static final Dimension DEFAULT_SIZE = new Dimension(800, 600);
    
    private Set<Triangle> triangles = new TreeSet<Triangle>();
    private boolean inDrawMode = false;
    private Point[] drawPoints = new Point[3];
    private Point freePoint = new Point();
    private int pointsGrabbed = 0;
    
    PaintPanel() {
        this.setOpaque(true);
        this.setBackground(BACKGROUND_COLOR);
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent clickedEvent) {
                if ( ! inDrawMode ) 
                    inDrawMode = true;
                drawPoints[pointsGrabbed++] = new Point(clickedEvent.getX(), clickedEvent.getY());
                if ( pointsGrabbed == 3 ) {
                    pointsGrabbed = 0;
                    inDrawMode = false;
                    try {
                        Triangle t = new Triangle(drawPoints[0], drawPoints[1], drawPoints[2]);
                        triangles.add(t);
                        repaint();
                    }
                    catch ( IllegalArgumentException iae ) {
                        JOptionPane.showMessageDialog(null, "Points can't be plased at one line", "Error!", JOptionPane.ERROR_MESSAGE);
                        inDrawMode = false;
                        pointsGrabbed = 0;
                        repaint();
                    }
                }
            }
        });
        this.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseMoved(MouseEvent movedEvent) {
                if ( inDrawMode ) {
                    freePoint.setLocation(movedEvent.getX(), movedEvent.getY());
                    repaint();
                }
            }
        });
    }
    
    @Override
    public Dimension getPreferredSize() {
        return DEFAULT_SIZE;
    }
    
    public void clearAll() {
        triangles.clear();
        repaint();
    }
 
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        if ( ! triangles.isEmpty() ) {
            Iterator<Triangle> it = triangles.iterator();
            g.setColor(BIGGEST_COLOR);
            it.next().paint(g);
            g.setColor(ORDINAL_COLOR);
            while ( it.hasNext() )
                it.next().paint(g);
        }
        
        if ( inDrawMode && pointsGrabbed > 0 ) {
            g.setColor(STROKE_COLOR);
            if ( pointsGrabbed == 2 )
                g.drawLine(drawPoints[0].x, drawPoints[0].y, drawPoints[1].x, drawPoints[1].y);
            g.drawLine(drawPoints[pointsGrabbed - 1].x, drawPoints[pointsGrabbed - 1].y, freePoint.x, freePoint.y);
        }
    }
}

MainApp.java
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
package easybudda.bigtriangle;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class MainApp {
    private JFrame mainFrame;
    private PaintPanel paintPanel;
    
    MainApp() {
        mainFrame = new JFrame("Colored Triangles");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        paintPanel = new PaintPanel();
        mainFrame.add(paintPanel, BorderLayout.CENTER);
        
        JButton clearButton = new JButton("Clear all");
        clearButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent pe) {
                paintPanel.clearAll();
            }
        });
        mainFrame.add(clearButton, BorderLayout.SOUTH);
        
        mainFrame.pack();
        mainFrame.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainApp();
            }
        });
    }
}

Картинко
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.01.2014, 01:24
Помогаю со студенческими работами здесь

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

Рисование треугольников
Здравствуйте! C OpenGL я познакомился недавно, такой вопрос glBegin(GL_TRIANGLES); glVertex3f(-0.5f,-0.5f,0.0f); ...

Рекурсивное рисование треугольников
Добрый вечер. Снова с просьбой о помощи Необходимо нарисовать рекурсивно треугольник в треугольнике и т.д. Подскажите, пожалуйста.

Рисование треугольников по координатам
Здравствуйте! Задача состоит в том, чтобы через OpenFileDialog открыть файл с координатами и узлами и по ним нарисовать фигуру, состоящую...

Рисование 4-х треугольников слева направо
:help: есть код #include &lt;iostream.h&gt; #include &lt;conio.h&gt; int main() { char znak='*'; ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru