diff options
Diffstat (limited to 'platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java')
-rw-r--r-- | platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java | 67 |
1 files changed, 57 insertions, 10 deletions
diff --git a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java index 5fc31e7ff8..c93a900f58 100644 --- a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java +++ b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java @@ -3,33 +3,80 @@ package com.google.skar; import android.graphics.Path; import android.graphics.PointF; +import java.util.ArrayList; + public class SkARFingerPainting { + // Points obtained by touching the screen. The first point is always brough to (0,0). + // All subsequent points are translated by the same amount. + public ArrayList<PointF> points = new ArrayList<>(); + public Path path = new Path(); // Previous point added to the path. This points belongs to the path in local space. public PointF previousPoint; - private int numberOfPoints = 0; - // Holds the model matrix of the first point added to such that the path can be drawn at the // model location (i.e on the Plane) private float[] modelMatrix; - public SkARFingerPainting() {} + private boolean isSmooth; + + public SkARFingerPainting(boolean smooth) { + this.isSmooth = smooth; + } + + public boolean getSmoothness() { + return isSmooth; + } + + public void setSmoothness(boolean smooth) { + isSmooth = smooth; + } // Adds another point to the path in Local space public void addPoint(PointF p) { - if (numberOfPoints == 0) { - path.moveTo(p.x, p.y); + points.add(p); + previousPoint = p; + } + + // Used to build a path before rendering it + public void buildPath() { + if (points.size() < 1) { + return; + } + + path = new Path(); + if (isSmooth) { + // If less than 3 points, than draw a line between the two points + if (points.size() <= 2 && points.size() > 0) { + path.moveTo(points.get(0).x, points.get(0).y); + path.lineTo(points.get(1).x, points.get(1).y); + } else if (points.size() >= 3){ + // Else, essentially run deCasteljau + path.moveTo(points.get(0).x, points.get(0).y); + PointF mid = new PointF((points.get(0).x + points.get(1).x) / 2, + (points.get(0).y + points.get(1).y) / 2); + path.lineTo(mid.x, mid.y); + + for (int i = 1; i < points.size() - 1; i++) { + PointF p1 = points.get(i); + PointF p2 = points.get(i + 1); + PointF midP = new PointF((p1.x + p2.x) / 2,(p1.y + p2.y) / 2); + path.quadTo(p1.x, p1.y, midP.x, midP.y); + } + + path.lineTo(points.get(points.size() - 1).x, points.get(points.size() - 1).y); + } } else { - path.lineTo(p.x, p.y); + path.moveTo(points.get(0).x, points.get(0).y); + for (int i = 1; i < points.size(); i++) { + path.lineTo(points.get(i).x, points.get(i).y); + } } - previousPoint = p; - numberOfPoints++; } public boolean isEmpty() { - return numberOfPoints == 0; + return path.isEmpty(); } public float[] getModelMatrix() { @@ -41,7 +88,7 @@ public class SkARFingerPainting { } public void reset() { + points = new ArrayList<>(); path = new Path(); - numberOfPoints = 0; } } |