Skip to content

Commit 9b929ab

Browse files
committed
Separating Concerns in Turtle
Also created TurtleFrame
1 parent 86fa1c4 commit 9b929ab

18 files changed

Lines changed: 222 additions & 122 deletions

src/main/java/org/teachingextensions/approvals/lite/util/WindowUtils.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package org.teachingextensions.approvals.lite.util;
22

3-
import java.awt.Dimension;
3+
import javax.swing.*;
4+
import java.awt.*;
45
import java.awt.event.WindowAdapter;
56

6-
import javax.swing.JFrame;
7-
import javax.swing.JOptionPane;
8-
97
public class WindowUtils
108
{
119
public static void centerWindow(java.awt.Window window)
@@ -16,7 +14,6 @@ public static void centerWindow(java.awt.Window window)
1614
int dy = (int) w.getHeight();
1715
int x = (int) ((d.getWidth() - dx) / 2);
1816
int y = (int) ((d.getHeight() - dy) / 2);
19-
MySystem.variable(" size (" + x + "," + y + "," + dx + "," + dy + ")");
2017
window.setBounds(x, y, dx, dy + 1);
2118
}
2219
public static void testFrame(JFrame frame)
@@ -55,4 +52,4 @@ public static void testFrame(JFrame frame, WindowAdapter... array)
5552
WindowUtils.centerWindow(frame);
5653
//frame.setVisible(true);
5754
}
58-
}
55+
}

src/main/java/org/teachingextensions/logo/Turtle.java

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
package org.teachingextensions.logo;
22

3-
import java.awt.Color;
4-
import java.awt.Component;
5-
import java.awt.Point;
6-
import java.awt.image.BufferedImage;
7-
import java.util.ArrayList;
8-
import java.util.List;
9-
10-
import javax.swing.JFrame;
11-
123
import org.teachingextensions.WindowUtils.ProgramWindow;
134
import org.teachingextensions.WindowUtils.TurtlePanel;
145
import org.teachingextensions.approvals.lite.util.ThreadLauncher;
156
import org.teachingextensions.approvals.lite.util.lambda.Action0;
167
import org.teachingextensions.approvals.lite.util.persistence.Saver;
178
import org.teachingextensions.approvals.lite.util.persistence.SavingException;
189
import org.teachingextensions.approvals.lite.writers.ComponentApprovalWriter;
10+
import org.teachingextensions.logo.utils.DeltaCalculator;
11+
import org.teachingextensions.logo.utils.InterfaceUtils.TurtleFrame;
1912
import org.teachingextensions.logo.utils.LineAndShapeUtils.LineSegment;
13+
import org.teachingextensions.logo.utils.AngleCalculator;
14+
15+
import javax.swing.*;
16+
import java.awt.*;
17+
import java.awt.image.BufferedImage;
18+
import java.util.ArrayList;
19+
import java.util.List;
2020

