Add classes for drawing snowflakes
This commit is contained in:
parent
3c1486854b
commit
67d698f537
3 changed files with 119 additions and 0 deletions
39
app/src/main/java/ch/nuth/zhaw/exbox/SnowflakeServer.java
Normal file
39
app/src/main/java/ch/nuth/zhaw/exbox/SnowflakeServer.java
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
package ch.nuth.zhaw.exbox;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the functionality to draw a snowflake.
|
||||||
|
*/
|
||||||
|
public class SnowflakeServer implements CommandExecutor {
|
||||||
|
@Override
|
||||||
|
public String execute(String command) {
|
||||||
|
int recursionLevel = Integer.parseInt(command);
|
||||||
|
Turtle turtle = Turtle.instance();
|
||||||
|
drawSnowflake(turtle, recursionLevel);
|
||||||
|
return turtle.getTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawSnowflake(Turtle turtle, int recursionLevel) {
|
||||||
|
turtle.reset(0.1, 0.266);
|
||||||
|
turtle.turn(60);
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
drawLine(turtle, recursionLevel, 0.8);
|
||||||
|
turtle.turn(-120);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawLine(Turtle turtle, int recursionLevel, double destination) {
|
||||||
|
if (recursionLevel == 0) {
|
||||||
|
turtle.move(destination);
|
||||||
|
} else {
|
||||||
|
double distance = destination / 3;
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
drawLine(turtle, recursionLevel - 1, distance);
|
||||||
|
turtle.turn(i % 2 == 0 ? 60 : -120);
|
||||||
|
}
|
||||||
|
|
||||||
|
drawLine(turtle, recursionLevel - 1, distance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
17
app/src/main/java/ch/nuth/zhaw/exbox/TestGraphicServer.java
Normal file
17
app/src/main/java/ch/nuth/zhaw/exbox/TestGraphicServer.java
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
package ch.nuth.zhaw.exbox;
|
||||||
|
|
||||||
|
public class TestGraphicServer implements CommandExecutor {
|
||||||
|
String figure = "<line x1=\"0.1\" y1 = \"0.8\" x2=\"0.9\" y2 = \"0.8\" />\n" +
|
||||||
|
"<line x1=\"0.2\" y1 = \"0.4\" x2=\"0.2\" y2 = \"0.8\" />\n" +
|
||||||
|
"<line x1=\"0.3\" y1 = \"0.4\" x2=\"0.3\" y2 = \"0.8\" />\n" +
|
||||||
|
"<line x1=\"0.3\" y1 = \"0.4\" x2=\"0.7\" y2 = \"0.4\" />\n" +
|
||||||
|
"<line x1=\"0.3\" y1 = \"0.6\" x2=\"0.4\" y2 = \"0.6\" />\n" +
|
||||||
|
"<line x1=\"0.5\" y1 = \"0.8\" x2=\"0.5\" y2 = \"0.6\" />\n" +
|
||||||
|
"<line x1=\"0.5\" y1 = \"0.6\" x2=\"0.7\" y2 = \"0.6\" />\n" +
|
||||||
|
"<line x1=\"0.7\" y1 = \"0.6\" x2=\"0.7\" y2 = \"0.4\" />\n" +
|
||||||
|
"<line x1=\"0.8\" y1 = \"0.4\" x2=\"0.8\" y2 = \"0.8\" />\n";
|
||||||
|
|
||||||
|
public String execute(String command) {
|
||||||
|
return figure;
|
||||||
|
}
|
||||||
|
}
|
63
app/src/main/java/ch/nuth/zhaw/exbox/Turtle.java
Normal file
63
app/src/main/java/ch/nuth/zhaw/exbox/Turtle.java
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
package ch.nuth.zhaw.exbox;
|
||||||
|
|
||||||
|
public class Turtle {
|
||||||
|
private static StringBuffer b;
|
||||||
|
private static double x, y;
|
||||||
|
private static double angle;
|
||||||
|
private static Turtle theTurtle;
|
||||||
|
|
||||||
|
public static Turtle instance() {
|
||||||
|
if (theTurtle == null) {
|
||||||
|
theTurtle = new Turtle();
|
||||||
|
}
|
||||||
|
|
||||||
|
return theTurtle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Turtle() {
|
||||||
|
this(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Turtle(double x, double y) {
|
||||||
|
reset(x, y);
|
||||||
|
theTurtle = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset(double x, double y) {
|
||||||
|
b = new StringBuffer();
|
||||||
|
Turtle.x = x;
|
||||||
|
Turtle.y = y;
|
||||||
|
angle = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear() {
|
||||||
|
reset(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTrace() {
|
||||||
|
return b.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private double round(double d) {
|
||||||
|
return Math.round(d * 10000) / 10000.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void move(double dist) {
|
||||||
|
b.append("<line x1=\"");
|
||||||
|
b.append(Double.toString(round(x)));
|
||||||
|
b.append("\" y1=\"");
|
||||||
|
b.append(Double.toString(round(y)));
|
||||||
|
b.append("\" ");
|
||||||
|
x += Math.cos(angle) * dist;
|
||||||
|
y += Math.sin(angle) * dist;
|
||||||
|
b.append("x2=\"");
|
||||||
|
b.append(Double.toString(round(x)));
|
||||||
|
b.append("\" y2=\"");
|
||||||
|
b.append(Double.toString(round(y)));
|
||||||
|
b.append("\"/>\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void turn(double turnAngle) {
|
||||||
|
angle += turnAngle * Math.PI / 180;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue