1

Тема: Графік Java awt 2d

Створити застосування для відображення графіка функції. x^3 + y^3 - 3axy, a = 2
- Графік відображати в центрі вікна обраним кольором, осі координат відобразити чорним кольором.
- При зміні розміру вікна масштабувати графік, при цьому колір ліній, стиль і товщина не змінюються.
- У лівому куті вікна вивести прізвище автора(Максимчук Іван) і №8.
- При кліку мишкою випадковим чином змінювати колір, стиль і товщину ліній графіка, осі координат залишаються чорними.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GraphApplication extends JFrame {
    private Color graphColor;
    private BasicStroke graphStroke;
    private int graphThickness;

    public GraphApplication() {
        setTitle("Graph Application");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        graphColor = Color.BLUE;
        graphStroke = new BasicStroke(1);
        graphThickness = 1;

        JPanel graphPanel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setColor(graphColor);
                g2d.setStroke(graphStroke);

                int width = getWidth();
                int height = getHeight();
                int centerX = width / 2;
                int centerY = height / 2;

                // Draw x and y axes
                g2d.setColor(Color.BLACK);
                g2d.drawLine(0, centerY, width, centerY);
                g2d.drawLine(centerX, 0, centerX, height);

                // Draw graph function
                for (int x = -centerX; x < centerX; x++) {
                    int y = (int) (Math.pow(x, 3) + Math.pow(centerY, 3) - 3 * 2 * x * centerY);
                    g2d.drawLine(x + centerX, centerY - y, x + centerX, centerY - y);
                }
            }
        };

        add(graphPanel);

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                graphColor = getRandomColor();
                repaint();
            }
        });

        JLabel authorLabel = new JLabel("Варіант ПІБ");
        add(authorLabel, BorderLayout.NORTH);

        setVisible(true);
    }

    private Color getRandomColor() {
        int r = (int) (Math.random() * 256);
        int g = (int) (Math.random() * 256);
        int b = (int) (Math.random() * 256);
        return new Color(r, g, b);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new GraphApplication();
        });
    }
}

Не відображається графік функції. Підкажіть в чому проблема.

2

Re: Графік Java awt 2d

Georgeeee написав:

Створити застосування для відображення графіка функції. x^3 + y^3 - 3axy, a = 2

Це функція як мінімум (x: Q, y: Q) -> (?: Q).
Графік такої функції буде як мінімум 2 вимірна крива поверхня в 3 вимірному просторі.

Georgeeee написав:
        setSize(800, 600);
        // ...
                // Draw graph function
                for (int x = -centerX; x < centerX; x++) {
                    int y = (int) (Math.pow(x, 3) + Math.pow(centerY, 3) - 3 * 2 * x * centerY);
                    g2d.drawLine(x + centerX, centerY - y, x + centerX, centerY - y);
                }

Не відображається графік функції. Підкажіть в чому проблема.

  1. drawLine(x, y, x, y); не буде малювати, бо ти дав координати одної точки (x, y).

  2. На першій ітерації x=-400, centerY=300,
    Math.pow(-400, 3) = -64*10^6
    Math.pow( 300, 3) =  27*10^6
    g2d.drawLine(0, centerY - y, 0, centerY - y);
    питання: Де ця точка на екрані ?

Подякували: Georgeeee1

3

Re: Графік Java awt 2d

декартовий лист
x^3 + y^3 -6axy = 0
Як правильно побудувати графік
Знайшов мало інформації
На вікіпедії пише система
https://uk.wikipedia.org/wiki/%D0%94%D0 … 1%81%D1%82
Виразив переписав
Але малює всерівно криво
Якщо брати більше точок то не видно тієї петлі
Допоміжіть будь ласка розібратися. Впевнений що треба змінити кілька рядків але дойти до цього не можу

package com.example.dv_java;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.util.Random;

public class Main extends Application {
    private static final int VARIANT_NUMBER = 8; // Ваш номер варіанту
    private static final String AUTHOR_NAME = "Максимчук Іван"; // Ваше ім'я

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Графік Декартового листа");

        NumberAxis xAxis = new NumberAxis();
        xAxis.setLabel("X");

        NumberAxis yAxis = new NumberAxis();
        yAxis.setLabel("Y");

        LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);
        lineChart.setCreateSymbols(false);

        double a = 2;
        XYChart.Series<Number, Number> series = new XYChart.Series<>();
        for (double t = -2 * Math.PI; t <= 2 * Math.PI; t += 0.1) {
            double x = (3 * a * t) / (Math.pow(t, 3) + 1);
            double y = (3 * a * Math.pow(t, 2)) / (Math.pow(t, 3) + 1);
            series.getData().add(new XYChart.Data<>(x, y));
        }


        lineChart.getData().add(series);

        Random random = new Random();
        Color randomColor = Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256));
        series.getNode().setStyle("-fx-stroke: " + toRGBCode(randomColor) + "; -fx-stroke-width: 2px;");

        lineChart.setOnMouseClicked(event -> {
            Color newColor = Color.rgb(random.nextInt(256), random.nextInt(256), random.nextInt(256));
            series.getNode().setStyle("-fx-stroke: " + toRGBCode(newColor) + "; -fx-stroke-width: " + (random.nextInt(4) + 1) + "px;");
        });

        BorderPane root = new BorderPane();
        root.setCenter(lineChart);

        javafx.scene.text.Text text = new javafx.scene.text.Text(10, 20, AUTHOR_NAME + ", варіант №" + VARIANT_NUMBER);
        root.getChildren().add(text);

        Scene scene = new Scene(root, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private String toRGBCode(Color color) {
        return String.format("#%02X%02X%02X",
                (int) (color.getRed() * 255),
                (int) (color.getGreen() * 255),
                (int) (color.getBlue() * 255));
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Подякували: leofun011

4

Re: Графік Java awt 2d

Схоже, JavaFX не підтримує нефункціональні графи.
Ось тут є загальні ідеї: https://stackoverflow.com/questions/194 … afx-charts

Подякували: Georgeeee1

5

Re: Графік Java awt 2d

Georgeeee написав:

Виразив переписав
Але малює всерівно криво

LineChart не для того призначений, викинь його.

Georgeeee написав:

Впевнений що треба змінити кілька рядків але дойти до цього не можу

Почни з Canvas.

import javafx.scene.canvas.*;
// ...
Canvas canvas = new Canvas(w, h);
GraphicsContext gc = canvas.getGraphicsContext2D();
Georgeeee написав:
    private static final int VARIANT_NUMBER = #; // Ваш номер варіанту
    private static final String AUTHOR_NAME = "..."; // Ваше ім'я

Світити персональні дані на форумах не обовязково.

Подякували: Georgeeee1

6

Re: Графік Java awt 2d

Або з awt, там теж є Graphics2D і всякі Shape'и на будь-який смак.

+ приклади (текст, en)
Подякували: koala, Georgeeee2