Как нарисовать квадратную спираль?

126
18 февраля 2019, 22:10

скажите пожалуйста, как можно нарисовать квадратную спираль ? Я сперва пробовал с помощью линий нарисовать, но не совсем получилось, может быть формула для этой фигуры ? На данные момент нарисовал с помощью квадрата, но результат не тот какой нужен.

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Line2D;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Spiral {
    private static JFrame frame;
    private static int x, x2;
    private static int y, y2;
    private static int x1;
    private static int y1;
    private static int n;
    private static int step;
    private static Line2D.Double line = null;
    public Spiral(){
        x = 300;
        y = 200;
        x2 = 400;
        y2 = 200;
        step = 30;
    }
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter number: ");
        n = Integer.parseInt(reader.readLine()) ;
        frame = new JFrame("Spiral");
        frame.setSize(600,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GraphicsComponent gc = new GraphicsComponent();
        frame.add(gc);
        frame.setVisible(true);
    }
    static class GraphicsComponent extends JComponent {
        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            x1 = 250;
            y1 = 50;
            int size = n * n;
            for (int i = 0; i < n; i++) {
                Rectangle rectangle = new Rectangle(x1, y1, size, size);
                size -= 10;
                x1 += 5;
                y1 += 5;
                g2.draw(rectangle);
            }
            /*
            int dir = 0;
            for (int i = 1; i <= 6; i++) {
                if (dir == 0){
                    line = new Line2D.Double(x, y, x2 ,y2);
                    drawLine(g2);
                    dir++;
                }
                else if(dir == 1){
                    x = x2;
                    y = y;
                    x2 = x2;
                    y2 += STEP;
                    line = new Line2D.Double(x, y, x2 ,y2);
                    drawLine(g2);
                    dir++;
                }
                else if(dir == 2){
                    x = y2 + STEP;
                    y = y2;
                    x2 -= 0;
                    y2 = y2;
                    line = new Line2D.Double(x, y, x2 ,y2);
                    drawLine(g2);
                    dir++;
                }
                else if(dir == 3){
                    x = x;
                    y = y;
                    x2 = x;
                    y2 -= STEP;
                    line = new Line2D.Double(x, y, x2 ,y2);
                    drawLine(g2);
                    dir++;
                }
                else if(dir == 4){
                    x = x;
                    y = y;
                    x2 = x;
                    y2 -= STEP;
                    line = new Line2D.Double(x, y, x2 ,y2);
                    drawLine(g2);
                    dir++;
                }
                else if(dir == 5){
                    x = x;
                    y = y2;
                    x2 += STEP;
                    y2 = y;
                    line = new Line2D.Double(x, y, x2 ,y2);
                    drawLine(g2);
                    dir = 1;
                }
            }
            */
        }
    }
    private static void drawLine(Graphics2D g2){
        g2.setColor(Color.RED);
        g2.fill(line);
        g2.draw(line);
    }
}

Answer 1

Рисование линии в Swing позаимствовал здесь , а сам алгоритм не очень сложный: длина стороны спирали dist увеличивается после каждых двух шагов на фиксированную величину step.

    class Success extends JFrame {
        public Success() {
            JPanel panel = new JPanel();
            getContentPane().add(panel);
            setSize(450, 450);
        }
        @Override
        public void paint(Graphics g) {
            super.paint(g);  // fixes the immediate problem.
            Graphics2D g2 = (Graphics2D) g;
            int step = 5; // расстояние между витками
            int dist = step;
            int x = 200, y = 200; // центр
            Line2D lin;
            for (int i = 0; i < 20; i++) {
                // шаг вправо
                lin = new Line2D.Float(x, y, x + dist, y);
                x += dist;
                g2.draw(lin);
                // шаг вверх
                lin = new Line2D.Float(x, y, x, y + dist);
                y += dist;
                g2.draw(lin);
                // увеличиваем длину витка
                dist += step;
                // шаг влево
                lin = new Line2D.Float(x, y, x - dist, y);
                x -= dist;
                g2.draw(lin);
                // шаг вниз
                lin = new Line2D.Float(x, y, x, y - dist);
                y -= dist;
                g2.draw(lin);
                // увеличиваем длину витка
                dist += step;
            }
        }

        public static void main(String[] args) {
            Success s = new Success();
            s.setVisible(true);
        }
    }
READ ALSO
Не меняется значения переменной boolean

Не меняется значения переменной boolean

Решил написать блокнотикДошёл до функции

154
Метод matches строки

Метод matches строки

Есть строка из которой нужно выбрать все слова, которые начинаются с большой буквы и записать в новую строку, а с маленькой также в новую строкуПонимаю,...

165
Кодировки Java при работе с консолью

Кодировки Java при работе с консолью

Моя маленькая программа работает в консоли и читает данные из файла и показывает пользователю условно говоря и при соблюдении некоторых...

139
не работает hover в svg

не работает hover в svg

Добрый день столкнулся с такой проблемой , что hover не работает полноценно в svgПытаюсь менять цвет при наведении на path или класс какой нибудь:

157