Curba Dragonului

Se trasează (începe) cu un segment de dreaptă. La prima iterație, se înlocuiește acest segment cu alte două segmente, în așa fel încât segmentul original să fie ipotenuza unui triunghi isoscel. De-a lungul segmentului original, trasăm (punem) cele două segmente noi spre stânga. La a doua iterație, înlocuim fiecare dintre segmente cu două noi segmente la unghi drept, fiecare scalate cu rația r. Noile segmente sunt așezate la stânga, apoi la dreapta de-a lungul segmentelor primei iterații. Se continuă această construcție, alternând mereu segmentele noi între stânga și dreapta de-a lungul segmentelor iterației anterioare. Această construcție generează “Curba Dragonului”.

Java-Logo
Cod Sursa JAVA

 


import java.awt.Color;
import java.awt.Graphics;
import java.util.*;
import javax.swing.JFrame;
 
public class DragonCurve extends JFrame {
 
    private List<Integer> turns;
    private double startingAngle, side;
 
    public DragonCurve(int iter) {
        super("Dragon Curve");
        setBounds(100100800600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        turns = getSequence(iter);
        startingAngle = -iter * (Math.PI / 4);
        side = 400 / Math.pow(2, iter / 2.);
    }
 
    public List<Integer> getSequence(int iterations) {
        List<Integer> turnSequence = new ArrayList<Integer>();
        for (int i = 0; i < iterations; i++) {
            List<Integer> copy = new ArrayList<Integer>(turnSequence);
            Collections.reverse(copy);
            turnSequence.add(1);
            for (Integer turn : copy) {
                turnSequence.add(-turn);
            }
        }
        return turnSequence;
    }
 
    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        double angle = startingAngle;
        int x1 = 230, y1 = 350;
        int x2 = x1 + (int) (Math.cos(angle* side);
        int y2 = y1 + (int) (Math.sin(angle* side);
        g.drawLine(x1, y1, x2, y2);
        x1 = x2;
        y1 = y2;
        for (Integer turn : turns) {
            angle += turn * (Math.PI / 2);
            x2 = x1 + (int) (Math.cos(angle* side);
            y2 = y1 + (int) (Math.sin(angle* side);
            g.drawLine(x1, y1, x2, y2);
            x1 = x2;
            y1 = y2;
        }
    }
 
    public static void main(String[] args) {
        new DragonCurve(14).setVisible(true);
    }
}

 

Rezultat:

dragon curve rezultat

Leave a comment