Java: формула равномерного распределения строк в зависимости от количества добавленных строк в 4 квадрантах

Вопрос: Привет, я работаю над Java-кодом для создания своего рода параболической звезды, состоящей из прямых линий на холсте размером 400x400. Кто-нибудь может мне помочь? Вот как должен выглядеть этот график, ниже я предоставлю вам код, который у меня есть на данный момент: График со значениями: а) numLinesQuadrant = 2, б) numLinesQuadrant = 5, в) numLinesQuadrant = 11, г) numLinesQuadrant = 21

Мой Java-код: импортировать codedraw.CodeDraw; импортировать codedraw.Palette;

общественный класс TryOutTwo { public static void main(String[] args) {

    CodeDraw myDrawObj = new CodeDraw(400,  400);
    //add range?
    int numlinesQuadrant = 2;
    int xSpacing = 200 / (numlinesQuadrant);
    int ySpacing = 200 / (numlinesQuadrant);

    for (int i = 0; i < numlinesQuadrant; i++) {
        boolean isEven = (i % 2 == 0);
                int startX = 200 + (i * xSpacing);
                int startY = 200 + (i * ySpacing);
                int endX = 200 - (i * xSpacing);
                int endY = 200 + (i * ySpacing);
                myDrawObj.setColor(Palette.GREEN);
                if (isEven) {
                    myDrawObj.drawLine(200, startY, endX, 200);
                } else {
                    myDrawObj.drawLine(startX, 200, 200, endY);
                }
                int startX2 = 200 + (i * xSpacing);
                int startY2 = 200 + (i * ySpacing);
                int endX2 = 200 + (i * xSpacing);
                int endY2 = 200 + (i * ySpacing);
                myDrawObj.setColor(Palette.CYAN);
                if (isEven) {
                    myDrawObj.drawLine(200, startY2, endX2, 200);
                } else {
                    myDrawObj.drawLine(endX2,200,200,endY2);
                    }
                int startX3 = 200 - (i * xSpacing);
                int startY3 = 200 - (i * ySpacing);
                int endX3 = 200 - (i * xSpacing);
                int endY3 = 200 - (i * ySpacing);
                myDrawObj.setColor(Palette.ORANGE);
                if (isEven) {
                    myDrawObj.drawLine(200, startY3, endX3, 200);
                } else {
                    myDrawObj.drawLine(startX3, 200, 200, endY3);
                }
                int startX4 = 200 + (i * xSpacing);
                int startY4 = 200 - (i * ySpacing);
                int endX4 = 200 + (i * xSpacing);
                int endY4 = 200 - (i * ySpacing);
                myDrawObj.setColor(Palette.MAGENTA);
                if (isEven) {
                    myDrawObj.drawLine(200, startY4, endX4, 200);
                } else {
                    myDrawObj.drawLine(startX4, 200, 200, endY4);
                }
        }

    myDrawObj.setColor(Palette.BLACK);
    myDrawObj.setLineWidth(2);
    myDrawObj.drawLine(0, 200, 400, 200);
    myDrawObj.drawLine(200, 0, 200, 400);

    myDrawObj.show();
}

}

Кроме того, вот мое описание задачи, если это поможет: Вот что мне нужно сделать:

  • Измените метод main, чтобы добиться следующего:

    • Создайте изображения, подобные тем, что на рисунках. При каждом запуске программы должно создаваться одно изображение.
    • Изображения должны иметь размер 400×400 пикселей с точкой P (x = 0, y = 0), расположенной в верхнем левом углу. Используйте CodeDraw myDrawObj = new CodeDraw(400, 400), чтобы создать окно рисования.
  • Дополнительные инструкции:

    • Введите переменную numLinesQuadrant типа int, чтобы определить количество строк в квадранте. Расстояние между конечными точками линий на каждой оси должно зависеть от этой переменной. Нет необходимости вводить данные из командной строки.
    • Используйте один цикл, чтобы нарисовать все изображение.
    • Установите цвет рисунка на ЗЕЛЕНЫЙ, ГОЛУБОЙ, ПУРПУРНЫЙ или ОРАНЖЕВЫЙ, используя myDrawObj.setColor(Palette.GREEN) и подобные методы.
    • После цикла нарисуйте черные горизонтальную и вертикальную линии в центре изображения толщиной 2 пикселя (myDrawObj.setLineWidth(2)).
  • Кстати, я использую документацию CodeDraw: https://krassnig.github.io/CodeDrawJavaDoc/v4.0.x/codedraw/CodeDraw.html

Я просто не могу найти формулу для равномерного распределения начальной и конечной точек каждой линии вдоль оси. Когда я добавляю больше строк, становится грязно. В каждом квадранте есть 2 типа линий. 2 из 4 координат должны быть гибкими для расчета, две другие могут оставаться прежними. По крайней мере, я так думаю. И чтобы они двигались соответственно и равномерно распределялись, мне нужна надежная формула, которую я по какой-то причине не могу понять.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот JavaFX версия.

Ключевым моментом является пропорциональное перемещение линий. По сути, длины линий одинаковы, но их положение по осям x и y разное.

ПопробуйтеloopMax=3,loopMax=6,loopMax=12 иloopMax=24.

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
 
public class App extends Application {
 
