diff --git a/.classpath b/.classpath
index da74edc..342fdc9 100644
--- a/.classpath
+++ b/.classpath
@@ -29,6 +29,7 @@
+
diff --git a/WebContent/WEB-INF/lib/core.jar b/WebContent/WEB-INF/lib/core.jar
new file mode 100644
index 0000000..99f0ba3
Binary files /dev/null and b/WebContent/WEB-INF/lib/core.jar differ
diff --git a/junit_tests/com/knotrenderer/utiltest/RandomTest.java b/junit_tests/com/knotrenderer/utiltest/RandomTest.java
new file mode 100644
index 0000000..01d26ca
--- /dev/null
+++ b/junit_tests/com/knotrenderer/utiltest/RandomTest.java
@@ -0,0 +1,105 @@
+package com.knotrenderer.utiltest;
+
+import java.util.ArrayList;
+
+import org.junit.Test;
+
+import com.knotrenderer.model.BezierCurve;
+import com.knotrenderer.model.Curve;
+import com.knotrenderer.model.LineSegment;
+import com.knotrenderer.util.CurveLoader;
+
+import processing.core.PVector;
+
+public class RandomTest {
+ private static final String CURVE_PATH = "D:/Peter/College_Grad_School/Independent_Study_Spring_2016_Cont/Knot-Renderer-Processing/Testing_Files/TJP-C1.curve";
+ private static final String CURVE_PATH2 = "D:/Peter/College_Grad_School/Independent_Study_Spring_2016_Cont/Knot-Renderer-Processing/Testing_Files/TJP-C2.curve";
+
+ private static final Curve CURVE = CurveLoader.loadCurveFromFile(CURVE_PATH);
+ private static final BezierCurve BEZIER_CURVE = new BezierCurve(CURVE.getKnotPoints());
+
+ private static final Curve CURVE2 = CurveLoader.loadCurveFromFile(CURVE_PATH2);
+ private static final BezierCurve BEZIER_CURVE2 = new BezierCurve(CURVE2.getKnotPoints());
+
+
+ private static PVector vector1 = new PVector(0f, 0f, 0f);
+ private static PVector vector2 = new PVector(0.31f, 0.81f, 1.00f);
+ private static PVector vector3 = new PVector(-2.1f, -2.7f, 1.90f);
+ private static PVector vector4 = new PVector(-1.9f, -3.4f, 0.91f);
+ private static PVector vector5 = new PVector(0.19f, 0.78f, 0.19f);
+ private static PVector vector6 = new PVector(1.56f, 2.32f, -0.96f);
+ private static PVector vector7 = new PVector(0f, 0f, 0f);
+
+ private static PVector vector8 = new PVector(0f, 0f, 0f);
+ private static PVector vector9 = new PVector(0.0305f, 0.0810f, 0.9962f);
+ private static PVector vector10 = new PVector(-0.2074f, -0.2671f, 1.9030f);
+ private static PVector vector11 = new PVector(-0.1792f, -0.3402f, 0.9063f);
+ private static PVector vector12 = new PVector(0.0189f, 0.0782f, 0.0185f);
+ private static PVector vector13 = new PVector(0.1557f, 0.2329f, -0.9600f);
+ private static PVector vector14 = new PVector(0f, 0f, 0f);
+
+
+ private static ArrayList knotPoints = new ArrayList();
+ static{
+ knotPoints.add(vector1);
+ knotPoints.add(vector2);
+ knotPoints.add(vector3);
+ knotPoints.add(vector4);
+ knotPoints.add(vector5);
+ knotPoints.add(vector6);
+ knotPoints.add(vector7);
+ }
+
+ private static ArrayList knotPoints_2 = new ArrayList();
+ static{
+ knotPoints_2.add(vector8);
+ knotPoints_2.add(vector9);
+ knotPoints_2.add(vector10);
+ knotPoints_2.add(vector11);
+ knotPoints_2.add(vector12);
+ knotPoints_2.add(vector13);
+ knotPoints_2.add(vector14);
+ }
+
+ @Test
+ public void testAll()
+ {
+ System.out.println("Curve 1:");
+ testOne_A();
+ testOne_B();
+ System.out.println("Curve 2:");
+ testTwo_A();
+ testTwo_B();
+ }
+ @Test
+ public void testOne_A()
+ {
+ testCurve(1, BEZIER_CURVE, 0.7031f);
+ }
+
+ @Test
+ public void testOne_B()
+ {
+ testCurve(2, BEZIER_CURVE2, 0.7031f);
+ }
+
+ @Test
+ public void testTwo_A()
+ {
+ testCurve(1, BEZIER_CURVE, 0.0633f);
+ }
+
+ @Test
+ public void testTwo_B()
+ {
+ testCurve(2, BEZIER_CURVE2, 0.0633f);
+ }
+
+ private void testCurve(int curvePos, BezierCurve curve, double curvePointToEvaluate)
+ {
+ System.out.println("Curve "+ curvePos + " Recursive Value at " + curvePointToEvaluate +": " + curve.getCurveValueRecursively(curvePointToEvaluate));
+// System.out.println("Curve "+ curvePos + " Summation Value at " + curvePointToEvaluate +": " + curve.getCurveValueFromSummationExpansion(curvePointToEvaluate));
+
+ }
+
+}
diff --git a/src/com/knotrenderer/model/BezierCurve.java b/src/com/knotrenderer/model/BezierCurve.java
index b90e314..77d0830 100644
--- a/src/com/knotrenderer/model/BezierCurve.java
+++ b/src/com/knotrenderer/model/BezierCurve.java
@@ -34,6 +34,11 @@ private void generateBezierCoefficients()
}
}
+ /**
+ * PDZ- DOESN'T WORK AT THE MOMENT. NEEDS TO BE TWEAKED
+ * @param t
+ * @return
+ */
public PVector getCurveValueFromSummationExpansion(double t)
{
double n = coefficients.length;
@@ -101,4 +106,23 @@ public PVector getCurveValueRecursively(double parametrizedPoint, int leftContro
PVector rightRecurseBranch = getCurveValueRecursively(parametrizedPoint, leftControlPointIndex + 1, rightControlPointIndex).mult((float)parametrizedPoint);
return leftRecurseBranch.add(rightRecurseBranch);
}
+
+ /**
+ * Evaluates and return an array of all the points on the curve at the given spacing. The smaller
+ * the spacing the more points and the more accurate the curve will be. The space cannot be bigger
+ * than 1 since it is evaluated using the parametrized curve.
+ * @param spacing- double: the spacing of the points to be evaluated at (must be less than 1)
+ * @return {@link ArrayList<{@link PVector}>} of all points at the spacings
+ */
+ public ArrayList generateAllDrawPoints(double spacing)
+ {
+ ArrayList bezierPoints = new ArrayList<>();
+
+ for(double i = 0; i <= 1; i+= spacing)
+ {
+ PVector bezierPoint = this.getCurveValueRecursively(i);
+ bezierPoints.add(bezierPoint);
+ }
+ return bezierPoints;
+ }
}
diff --git a/src/com/knotrenderer/util/CurveLoader.java b/src/com/knotrenderer/util/CurveLoader.java
index b7cdca7..967e733 100644
--- a/src/com/knotrenderer/util/CurveLoader.java
+++ b/src/com/knotrenderer/util/CurveLoader.java
@@ -3,6 +3,9 @@
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import com.knotrenderer.model.Curve;
@@ -32,7 +35,7 @@ public static Curve loadCurveFromFile(String path)
//TODO: handle when a line has more or less than 3 coordinates on it (meaning display to the user when it isn't correct)
if(splitString.length != 3)
{
- throw new Exception("File line wasn't the correct lenght. It should have exactly 3 numbers on it.");
+ throw new Exception("File line wasn't the correct length. It should have exactly 3 numbers on it.");
}
else
{
@@ -56,4 +59,51 @@ public static Curve loadCurveFromFile(String path)
return new Curve(knotPoints, path);
}
+
+ public static Curve loadCurveFromInputStream(InputStream inputStream)
+ {
+ ArrayList knotPoints = new ArrayList();
+
+ try{
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
+ String line;
+ while ((line = bufferedReader.readLine()) != null)
+ {
+ if(line.equals("") || line.replaceAll("\\s+", "").startsWith("%"))
+ continue;
+ else
+ {
+ //TODO: handle the case where you have a comment at the end of the line
+ line = line.replaceAll("\\s+", "");
+ String[] splitString = line.split(",");
+
+ //TODO: handle when a line has more or less than 3 coordinates on it (meaning display to the user when it isn't correct)
+ if(splitString.length != 3)
+ {
+ throw new Exception("File line wasn't the correct length. It should have exactly 3 numbers on it.");
+ }
+ else
+ {
+ //TODO: Figure out why there is some precision loss here and how to fix it (compare file to values read in)
+ float x = Float.parseFloat(splitString[0]);
+ float y = Float.parseFloat(splitString[1]);
+ float z = Float.parseFloat(splitString[2]);
+
+ System.out.println("X is: " + x + " Y is: " + y + " Z is: " + z);
+ knotPoints.add(new PVector(x, y, z));
+ }
+
+ }
+ }
+ bufferedReader.close();
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+
+ //TODO: PDZ- We are passing an empty string as a path for now b/c it doens't exist on the server. Need to change how the next curve iteration is generated in the Curve class so that we don't have to
+ //Instantiate a curve with a path
+ return new Curve(knotPoints, "");
+ }
}
diff --git a/src/com/knotrenderer/view/KnotRenderer.java b/src/com/knotrenderer/view/KnotRenderer.java
index 997bc53..6433c5d 100644
--- a/src/com/knotrenderer/view/KnotRenderer.java
+++ b/src/com/knotrenderer/view/KnotRenderer.java
@@ -1,5 +1,8 @@
package com.knotrenderer.view;
+import java.sql.Date;
+import java.text.SimpleDateFormat;
+
import com.knotrenderer.model.Curve;
import com.knotrenderer.util.CurveLoader;
@@ -52,13 +55,16 @@ public void setup()
// Curve curve = CurveLoader.loadCurveFromFile("D:/Peter/College_Grad_School/Independent_Study_Spring_2016_Cont/Knot-Renderer-Processing/Testing_Files/TJP-4th-C1-high-precision.curve");
// Curve curve = CurveLoader.loadCurveFromFile("D:/Peter/College_Grad_School/Independent_Study_Spring_2016_Cont/Knot-Renderer-Processing/Testing_Files/TJP-4_1_stick-unknot-halved-3.curve");
-// Curve curve = CurveLoader.loadCurveFromFile("D:/Peter/College_Grad_School/Independent_Study_Spring_2016_Cont/Knot-Renderer-Processing/Testing_Files/test.curve");
- Curve curve = CurveLoader.loadCurveFromFile("D:/Peter/College_Grad_School/Independent_Study_Spring_2016_Cont/Knot-Renderer-Processing/Testing_Files/TJP-C2.curve");
+ Curve curve = CurveLoader.loadCurveFromFile("D:/Peter/College_Grad_School/Independent_Study_Spring_2016_Cont/Knot-Renderer-Processing/Testing_Files/TJP-4_1_stick-unknot.curve");
+// Curve curve = CurveLoader.loadCurveFromFile("D:/Peter/College_Grad_School/Independent_Study_Spring_2016_Cont/Knot-Renderer-Processing/Testing_Files/TJP-4_1_stick-unknot-halved-2.curve");
// Curve curve = CurveLoader.loadCurveFromFile("/Users/peterzaffetti/UC/Knot-Renderer-Processing/Testing_Files/TJP-4_1_stick-unknot.curve");
// Curve curve = CurveLoader.loadCurveFromFile("/Users/peterzaffetti/UC/Knot-Renderer-Processing/Testing_Files/test.curve");
// Curve curve = CurveLoader.loadCurveFromFile("/Users/peterzaffetti/UC/Knot-Renderer-Processing/Testing_Files/TJP-4_1_stick-unknot-halved-3.curve");
+ Date date = new Date(System.currentTimeMillis());
+ SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
+ System.out.println("Program Started at " + formatter.format(date));
renderCurve = new RenderCurve(this, curve);
}
diff --git a/src/com/knotrenderer/view/KnotRendererApplet.java b/src/com/knotrenderer/view/KnotRendererApplet.java
deleted file mode 100644
index 413bc85..0000000
--- a/src/com/knotrenderer/view/KnotRendererApplet.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.knotrenderer.view;
-
-import java.applet.Applet;
-import java.awt.Graphics;
-
-public class KnotRendererApplet extends Applet
-{
- @Override
- public void init() {
- super.init();
-
- KnotRenderer renderer = new KnotRenderer();
-// renderer.
-
-
- }
-
- @Override
- public void start() {
- super.start();
- }
-
- @Override
- public void paint(Graphics g) {
- super.paint(g);
- }
-}
diff --git a/src/com/knotrenderer/view/RenderCurve.java b/src/com/knotrenderer/view/RenderCurve.java
index 10e6f60..539646c 100644
--- a/src/com/knotrenderer/view/RenderCurve.java
+++ b/src/com/knotrenderer/view/RenderCurve.java
@@ -1,5 +1,8 @@
package com.knotrenderer.view;
+import java.sql.Date;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.Semaphore;
@@ -129,11 +132,12 @@ public void drawBezierCurve()
return;
}
- recursive = bezierCurve.getCurveValueRecursively(0.25);
- summation = bezierCurve.getCurveValueFromSummationExpansion(0.25);
+// recursive = bezierCurve.getCurveValueRecursively(0.25);
+// summation = bezierCurve.getCurveValueFromSummationExpansion(0.25);
- System.out.println("Recurisve = " + recursive);
- System.out.println("Summation = " + summation);
+ Date date = new Date(System.currentTimeMillis());
+ SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
+ System.out.println("Thread joined in at " + formatter.format(date));
applet.stroke(255, 0, 0);
applet.scale(scale);
diff --git a/src/com/knotrenderer/web/PointGeneratorServlet.java b/src/com/knotrenderer/web/PointGeneratorServlet.java
index 238a90a..353e572 100644
--- a/src/com/knotrenderer/web/PointGeneratorServlet.java
+++ b/src/com/knotrenderer/web/PointGeneratorServlet.java
@@ -2,21 +2,35 @@
import java.io.File;
import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.Part;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import com.knotrenderer.model.BezierCurve;
+import com.knotrenderer.model.Curve;
+import com.knotrenderer.util.CurveLoader;
+
+import processing.core.PVector;
+import processing.data.JSONArray;
+import processing.data.JSONObject;
+import sun.security.util.Length;
+
/**
* Servlet implementation class PointGeneratorServlet
*/
@@ -30,14 +44,12 @@ public class PointGeneratorServlet extends HttpServlet {
*/
public PointGeneratorServlet() {
super();
- // TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // TODO Auto-generated method stub
boolean isMultiPart = ServletFileUpload.isMultipartContent(request);
String isMultiPartString = isMultiPart ? "True" : "False";
response.getWriter().append("Serving Ice Cream at: ").append(isMultiPartString);
@@ -48,8 +60,6 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // TODO Auto-generated method stub
-// doGet(request, response);
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart)
{
@@ -69,15 +79,106 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
try {
items = upload.parseRequest(request);
} catch (FileUploadException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Multipart items: " + items);
+ if(items != null)
+ {
+ parseFileItems(items, response);
+ }
+ else
+ {
+ //TODO: PDZ- handle an exception
+ }
+
+ }
+ else
+ {
+ //TODO: PDZ- handle when we get an incorrect (non-multipart) request
}
- System.out.println("POST was called");
- request.getParameterMap();
- doGet(request,response);
+// doGet(request,response);
+ }
+
+ private void parseFileItems(List fileItems, HttpServletResponse response)
+ {
+ System.out.println("Parsing upload");
+ for(FileItem fileItem : fileItems)
+ {
+ if(fileItem.isFormField())
+ {
+ //PDZ- We aren't using form fields at the moment so don't do anything
+ }
+ else //Otherwise, it is a file upload
+ {
+ String fileName = fileItem.getName();
+ String[] fileNameSplit = fileName.split("\\.");
+ System.out.println(fileName);
+ /*
+ * PDZ- Check to see that the uploaded file is in the format "SOME_FILE_NAME.curve"
+ */
+ if(fileNameSplit.length > 1 && fileNameSplit[fileNameSplit.length - 1].equalsIgnoreCase("curve"))
+ {
+ generateKnotPoints(fileItem, response);
+ }
+ else
+ {
+ //TODO: PDZ- handle when the file name isn't correct. Throw the response back with an error code
+ }
+ }
+ }
+ }
+
+ private void generateKnotPoints(FileItem fileItem, HttpServletResponse response)
+ {
+ Curve curve = null;
+ try {
+ curve = CurveLoader.loadCurveFromInputStream(fileItem.getInputStream());
+ } catch (IOException e) {
+ e.printStackTrace();
+ //TODO: PDZ- handle the exception
+ }
+
+ if(curve != null)
+ {
+ ArrayList controlPoints = curve.getKnotPoints();
+ BezierCurve bezierCurve = new BezierCurve(controlPoints);
+ ArrayList drawPoints = bezierCurve.generateAllDrawPoints(0.0001);
+ System.out.println("Generated all the points");
+
+ response.setContentType("application/json");
+ PrintWriter outputWriter;
+ try {
+ outputWriter = response.getWriter();
+ JSONObject drawPointsJSON = generateResponseJSONObject(drawPoints);
+ outputWriter.print(drawPointsJSON);
+ outputWriter.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ //TODO: PDZ- handle the exception and set it in the response
+ }
+ }
+ else
+ {
+ //TODO: PDZ- handle the exception
+ }
+
}
+ private JSONObject generateResponseJSONObject(ArrayList generatedPoints)
+ {
+ JSONObject returnObject = new JSONObject();
+ JSONArray pointsArray = new JSONArray();
+ int position = 0;
+ for(PVector point : generatedPoints)
+ {
+ JSONObject pointJSONObject = new JSONObject();
+ pointJSONObject.setDouble("x", point.x);
+ pointJSONObject.setDouble("y", point.y);
+ pointJSONObject.setDouble("z", point.z);
+ pointsArray.append(pointJSONObject);
+ }
+ returnObject.setJSONArray("points", pointsArray);
+ return returnObject;
+ }
}