From 62431c6e049eb9e6c09955c291540508dc0333ad Mon Sep 17 00:00:00 2001 From: Klemek Date: Sun, 4 Nov 2018 13:08:09 +0100 Subject: [PATCH] v1.1 : Optimization, big brush preview and tests --- download/mapping-1.0.1.jar | Bin 19140 -> 0 bytes download/mapping-1.1.jar | Bin 0 -> 19387 bytes make_jar.bat | 1 + pom.xml | 2 +- .../fr/klemek/mapping/KeyEventListener.java | 13 ++- .../java/fr/klemek/mapping/MainPanel.java | 81 +++++++++--------- .../java/fr/klemek/mapping/MainWindow.java | 8 +- .../mapping/{FileUtils.java => Utils.java} | 12 ++- src/test/java/fr/klemek/mapping/MapTest.java | 30 +++++++ .../java/fr/klemek/mapping/UtilsTest.java | 39 +++++++++ 10 files changed, 136 insertions(+), 50 deletions(-) delete mode 100644 download/mapping-1.0.1.jar create mode 100644 download/mapping-1.1.jar create mode 100644 make_jar.bat rename src/main/java/fr/klemek/mapping/{FileUtils.java => Utils.java} (76%) create mode 100644 src/test/java/fr/klemek/mapping/UtilsTest.java diff --git a/download/mapping-1.0.1.jar b/download/mapping-1.0.1.jar deleted file mode 100644 index e3e79b16aff6344147aecea611e5851ad10f564d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19140 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 literal 0 HcmV?d00001 diff --git a/make_jar.bat b/make_jar.bat new file mode 100644 index 0000000..8802e72 --- /dev/null +++ b/make_jar.bat @@ -0,0 +1 @@ +mvn clean package && del download\*.jar && xcopy /Y target\*-jar-with-dependencies.jar download && powershell -command "get-childitem download\* | foreach { rename-item $_ $_.Name.Replace('-jar-with-dependencies', '') }" && git add download/*.jar \ No newline at end of file diff --git a/pom.xml b/pom.xml index 6607282..c85ca64 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ fr.klemek mapping - 1.0.1 + 1.1 diff --git a/src/main/java/fr/klemek/mapping/KeyEventListener.java b/src/main/java/fr/klemek/mapping/KeyEventListener.java index d0ede56..828b5c8 100644 --- a/src/main/java/fr/klemek/mapping/KeyEventListener.java +++ b/src/main/java/fr/klemek/mapping/KeyEventListener.java @@ -76,7 +76,7 @@ public class KeyEventListener implements KeyListener { "Save", JOptionPane.YES_NO_OPTION); if (n2 == JOptionPane.YES_OPTION) { - if (FileUtils.save(MainWindow.FILE_NAME, this.mp.getMap().toString())) { + if (Utils.saveFile(MainWindow.FILE_NAME, this.mp.getMap().toString())) { JOptionPane.showInternalMessageDialog(this.mp, "Saved as '" + MainWindow.FILE_NAME + "'", "Saved", @@ -90,6 +90,9 @@ public class KeyEventListener implements KeyListener { } } break; + case KeyEvent.VK_SHIFT: + this.mp.setShiftDown(true); + break; default: break; } @@ -97,6 +100,12 @@ public class KeyEventListener implements KeyListener { @Override public void keyReleased(KeyEvent e) { - //ignored + switch (e.getKeyCode()) { + case KeyEvent.VK_SHIFT: + this.mp.setShiftDown(false); + break; + default: + break; + } } } diff --git a/src/main/java/fr/klemek/mapping/MainPanel.java b/src/main/java/fr/klemek/mapping/MainPanel.java index 006ee5f..5d18200 100644 --- a/src/main/java/fr/klemek/mapping/MainPanel.java +++ b/src/main/java/fr/klemek/mapping/MainPanel.java @@ -8,20 +8,23 @@ import javax.swing.*; class MainPanel extends JPanel { - final static float DEFAULT_RATIO = .5f; - private final static float SIZE = 1.2f; + static final float DEFAULT_RATIO = .5f; + private static final float SIZE = 1.2f; private float ratio = DEFAULT_RATIO; - private Map map; - private int w, h; - private int cx, cy; - private float mw, mh; - private int sx = -1, sy = -1; + private transient Map map; + private int cx; + private int cy; + private float mw; + private float mh; + private int sx = -1; + private int sy = -1; private int[][] xs; private int[][] ys; private boolean showGrid; + private boolean shiftDown; private float angle; MainPanel(Map map) { @@ -74,19 +77,19 @@ class MainPanel extends JPanel { RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)); - this.w = this.getWidth(); - this.h = this.getHeight(); - this.cx = Math.round(this.w / 2f); - this.cy = Math.round(this.h / 2f); - if (this.w > this.h) { - this.mh = this.h * SIZE * ratio; + int w = this.getWidth(); + int h = this.getHeight(); + this.cx = Math.round(w / 2f); + this.cy = Math.round(h / 2f); + if (w > h) { + this.mh = h * SIZE * ratio; this.mw = mh / ratio; } else { - this.mw = this.w * SIZE; + this.mw = w * SIZE; this.mh = mw * ratio; } - g2.clearRect(0, 0, this.w, this.h); + g2.clearRect(0, 0, w, h); drawMap(g2); } @@ -105,19 +108,19 @@ class MainPanel extends JPanel { for (int x = 0; x < this.map.size(); x++) { for (int y = 0; y < this.map.size(); y++) { - Point p = getPoint(x0, xstep, ystep, x, y, this.map.get(x, y)); + Point p = this.getPoint(x0, xstep, ystep, x, y, this.map.get(x, y)); this.xs[x][y] = p.x; this.ys[x][y] = p.y; if (this.showGrid) { - Point p0 = getPoint(x0, xstep, ystep, x, y, 0); + Point p0 = this.getPoint(x0, xstep, ystep, x, y, 0); if (x > 0) { - Point p1 = getPoint(x0, xstep, ystep, x - 1, y, 0); + Point p1 = this.getPoint(x0, xstep, ystep, x - 1, y, 0); g2.drawLine(p0.x, p0.y, p1.x, p1.y); } if (y > 0) { - Point p1 = getPoint(x0, xstep, ystep, x, y - 1, 0); + Point p1 = this.getPoint(x0, xstep, ystep, x, y - 1, 0); g2.drawLine(p0.x, p0.y, p1.x, p1.y); } g2.drawLine(p0.x, p0.y, p.x, p.y); @@ -125,30 +128,12 @@ class MainPanel extends JPanel { } } - - g2.setColor(Color.BLACK); - for (int x = 0; x < this.map.size(); x++) { for (int y = 0; y < this.map.size(); y++) { - if (x > 0) - g2.drawLine(this.xs[x - 1][y], this.ys[x - 1][y], this.xs[x][y], this.ys[x][y]); - if (y > 0) - g2.drawLine(this.xs[x][y - 1], this.ys[x][y - 1], this.xs[x][y], this.ys[x][y]); + this.drawLine(g2, x - 1, y, x, y); + this.drawLine(g2, x, y - 1, x, y); } } - - g2.setColor(Color.RED); - - if (sx >= 0 && sy >= 0) { - if (sx > 0) - g2.drawLine(this.xs[sx - 1][sy], this.ys[sx - 1][sy], this.xs[sx][sy], this.ys[sx][sy]); - if (sy > 0) - g2.drawLine(this.xs[sx][sy - 1], this.ys[sx][sy - 1], this.xs[sx][sy], this.ys[sx][sy]); - if (sx < this.map.size() - 1) - g2.drawLine(this.xs[sx + 1][sy], this.ys[sx + 1][sy], this.xs[sx][sy], this.ys[sx][sy]); - if (sy < this.map.size() - 1) - g2.drawLine(this.xs[sx][sy + 1], this.ys[sx][sy + 1], this.xs[sx][sy], this.ys[sx][sy]); - } } private Point getPoint(int x0, float xstep, float ystep, int x, int y, float value) { @@ -163,6 +148,20 @@ class MainPanel extends JPanel { ); } + private void drawLine(Graphics2D g2, int x1, int y1, int x2, int y2) { + if (x1 >= 0 && x1 < this.map.size() && + y1 >= 0 && y1 < this.map.size() && + x2 >= 0 && x2 < this.map.size() && + y2 >= 0 && y2 < this.map.size()) { + if (Utils.dist2(x1, y1, sx, sy) < (this.shiftDown ? 2 : 1) || Utils.dist2(x2, y2, sx, sy) < (this.shiftDown ? 2 : 1)) { + g2.setColor(Color.RED); + } else { + g2.setColor(Color.BLACK); + } + g2.drawLine(this.xs[x1][y1], this.ys[x1][y1], this.xs[x2][y2], this.ys[x2][y2]); + } + } + float getRatio() { return ratio; } @@ -190,4 +189,8 @@ class MainPanel extends JPanel { Map getMap() { return map; } + + void setShiftDown(boolean shiftDown) { + this.shiftDown = shiftDown; + } } diff --git a/src/main/java/fr/klemek/mapping/MainWindow.java b/src/main/java/fr/klemek/mapping/MainWindow.java index 162a41f..b661767 100644 --- a/src/main/java/fr/klemek/mapping/MainWindow.java +++ b/src/main/java/fr/klemek/mapping/MainWindow.java @@ -9,7 +9,7 @@ import javax.swing.*; class MainWindow extends JFrame { static final String FILE_NAME = "mapping.csv"; - private static final String VERSION = "1.0.1"; + private static final String VERSION = "1.1"; private static final int DEFAULT_SIZE = 17; private static final String INFO_TEXT = "" + "" + @@ -24,13 +24,13 @@ class MainWindow extends JFrame { "[0] - Show/hide this info
" + "[1] - Show grid
" + "[2] - Add random
"; - private MainPanel mp; - private RefreshThread refresh; + private transient MainPanel mp; + private transient RefreshThread refresh; MainWindow() { Map m = new Map(DEFAULT_SIZE); - String saved = FileUtils.open(FILE_NAME); + String saved = Utils.openFile(FILE_NAME); if (saved != null) m = new Map(saved); this.mp = new MainPanel(m); diff --git a/src/main/java/fr/klemek/mapping/FileUtils.java b/src/main/java/fr/klemek/mapping/Utils.java similarity index 76% rename from src/main/java/fr/klemek/mapping/FileUtils.java rename to src/main/java/fr/klemek/mapping/Utils.java index 2487bce..33a87ca 100644 --- a/src/main/java/fr/klemek/mapping/FileUtils.java +++ b/src/main/java/fr/klemek/mapping/Utils.java @@ -8,13 +8,17 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -final class FileUtils { +final class Utils { - private FileUtils() { + private Utils() { } - static boolean save(String fileName, String content) { + static int dist2(int x1, int y1, int x2, int y2) { + return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); + } + + static boolean saveFile(String fileName, String content) { try (BufferedWriter bw = new BufferedWriter(new FileWriter(fileName))) { bw.write(content); return true; @@ -24,7 +28,7 @@ final class FileUtils { } } - static String open(String fileName) { + static String openFile(String fileName) { try (BufferedReader bw = new BufferedReader(new FileReader(fileName))) { StringBuilder output = new StringBuilder(); String line; diff --git a/src/test/java/fr/klemek/mapping/MapTest.java b/src/test/java/fr/klemek/mapping/MapTest.java index d7cd2c2..92d3937 100644 --- a/src/test/java/fr/klemek/mapping/MapTest.java +++ b/src/test/java/fr/klemek/mapping/MapTest.java @@ -3,6 +3,7 @@ package fr.klemek.mapping; import org.junit.Test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; public class MapTest { @@ -17,4 +18,33 @@ public class MapTest { for (int y = 0; y < m.size(); y++) assertEquals(m.get(x, y), m2.get(x, y), 0.001f); } + + @Test + public void testReset() { + Map m = new Map(15); + m.randomize(); + assertNotEquals(0, m.get(0, 0), 0.001f); + m.reset(); + assertEquals(0, m.get(0, 0), 0.001f); + } + + @Test + public void testChangeSize() { + Map m = new Map(15); + m.randomize(); + float value = m.get(0, 0); + assertEquals(15, m.size()); + m.changeSize(18); + assertEquals(18, m.size()); + assertEquals(value, m.get(0, 0), 0.001f); + assertEquals(0, m.get(17, 17), 0.001f); + } + + @Test + public void testRandomize() { + Map m = new Map(15); + assertEquals(0, m.get(0, 0), 0.001f); + m.randomize(); + assertNotEquals(0, m.get(0, 0), 0.001f); + } } \ No newline at end of file diff --git a/src/test/java/fr/klemek/mapping/UtilsTest.java b/src/test/java/fr/klemek/mapping/UtilsTest.java new file mode 100644 index 0000000..d1ce411 --- /dev/null +++ b/src/test/java/fr/klemek/mapping/UtilsTest.java @@ -0,0 +1,39 @@ +package fr.klemek.mapping; + +import java.io.File; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +public class UtilsTest { + + @Test + public void testDist2() { + assertEquals(0, Utils.dist2(1, 1, 1, 1)); + assertEquals(1, Utils.dist2(1, 1, 2, 1)); + assertEquals(2, Utils.dist2(1, 1, 2, 2)); + } + + @Test + public void testSaveOpenFile() { + File f = new File("test.txt"); + if (f.exists()) + assertTrue(f.delete()); + + assertNull(Utils.openFile("test.txt")); + + assertTrue(Utils.saveFile("test.txt", "test\ntest\n")); + assertTrue(f.exists()); + + String content = Utils.openFile("test.txt"); + assertNotNull(content); + assertEquals("test\ntest\n", content); + + assertTrue(f.delete()); + } + +} \ No newline at end of file