-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.pde
More file actions
179 lines (174 loc) · 6.4 KB
/
main.pde
File metadata and controls
179 lines (174 loc) · 6.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import java.util.Map;
String str = "to loop1 :ne :sz repeat :ne [rt 360 / :ne fd :sz] end to ooler2 :ne :sz repeat :ne [rt 360 / :ne loop1 :ne :sz] end ooler2 36 20".replace("[", "[ ").replace("]", " ]").toLowerCase();
final String[]mainTokens = split(str, ' ');
HashMap<String, Procedure>procedures = new HashMap<String, Procedure>();
HashMap<String, String>mainVars = new HashMap<String, String>();
Turtle mainTurtle;
MyInt mainIndex = new MyInt(0);
void setup() {
size(500, 500, P3D);
mainTurtle = new Turtle();
background(255);
}
public String[] getArgs(int argCount, String[]tokens, MyInt i, Map<String, String>vars) {
String[]args = new String[argCount];
for (int arg = 0; arg < argCount; arg++) {
try {
Float.parseFloat(tokens[i.val]);
args[arg] = tokens[i.val];
}
catch (NumberFormatException nfe) {// not a number
if (tokens[i.val].equals("random")) {
args[arg] = getArgs(1, tokens, i.inc(), vars)[0];
args[arg] = "" + random(Float.parseFloat(args[arg]));
} else if (tokens[i.val].equals("sum")) {
String[]summers = getArgs(2, tokens, i.inc(), vars);
args[arg] = "" + (Float.parseFloat(summers[0]) + Float.parseFloat(summers[1]));
} else if (tokens[i.val].startsWith(":")) {
String varName = tokens[i.val].replace(":", "");
args[arg] = vars.get(varName);
} else args[arg] = tokens[i.val];
}
i.inc();
if (i.val<tokens.length) {
if (tokens[i.val].equals("/")) {
float den = Float.parseFloat(getArgs(1, tokens, i.inc(), vars)[0]);
args[arg] = "" + (Float.parseFloat(args[arg]) / den);
}
}
}
return args;
}
public void createProcedure(String[]tokens, MyInt i, HashMap<String, String>vars) {
String name = getArgs(1, tokens, i.inc(), vars)[0];
ArrayList<String>proVars = new ArrayList<String>();
while (tokens[i.val].startsWith(":")) {
proVars.add(tokens[i.val].replace(":", ""));
i.inc();
}
int nestedMethods = 1;
String method = "";
while (true) {
if (tokens[i.val].equals("to"))
nestedMethods++;
else if (tokens[i.val].equals("end")) {
nestedMethods--;
if (nestedMethods == 0) { // main loop is done
i.inc();
break;
}
}
method += tokens[i.val] + " ";
i.inc();
}
String[]methodTokens = split(method, ' ');
Procedure procedure = new Procedure(methodTokens, proVars.toArray(new String[0]));
procedures.put(name, procedure);
}
public void runCommands(Turtle turtle, String[]tokens, MyInt i, HashMap<String, String>vars) {
String token = tokens[i.val];
if (token.equals("forward") || token.equals("fd")) {
float amt = Float.parseFloat(getArgs(1, tokens, i.inc(), vars)[0]);
turtle.forward(amt);
} else if (token.equals("back") || token.equals("bk")) {
float amt = Float.parseFloat(getArgs(1, tokens, i.inc(), vars)[0]);
turtle.back(amt);
} else if (token.equals("right") || token.equals("rt")) {
float amt = Float.parseFloat(getArgs(1, tokens, i.inc(), vars)[0]);
turtle.right(amt);
} else if (token.equals("left") || token.equals("lt")) {
float amt = Float.parseFloat(getArgs(1, tokens, i.inc(), vars)[0]);
turtle.left(amt);
} else if (token.equals("clearscreen") || token.equals("cs")) {
turtle.clearscreen();
i.inc();
} else if (token.equals("penup") || token.equals("pu")) {
turtle.penUp();
i.inc();
} else if (token.equals("pendown") || token.equals("pd")) {
turtle.penDown();
i.inc();
} else if (token.equals("home")) {
turtle.home();
i.inc();
} else if (token.equals("setx")) {
float newX = Float.parseFloat(getArgs(1, tokens, i.inc(), vars)[0]);
turtle.setX(newX);
} else if (token.equals("sety")) {
float newY = Float.parseFloat(getArgs(1, tokens, i.inc(), vars)[0]);
turtle.setY(newY);
} else if (token.equals("setxy")) {
String[]args = getArgs(2, tokens, i.inc(), vars);
float newX = Float.parseFloat(args[0]);
float newY = Float.parseFloat(args[1]);
turtle.setXY(newX, newY);
} else if (token.equals("setheading") || token.equals("seth")) {
float newH = Float.parseFloat(getArgs(1, tokens, i.inc(), vars)[0]);
turtle.setHeading(newH);
} else if (token.equals("setcolor")) {
int colIndex = int(Float.parseFloat(getArgs(1, tokens, i.inc(), vars)[0]));
turtle.setColor(colIndex);
} else if (token.equals("repeat")) {
int count = Integer.parseInt(getArgs(1, tokens, i.inc(), vars)[0]);
int nestedLoops = 1;
String loop = "";
while (true) {
i.inc();
if (tokens[i.val].equals("["))
nestedLoops++;
else if (tokens[i.val].equals("]")) {
nestedLoops--;
if (nestedLoops == 0) { // main loop is done
i.inc(); // skip last ']'
break;
}
}
loop += tokens[i.val] + " ";
}
loop = loop.replace("[", "[ ").replace("]", " ]").toLowerCase();
String[]loopTokens = split(loop, ' ');
for (int loopTime = 0; loopTime < count; loopTime++) {
MyInt loopInt = new MyInt(0);
while (loopInt.val < loopTokens.length)
runCommands(turtle, loopTokens, loopInt, vars);
}
} else if (token.equals("to")) {
createProcedure(tokens, i, vars);
} else if (token.equals("label")) {
String str = getArgs(1, tokens, i.inc(), vars)[0];
turtle.label(str);
} else if (token.equals("setlabelheight")) {
int amt = Integer.parseInt(getArgs(1, tokens, i.inc(), vars)[0]);
turtle.setlabelheight(amt);
} else if (token.equals("setwidth")) {
float amt = Float.parseFloat(getArgs(1, tokens, i.inc(), vars)[0]);
turtle.setWidth(amt);
} else if (token.equals("make")) {
} else if (procedures.containsKey(token)) {
Procedure pro = procedures.get(token);
int argCount = pro.vars.length;
String[]args = getArgs(argCount, tokens, i.inc(), vars);
HashMap<String, String>proVars = new HashMap<String, String>();
for (int a = 0; a < argCount; a++) {
proVars.put(pro.vars[a], args[a]);
}
runCommands(turtle, pro.tokens, new MyInt(0), proVars);
} else if (token.equals(" ") || token.equals("")) {
i.inc();
} else {
println("Dont know this command yet: " + token);
i.inc();
}
}
void draw() {
if (mainIndex.val >= mainTokens.length) {
println("Done!");
noLoop();
//mainIndex.val = 0;
//background(255);
//mainTurtle.reset();
}
translate(width/2, height/2);
rotateX(PI); // rotate y to be carteisan
runCommands(mainTurtle, mainTokens, mainIndex, mainVars);
}