Часть задачи, которую я выполняю, требует, чтобы я провел линию между двумя точками на основе заданной строки и столбца.Моя проблема в том, что для квадрата 3x3 он отлично проведет линию для столбца 0, строки 0. Однако, когда я создаю квадрат 5x5, он находится в неправильном положении.
В обоих примерах, показанных ниже, линия рисуется в столбце 0, строке 0. Обратите внимание, что изображения относительно большие, поэтому, вероятно, было бы лучше не встраивать их.
*Пример 1005 * 5x5
3x3 Пример
Я использую Swing, а сигнатура метода drawRectangle - (x1, y1, x2, y2).В этом случае 'r' представляет строку, а 'c' представляет значение столбца, указанное в аргументах.
import java.awt.*;
import javax.swing.*;
public class SwingMain extends JPanel {
final static int SEPARATION = 200;
final static int DIAMETER = 25;
final static int NBALLS = 4;
final static int WIDTH = NBALLS * 250;
final static int HEIGHT = NBALLS * 250;
final static int XSTART = WIDTH / (NBALLS + 2);
final static int YSTART = HEIGHT / (NBALLS + 2);
JFrame frame = new JFrame();
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new SwingMain().start());
}
public void start() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(WIDTH, HEIGHT));
frame.add(this);
setBackground(Color.BLACK);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.white);
int y = YSTART;
for (int r = 0; r < NBALLS; r++) {
int x = XSTART;
for (int c = 0; c < NBALLS; c++) {
g2d.fillOval(x, y, DIAMETER, DIAMETER);
x += SEPARATION;
}
y += SEPARATION;
}
drawHorizontalLine(g2d, 0, 0);
}
public void drawHorizontalLine(Graphics2D g, int r, int c) {
drawRectangle(g, 175 * (c + 1), 155 * (r + 1), 375 * (c + 1), 175 * (r + 1), Color.WHITE);
}
public void drawRectangle(Graphics2D graphic, int x1, int y1, int x2, int y2, Color c) {
graphic.fillRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
}
}
Я считаю, что проблема связана с магическими числами, которые я вставил дляDrawRectangle.Скорее, я должен также включить ширину и высоту окна.Но я просто полностью потерялся.Ширина окна основана на (n * 250), где n обозначает количество точек.Так, в примере 5x5 n = 6, тогда как в 3x3 - n = 4. Кроме того, если кто-то может подсказать, как добавить отступы во внешнюю область кругов, которая является четной.В настоящее время моя формула ширины и высоты окна довольно ужасна.
Кроме того, довольно бессмысленная формула работает только для столбца 0, строки 0. Поэтому, если я попытаюсь нарисовать линию в столбце 0, строка 2 будетпоказано ниже.
Строка 2, столбец 0 Пример