2121
/**
2222
* <img src="https://lh5.googleusercontent.com/-B3Q59gpYW8o/T4tA2k_TYUI/AAAAAAAAAjo/WiqdoXjbkb0/s65/Tortoise.png" style="text-align: left" alt="A turtle drawing a line" >
@@ -29,32 +29,16 @@ public class Turtle
2929
private double x = 640 / 2;
3030
private double y = 480 / 2;
3131
private double angleInDegrees = 0;
32-
private JFrame frame;
33-
public TurtlePanel panel;
32+
private TurtleFrame frame = new TurtleFrame();
33+
public TurtlePanel panel;
3434
private int speed = 1;
3535
public List<LineSegment> trail = new ArrayList<LineSegment>();
3636
private Color color = Color.black;
3737
private int width = 2;
3838
private boolean penDown = true;
3939
private boolean hidden;
4040
private Animals animal;
41-
public static double getDeltaY(double i, double angleInDegrees2)
42-
{
43-
return -i * Math.cos(Math.toRadians(angleInDegrees2));
44-
}
45-
public static double getDeltaX(double i, double angleInDegrees2)
46-
{
47-
return i * Math.sin(Math.toRadians(angleInDegrees2));
48-
}
49-
public static double angleCalculator(int x1, int y1, int x2, int y2)
50-
{
51-
int delta_x = x1 - x2;
52-
int delta_y = y1 - y2;
53-
double theta_radians = Math.atan2(delta_y, delta_x);
54-
double degrees = Math.toDegrees(theta_radians);
55-
double degreesWith0North = degrees - 90;
56-
return degreesWith0North;
57-
}
41+
5842
public BufferedImage getImage()
5943
{
6044
BufferedImage image = ComponentApprovalWriter.drawComponent(getPanel());
@@ -73,18 +57,18 @@ private Component getPanel()
7357
{
7458
if (panel == null)
7559
{
76-
String title = "TKPJava Turtle";
7760
panel = new TurtlePanel();
7861
if (speed != TEST_SPEED)
7962
{
80-
frame = new JFrame(title);
81-
frame.getContentPane().add(panel);
82-
ProgramWindow.createStandardFrame(frame);
63+
this.frame.addContent(panel);
64+
this.frame.setStandardLayout();
65+
8366
}
8467
panel.setTurtle(this);
8568
}
8669
return panel;
8770
}
71+
8872
public void setPanel(TurtlePanel panel)
8973
{
9074
this.panel = panel;
@@ -210,8 +194,9 @@ public void move(Number amount)
210194
}
211195
private void moveWithoutAnimation(Double save)
212196
{
213-
x += getDeltaX(save, angleInDegrees);
214-
y += getDeltaY(save, angleInDegrees);
197+
DeltaCalculator calculator = new DeltaCalculator(this.angleInDegrees, save);
198+
x += calculator.getX();
199+
y += calculator.getY();
215200
}
216201
public LineSegment[] getTrail()
217202
{
@@ -291,7 +276,8 @@ public void call()
291276
}
292277
public void moveSynchronized(int x, int y)
293278
{
294-
double angleOfWherePointIs = angleCalculator(getX(), getY(), x, y);
279+
AngleCalculator calculator = new AngleCalculator(getX(), getY(), x, y);
280+
double angleOfWherePointIs = calculator.getDegreesWith0North();
295281
double direction = angleOfWherePointIs - getAngleInDegrees();
296282
turn(direction);
297283
// move the turtle the distance to the x y point
@@ -400,14 +386,14 @@ public void drawLightning(int length)
400386
}
401387
public void setFrameVisible(boolean b)
402388
{
403-
frame.setVisible(b);
389+
this.frame.setVisible(b);
404390
}
405391
public void setPanelVisible(boolean b)
406392
{
407393
panel.setVisible(b);
408394
}
409395
public void setFrame(JFrame frame2)
410396
{
411-
this.frame = frame2;
397+
this.frame = new TurtleFrame(frame2);
412398
}
413399
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.teachingextensions.logo.utils;
2+
3+
public class AngleCalculator {
4+
5+
private final int x1;
6+
private final int y1;
7+
private final int x2;
8+
private final int y2;
9+
10+
public AngleCalculator(int x1, int y1, int x2, int y2) {
11+
this.x1 = x1;
12+
this.y1 = y1;
13+
this.x2 = x2;
14+
this.y2 = y2;
15+
}
16+
17+
public double getDegreesWith0North(){
18+
int delta_x = this.x1 - this.x2;
19+
int delta_y = this.y1 - this.y2;
20+
double theta_radians = Math.atan2(delta_y, delta_x);
21+
double degrees = Math.toDegrees(theta_radians);
22+
return degrees - 90;
23+
}
24+
25+
}
26+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.teachingextensions.logo.utils;
2+
3+
public class DeltaCalculator {
4+
private final double angleInDegrees;
5+
private final double size;
6+
7+
public DeltaCalculator(double angleInDegrees, double size) {
8+
this.angleInDegrees = angleInDegrees;
9+
this.size = size;
10+
}
11+
12+
public double getX() {
13+
return this.size * Math.sin(Math.toRadians(this.angleInDegrees));
14+
}
15+
16+
public double getY() {
17+
return -this.size * Math.cos(Math.toRadians(this.angleInDegrees));
18+
}
19+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.teachingextensions.logo.utils.InterfaceUtils;
2+
3+
import org.teachingextensions.WindowUtils.ProgramWindow;
4+
5+
import javax.swing.*;
6+
7+
public class TurtleFrame {
8+
public static final String TITLE = "TKPJava Turtle";
9+
private LazyFrame frame;
10+
private String title;
11+
12+
public TurtleFrame(JFrame frame) {
13+
if (frame == null) {
14+
throw new IllegalArgumentException("frame must not be null when creating a TurtleFrame");
15+
}
16+
17+
this.frame = new LazyFrame(frame);
18+
}
19+
20+
public TurtleFrame(String title) {
21+
if (title == null) {
22+
title = TITLE;
23+
}
24+
25+
this.frame = new LazyFrame(title);
26+
}
27+
28+
public TurtleFrame() {
29+
this(TITLE);
30+
}
31+
32+
public TurtleFrame addContent(JComponent panel) {
33+
this.frame.getValue().getContentPane().add(panel);
34+
return this;
35+
}
36+
37+
public TurtleFrame setVisible(boolean visible) {
38+
this.frame.getValue().setVisible(visible);
39+
return this;
40+
}
41+
42+
public TurtleFrame setStandardLayout() {
43+
ProgramWindow.createStandardFrame(this.frame.getValue());
44+
return this;
45+
}
46+
47+
private class LazyFrame {
48+
private String title;
49+
private JFrame frame;
50+
51+
public LazyFrame(String title) {
52+
if (title == null) {
53+
throw new IllegalArgumentException("title must not be null when creating a LazyFrame");
54+
}
55+
56+
this.title = title;
57+
}
58+
59+
public LazyFrame(JFrame frame) {
60+
this.frame = frame;
61+
}
62+
63+
public JFrame getValue() {
64+
if (this.frame == null) {
65+
this.frame = new JFrame(this.title);
66+
}
67+
68+
return this.frame;
69+
}
70+
}
71+
}

src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package org.teachingextensions.logo;
22

3-
import static org.junit.Assert.assertEquals;
4-
53
import org.junit.Test;
64
import org.teachingextensions.WindowUtils.MultiTurtleWindow;
75
import org.teachingextensions.approvals.lite.Approvals;
@@ -10,6 +8,8 @@
108
import org.teachingextensions.approvals.lite.reporters.UseReporter;
119
import org.teachingextensions.approvals.lite.util.JUnitUtils;
1210

11+
import static org.junit.Assert.assertEquals;
12+
1313
@UseReporter({DiffReporter.class, DelayedClipboardReporter.class})
1414
public class MultiTurtlePanelTest
1515
{
@@ -20,14 +20,8 @@ public void testPaintNoTurtles()
2020
MultiTurtleWindow panel = new MultiTurtleWindow();
2121
Approvals.verify(panel);
2222
}
23-
@Test
24-
public void testPaintOneTurtle()
25-
{
26-
JUnitUtils.assumeNotHeadless();
27-
MultiTurtleWindow panel = new MultiTurtleWindow();
28-
panel.addTurtle(new Turtle());
29-
Approvals.verify(panel);
30-
}
23+
24+
3125
@Test
3226
public void testPaintWithGhostTurtle()
3327
{
0 Bytes
Loading
-5 Bytes
Loading
-2 Bytes
Loading
-2 Bytes
Loading

0 commit comments

Comments
 (0)