// lines.java // source for program to iterate trough an l-system import java.awt.*; import java.applet.*; import java.lang.*; public class Lines2 extends Applet { static final int MAXLINES = 6; static final int MAXITERATIONS = 3; static final int SNAP = 32; static final int TOP = 32; static final int BOTTOM = 336; static final int LEFT = 32; static final int RIGHT = 336; private int mode; private int iterations; private Point lastpoint = new Point(0,0); private Point firstpoint = new Point(0,0); private String lsys; private String good; private double ang; private double distance; public Lines2() { mode = 0; ang = Math.E; lsys = ""; } public void get_template(Graphics g) { int loop, loop2; Point temp = new Point(0,0); Point temp2 = new Point(0,0); double angle = 0; int x = firstpoint.x; int y = firstpoint.y; g.setFont(new Font("TimesRoman", Font.PLAIN, 14)); g.drawString("Click to draw template." + lsys, 5, 15); g.drawRect(LEFT,TOP,RIGHT-LEFT,BOTTOM-TOP); for (loop = LEFT + SNAP; loop < RIGHT; loop += SNAP) for (loop2 = TOP + SNAP; loop2 < BOTTOM; loop2 += SNAP) g.drawLine(loop, loop2, loop, loop2); for (loop = 0; loop < lsys.length(); loop++) { if (lsys.charAt(loop) == 'r') angle -= Math.PI/2; if (lsys.charAt(loop) == 'l') angle += Math.PI/2; if (lsys.charAt(loop) == 'd') { g.drawLine(x, y, (int)(x + Math.cos(angle) * SNAP), (int)(y - Math.sin(angle) * SNAP)); x += (int)(Math.cos(angle) * SNAP); y -= (int)(Math.sin(angle) * SNAP); } } } public void draw_lsys(Graphics g) { int loop; double angle = 0; int x = firstpoint.x; int y = firstpoint.y; g.drawString(lsys, 5, 15); for (loop = 0; loop < lsys.length(); loop++) { if (lsys.charAt(loop) == 'r') angle -= Math.PI/2; if (lsys.charAt(loop) == 'l') angle += Math.PI/2; if (lsys.charAt(loop) == 'd') { g.drawLine(x, y, (int)(x + Math.cos(angle)*SNAP/Math.pow(distance, iterations)), (int)(y - Math.sin(angle)*SNAP/Math.pow(distance, iterations))); x += (int)(Math.cos(angle) * SNAP / Math.pow(distance, iterations)); y -= (int)(Math.sin(angle) * SNAP / Math.pow(distance, iterations)); } } } public boolean mouseDown(Event event, int x, int y) { if (mode == 0 && x >= LEFT+SNAP && x < RIGHT && y > TOP+SNAP && y < BOTTOM) { addpoint(x, y); repaint(); } else if (mode == 0) { iterations = 0; mode = 1; good = lsys; } else if (mode == 1) { if (iterations < MAXITERATIONS) { iterations++; iterate(); distance = (lastpoint.x - firstpoint.x) / SNAP; } repaint(); } return true; } public void addpoint(int x, int y) { int ydiff; int xdiff; int loop; if (x % SNAP > SNAP / 2) x += SNAP - x % SNAP; else x -= x % SNAP; if (y % SNAP > SNAP / 2) y += SNAP - y % SNAP; else y -= y % SNAP; xdiff = x - lastpoint.x; ydiff = y - lastpoint.y; if (ang == Math.E) { firstpoint.move(x,y); lastpoint.move(x,y); ang = 0; } else { if (Math.abs(xdiff) > Math.abs(ydiff)) { ydiff = 0; y = lastpoint.y; if (xdiff > 0) { if (ang != 0) if (ang > Math.PI) lsys += 'l'; else lsys += 'r'; ang = 0; } else { if (ang != Math.PI) if (ang > Math.PI) lsys += 'r'; else lsys += 'l'; ang = Math.PI; } for (loop = 0; loop < Math.abs(xdiff) / SNAP; loop++) lsys += 'd'; } else { xdiff = 0; x = lastpoint.x; if (ydiff > 0) { if (ang != 3 * Math.PI / 2) if (ang > Math.PI / 2) lsys += 'l'; else lsys += 'r'; ang = 3 * Math.PI / 2; } else { if (ang != Math.PI / 2) if (ang > Math.PI / 2) lsys += 'r'; else lsys += 'l'; ang = Math.PI / 2; } for (loop = 0; loop < Math.abs(ydiff) / SNAP; loop++) lsys += 'd'; } lastpoint.move(x,y); } } public void paint(Graphics g) { if (mode == 0) get_template(g); else if (mode == 1) draw_lsys(g); } public void iterate() { String str = ""; int loop = 0, loop2, loop3; int count; while (loop < lsys.length()) { count = 0; if (lsys.charAt(loop) == 'd') { do { loop++; count++; } while (loop < lsys.length() && lsys.charAt(loop) == 'd'); loop--; for (loop2 = 0; loop2 < good.length(); loop2++) if (good.charAt(loop2) == 'd') for (loop3 = 0; loop3 < count; loop3++) str += 'd'; else str += good.charAt(loop2); } else str += lsys.charAt(loop); loop++; } lsys = str; } }