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; + } }