Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- LisajousTable table;
- boolean lisajousAction = false;
- float delta_time, now = System.nanoTime();
- void setup()
- {
- size(1920, 1020, P2D);
- table = new LisajousTable();
- table.angleChange1 = lisajousAction ? table.angleChange2 : 0;
- }
- void calculate_delta_time()
- {
- delta_time = (System.nanoTime()- now)/100000000;
- now = System.nanoTime();
- }
- void keyPressed()
- {
- if ((key >= 'A' && key <= 'Z') || (key >= 'a' && key <= 'z'))
- {
- if (key == 'R' ||key == 'r')
- {
- float lisousChange = 0.05;
- table.reset(lisousChange);
- } else if (key == 'S' ||key == 's')
- {
- lisajousAction = !lisajousAction;
- }
- table.angleChange1 = lisajousAction ? table.angleChange2 : 0;
- }
- }
- void draw()
- {
- noFill();
- textSize(20);
- background(0);
- table.show(lisajousAction);
- String startStop = lisajousAction ? "Stop" : "Start";
- text("Reset - r\n" + startStop + " - s\n" + int(frameRate) + " fps", 1, 20);
- calculate_delta_time();
- }
- class LisajousTable
- {
- int size = 100, cols, rows;
- ArrayList<ArrayList<Curve>> curves = new ArrayList<ArrayList<Curve>>();
- float centerX = 0, centerY = 0, x = 0, y = 0, factor = 1, angle = 0;
- float diameter = size - 0.2 * size, radius = diameter/2, offset = size/2;
- float angleChange1 = 0.05, angleChange2 = angleChange1, inverseFactor = abs(1/factor);
- boolean whatLine = true; //true - horizontal line, false - vertical line
- LisajousTable()
- {
- //Calculation of the number of circles vertically and horizontally
- cols = (width - int(offset)) / size;
- rows = (height - int(offset)) / size;
- for (int j = 0; j < rows; j++) {
- curves.add(new ArrayList<Curve>());
- for (int i = 0; i < cols; i++) {
- curves.get(j).add(new Curve());
- }
- }
- }
- void reset(float change)
- {
- angleChange1 = change;
- angleChange2 = change;
- for (int j = 0; j < rows; j++)
- {
- for (int i = 0; i < cols; i++)
- {
- curves.get(j).get(i).reset();
- }
- }
- offset = size/2;
- diameter = size - 0.2 * size;
- radius = diameter/2;
- cols = (width - int(offset)) / size;
- rows = (height - int(offset)) / size;
- for (int j = 0; j < rows; j++) {
- curves.add(new ArrayList<Curve>());
- for (int i = 0; i < cols; i++) {
- curves.get(j).add(new Curve());
- }
- }
- angle = 0;
- inverseFactor = abs(1/factor);
- }
- void calculations()
- {
- float line1 = 0, plane = 0, line2 = 0;
- float inside = 0, sizePlusOfset = size + offset;
- if (whatLine)
- {
- line1 = cols;
- line2 = rows;
- plane = height;
- centerY = offset;
- } else
- {
- line1 = rows;
- line2 = cols;
- plane = width;
- centerX = offset;
- }
- for (int i = 0; i < line1; i++)
- {
- if (whatLine)
- {
- centerX = sizePlusOfset + i * size;
- } else
- {
- centerY = sizePlusOfset + i * size;
- }
- inside = angle * (i + factor) - HALF_PI;
- x = radius * cos(inside);
- y = radius * sin(inside);
- for (int j = 0; j < line2; j++)
- {
- if (whatLine)
- {
- curves.get(j).get(i).setX(centerX + x);
- } else
- {
- curves.get(i).get(j).setY(centerY + y);
- }
- }
- strokeWeight(1);
- stroke(255, 230);
- ellipse(centerX, centerY, diameter, diameter);
- strokeWeight(8);
- point(centerX + x, centerY + y);
- stroke(255, 150);
- strokeWeight(1);
- if (whatLine)
- {
- line(centerX + x, 0, centerX + x, plane);
- } else
- {
- line(0, centerY + y, plane, centerY + y);
- }
- }
- }
- void show(boolean lisajousAction)
- {
- for (int i = 0; i < 2; i++)
- {
- calculations();
- whatLine = !whatLine;
- }
- for (int j = 0; j < rows; j++) {
- for (int i = 0; i < cols; i++) {
- if (lisajousAction)
- {
- curves.get(j).get(i).addPoint();
- }
- curves.get(j).get(i).show();
- }
- }
- angle -= angleChange1 * delta_time;
- if (angle < -TWO_PI * inverseFactor) {
- for (int j = 0; j < rows; j++) {
- for (int i = 0; i < cols; i++) {
- curves.get(j).get(i).reset();
- }
- }
- //saveFrame("###lissajous.png");
- angle = 0;
- }
- }
- }
- class Curve
- {
- ArrayList<PVector> path;
- PVector current = new PVector(0, 0);
- Curve()
- {
- path = new ArrayList<PVector>();
- current = new PVector();
- }
- void setX(float x)
- {
- current.x = x;
- }
- void setY(float y)
- {
- current.y = y;
- }
- void addPoint()
- {
- path.add(current);
- }
- void reset()
- {
- path.clear();
- }
- void show()
- {
- noFill();
- stroke(255);
- strokeWeight(1);
- beginShape();
- for (PVector v : path) {
- //stroke((map(path.get(i).x, 0, width, 50, 255)), (map(i, 0, path.size(), 0, 255)), (map(path.get(i).y, 0, height, 100, 255)));
- vertex(v.x, v.y);
- }
- endShape();
- strokeWeight(8);
- point(current.x, current.y);
- current = new PVector();
- }
- }
Add Comment
Please, Sign In to add comment