    double viewWidth = 500.0;
    double viewHeight = 500.0;
    double minX = 0.0;
    double midX = viewWidth / 2.0;
    double maxX = viewWidth;
    double minY = 0;
    double midY = viewHeight / 2.0;
    double maxY = viewHeight;
    double loopMax = 24.0;
    
    
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Drawing Operations Test");
        Group root = new Group();
        Canvas canvas = new Canvas(viewWidth, viewHeight);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        
        root.getChildren().add(canvas);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
        
        drawAxisX(gc);
        drawAxisY(gc);
        double fraction = 0;
        for(int i = 1; i <= loopMax ; i++)
        {
            drawShape(gc, fraction);
            System.out.println(fraction);
            fraction = i / loopMax;
        }
        
    }

    private void drawAxisX(GraphicsContext gc) {
        gc.setFill(Color.BLACK);
        gc.setStroke(Color.BLACK);
        gc.setLineWidth(5);
        gc.strokeLine(minX, midY, maxX, midY);        
    }
    
     private void drawAxisY(GraphicsContext gc) {
        gc.setFill(Color.BLACK);
        gc.setStroke(Color.BLACK);
        gc.setLineWidth(5);
        gc.strokeLine(midX, minY, midX, maxY);        
    }
     
     private void drawShape(GraphicsContext gc,double fraction)
     {
        gc.setFill(Color.GREEN);
        gc.setStroke(Color.GREEN);
        gc.setLineWidth(1);
        gc.strokeLine(minX + (midX * fraction), midY, midX, minY + (midY * (1 - fraction))); //upper /
        
        
        gc.setFill(Color.ORANGE);
        gc.setStroke(Color.ORANGE);
        gc.strokeLine(minX + (midX * fraction), midY, midX, maxY - (midY * (1 - fraction)));
        
        gc.setFill(Color.VIOLET);
        gc.setStroke(Color.VIOLET);
        gc.strokeLine(maxX - (midX * fraction), midY, midX, maxY - (midY * (1 - fraction)));
        
        gc.setFill(Color.CYAN);
        gc.setStroke(Color.CYAN);
        gc.strokeLine(maxX - (midX * fraction), midY, midX, minY + (midY * (1 - fraction)));        
     }
}

Выход

Спасибо, теперь я понимаю, как мне это рассчитать. Я реализовал это с помощью CodeDraw, и это сработало.

Kaizen985 06.04.2024 18:08

Напишите свой ответ и примите его.

SedJ601 06.04.2024 23:00

Мне удалось реализовать решение с помощью CodeDraw, библиотеки, похожей на JavaFX. Ниже приведен модифицированный код. Я внес небольшую корректировку в код, увеличив numLinesQuadrant с помощью NUM_LINES_INCREMENT. Это гарантирует, что количество нарисованных линий соответствует предполагаемому значению, хранящемуся в numLinesQuadrant.

import codedraw.CodeDraw;
import codedraw.Palette;

public class ParabolicStar {

    static final double CANVAS_HEIGHT = 400.0;
    static final double CANVAS_WIDTH = 400.0;
    static final double MID_X = CANVAS_WIDTH / 2;
    static final double MID_Y = CANVAS_HEIGHT / 2;
    static final double MIN_X = 0.0;
    static final double MAX_X = CANVAS_WIDTH;
    static final double MIN_Y = 0.0;
    static final double MAX_Y = CANVAS_HEIGHT;
    static final double NUM_LINES_INCREMENT = 1.0;

    public static void main(String[] args) {
        CodeDraw myDrawObj = new CodeDraw(400, 400);
        double numLinesQuadrant = 10.0;

        double fraction = 0.0;
        numLinesQuadrant += NUM_LINES_INCREMENT;
        for (int i = 0; i <= numLinesQuadrant; i++) {
            drawShape(myDrawObj, fraction);
            fraction = i / numLinesQuadrant;
        }
        drawAxisX(myDrawObj);
        drawAxisY(myDrawObj);

        myDrawObj.show();
    }

    private static void drawAxisX(CodeDraw myDrawObj) {
        myDrawObj.setLineWidth(2);
        myDrawObj.setColor(Palette.BLACK);
        myDrawObj.drawLine(MIN_X, MID_Y, MAX_X, MID_Y);
    }

    private static void drawAxisY(CodeDraw myDrawObj) {
        myDrawObj.setLineWidth(2);
        myDrawObj.setColor(Palette.BLACK);
        myDrawObj.drawLine(MID_X, MIN_Y, MID_X, MAX_Y);
    }

    private static void drawShape(CodeDraw myDrawObj, double fraction) {
        myDrawObj.setLineWidth(1);

        myDrawObj.setColor(Palette.GREEN);
        myDrawObj.drawLine(MIN_X + (MID_X * fraction), MID_Y, MID_X, MIN_Y + (MID_Y * (1 - fraction)));

        myDrawObj.setColor(Palette.ORANGE);
        myDrawObj.drawLine(MIN_X + (MID_X * fraction), MID_Y, MID_X, MAX_Y - (MID_Y * (1 - fraction)));

        myDrawObj.setColor(Palette.MAGENTA);
        myDrawObj.drawLine(MAX_X - (MID_X * fraction), MID_Y, MID_X, MAX_Y - (MID_Y * (1 - fraction)));

        myDrawObj.setColor(Palette.CYAN);
        myDrawObj.drawLine(MAX_X - (MID_X * fraction), MID_Y, MID_X, MIN_Y + (MID_Y * (1 - fraction)));
    }
}

Другие вопросы по теме