Вопрос: Привет, я работаю над 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
, чтобы добиться следующего:
CodeDraw myDrawObj = new CodeDraw(400, 400)
, чтобы создать окно рисования.Дополнительные инструкции:
numLinesQuadrant
типа int
, чтобы определить количество строк в квадранте. Расстояние между конечными точками линий на каждой оси должно зависеть от этой переменной. Нет необходимости вводить данные из командной строки.myDrawObj.setColor(Palette.GREEN)
и подобные методы.myDrawObj.setLineWidth(2)
).Кстати, я использую документацию CodeDraw: https://krassnig.github.io/CodeDrawJavaDoc/v4.0.x/codedraw/CodeDraw.html
Я просто не могу найти формулу для равномерного распределения начальной и конечной точек каждой линии вдоль оси. Когда я добавляю больше строк, становится грязно. В каждом квадранте есть 2 типа линий. 2 из 4 координат должны быть гибкими для расчета, две другие могут оставаться прежними. По крайней мере, я так думаю. И чтобы они двигались соответственно и равномерно распределялись, мне нужна надежная формула, которую я по какой-то причине не могу понять.
Вот 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, библиотеки, похожей на 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)));
}
}
Спасибо, теперь я понимаю, как мне это рассчитать. Я реализовал это с помощью CodeDraw, и это сработало.