Java Code Examples for android.graphics.Path#rCubicTo()

The following examples show how to use android.graphics.Path#rCubicTo() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: CubicBezierCurve2D.java    From ncalc with GNU General Public License v3.0 5 votes vote down vote up
public Path getGeneralPath() {
    Path path = new Path();
    path.moveTo((float) x1, (float) y1);

    path.rCubicTo((float) ctrlx1, (float) ctrly1, (float) ctrlx2, (float) ctrly2, (float) x2, (float) y2);

    return path;
}
 
Example 2
Source File: EllipseArc2D.java    From ncalc with GNU General Public License v3.0 5 votes vote down vote up
public Path appendPath(Path path) {
    // number of curves to approximate the arc
    int nSeg = (int) ceil(abs(angleExtent) / (PI / 2));
    nSeg = min(nSeg, 4);

    // angular extent of each curve
    double ext = angleExtent / nSeg;

    // compute coefficient
    double k = btan(abs(ext));

    for (int i = 0; i < nSeg; i++) {
        // position of the two extremities
        double ti0 = abs(i * ext);
        double ti1 = abs((i + 1) * ext);

        // extremity points
        Point2D p1 = this.point(ti0);
        Point2D p2 = this.point(ti1);

        // tangent vectors, multiplied by appropriate coefficient
        Vector2D v1 = this.tangent(ti0).times(k);
        Vector2D v2 = this.tangent(ti1).times(k);

        // append a cubic curve to the path
        path.rCubicTo((float) (p1.x() + v1.x()), (float) (p1.y() + v1.y()),
                (float) (p2.x() - v2.x()), (float) (p2.y() - v2.y()),
                (float) p2.x(), (float) p2.y());
    }
    return path;
}
 
Example 3
Source File: CircleArc2D.java    From ncalc with GNU General Public License v3.0 5 votes vote down vote up
public Path appendPath(Path path) {
    // number of curves to approximate the arc
    int nSeg = (int) ceil(abs(angleExtent) / (PI / 2));
    nSeg = min(nSeg, 4);

    // angular extent of each curve
    double ext = angleExtent / nSeg;

    // compute coefficient
    double k = btan(abs(ext));

    for (int i = 0; i < nSeg; i++) {
        // position of the two extremities
        double ti0 = abs(i * ext);
        double ti1 = abs((i + 1) * ext);

        // extremity points
        Point2D p1 = this.point(ti0);
        Point2D p2 = this.point(ti1);

        // tangent vectors, multiplied by appropriate coefficient
        Vector2D v1 = this.tangent(ti0).times(k);
        Vector2D v2 = this.tangent(ti1).times(k);

        // append a cubic curve to the path
        path.rCubicTo(
                (float) (p1.x() + v1.x()), (float) (p1.y() + v1.y()),
                (float) (p2.x() - v2.x()), (float) (p2.y() - v2.y()),
                (float) (p2.x()), (float) (p2.y()));
    }
    return path;
}
 
Example 4
Source File: RoundedCornersDrawable.java    From Dashchan with Apache License 2.0 5 votes vote down vote up
@Override
public void setBounds(int left, int top, int right, int bottom) {
	Rect bounds = getBounds();
	if (bounds.left != left || bounds.top != top || bounds.right != right || bounds.bottom != bottom) {
		Path path = this.path;
		path.rewind();
		float radius = this.radius;
		float shift = ((float) Math.sqrt(2) - 1f) * radius * 4f / 3f;
		path.moveTo(left, top);
		path.rLineTo(radius, 0);
		path.rCubicTo(-shift, 0, -radius, radius - shift, -radius, radius);
		path.close();
		path.moveTo(right, top);
		path.rLineTo(-radius, 0);
		path.rCubicTo(shift, 0, radius, radius - shift, radius, radius);
		path.close();
		path.moveTo(left, bottom);
		path.rLineTo(radius, 0);
		path.rCubicTo(-shift, 0, -radius, shift - radius, -radius, -radius);
		path.close();
		path.moveTo(right, bottom);
		path.rLineTo(-radius, 0);
		path.rCubicTo(shift, 0, radius, shift - radius, radius, -radius);
		path.close();
	}
	super.setBounds(left, top, right, bottom);
}
 
Example 5
Source File: SVGAPath.java    From VideoOS-Android-SDK with GNU General Public License v3.0 4 votes vote down vote up
private void operate(Path finalPath, String method, StringTokenizer args) {
    float x0 = 0.0f;
    float y0 = 0.0f;
    float x1 = 0.0f;
    float y1 = 0.0f;
    float x2 = 0.0f;
    float y2 = 0.0f;
    try {
        int index = 0;
        while (args.hasMoreTokens()) {
            String s = args.nextToken();
            if (TextUtils.isEmpty(s)) {
                continue;
            }
            if (index == 0) {
                x0 = Float.valueOf(s);
            }
            if (index == 1) {
                y0 = Float.valueOf(s);
            }
            if (index == 2) {
                x1 = Float.valueOf(s);
            }
            if (index == 3) {
                y1 = Float.valueOf(s);
            }
            if (index == 4) {
                x2 = Float.valueOf(s);
            }
            if (index == 5) {
                y2 = Float.valueOf(s);
            }
            index++;
        }
    } catch (Exception e) {
    }
    SVGAPoint currentPoint = new SVGAPoint(0.0f, 0.0f, 0.0f);
    if ("M".equals(method)) {
        finalPath.moveTo(x0, y0);
        currentPoint = new SVGAPoint(x0, y0, 0.0f);
    } else if ("m".equals(method)) {
        finalPath.rMoveTo(x0, y0);
        currentPoint = new SVGAPoint(currentPoint.x + x0, currentPoint.y + y0, 0.0f);
    }
    if ("L".equals(method)) {
        finalPath.lineTo(x0, y0);
    } else if ("l".equals(method)) {
        finalPath.rLineTo(x0, y0);
    }
    if ("C".equals(method)) {
        finalPath.cubicTo(x0, y0, x1, y1, x2, y2);
    } else if ("c".equals(method)) {
        finalPath.rCubicTo(x0, y0, x1, y1, x2, y2);
    }
    if ("Q".equals(method)) {
        finalPath.quadTo(x0, y0, x1, y1);
    } else if ("q".equals(method)) {
        finalPath.rQuadTo(x0, y0, x1, y1);
    }
    if ("H".equals(method)) {
        finalPath.lineTo(x0, currentPoint.y);
    } else if ("h".equals(method)) {
        finalPath.rLineTo(x0, 0f);
    }
    if ("V".equals(method)) {
        finalPath.lineTo(currentPoint.x, x0);
    } else if ("v".equals(method)) {
        finalPath.rLineTo(0f, x0);
    }
    if ("Z".equals(method)) {
        finalPath.close();
    } else if ("z".equals(method)) {
        finalPath.close();
    }

}
 
Example 6
Source File: CubicBezierCurve2D.java    From ncalc with GNU General Public License v3.0 4 votes vote down vote up
public Path appendPath(Path path) {
    path.moveTo((float) x1, (float) y1);

    path.rCubicTo((float) ctrlx1, (float) ctrly1, (float) ctrlx2, (float) ctrly2, (float) x2, (float) y2);
    return path;
}
 
Example 7
Source File: VectorPathParser.java    From SVG-Android with Apache License 2.0 4 votes vote down vote up
private static void arcToBezier(Path p,
                                double cx,
                                double cy,
                                double a,
                                double b,
                                double e1x,
                                double e1y,
                                double theta,
                                double start,
                                double sweep) {
    int numSegments = (int) Math.ceil(Math.abs(sweep * 4 / Math.PI));

    double eta1 = start;
    double cosTheta = Math.cos(theta);
    double sinTheta = Math.sin(theta);
    double cosEta1 = Math.cos(eta1);
    double sinEta1 = Math.sin(eta1);
    double ep1x = (-a * cosTheta * sinEta1) - (b * sinTheta * cosEta1);
    double ep1y = (-a * sinTheta * sinEta1) + (b * cosTheta * cosEta1);

    double anglePerSegment = sweep / numSegments;
    for (int i = 0; i < numSegments; i++) {
        double eta2 = eta1 + anglePerSegment;
        double sinEta2 = Math.sin(eta2);
        double cosEta2 = Math.cos(eta2);
        double e2x = cx + (a * cosTheta * cosEta2) - (b * sinTheta * sinEta2);
        double e2y = cy + (a * sinTheta * cosEta2) + (b * cosTheta * sinEta2);
        double ep2x = -a * cosTheta * sinEta2 - b * sinTheta * cosEta2;
        double ep2y = -a * sinTheta * sinEta2 + b * cosTheta * cosEta2;
        double tanDiff2 = Math.tan((eta2 - eta1) / 2);
        double alpha =
                Math.sin(eta2 - eta1) * (Math.sqrt(4 + (3 * tanDiff2 * tanDiff2)) - 1) / 3;
        double q1x = e1x + alpha * ep1x;
        double q1y = e1y + alpha * ep1y;
        double q2x = e2x - alpha * ep2x;
        double q2y = e2y - alpha * ep2y;

        final float delta_q1x = (float) q1x - (float) e1x;
        final float delta_q1y = (float) q1y - (float) e1y;
        final float delta_q2x = (float) q2x - (float) e1x;
        final float delta_q2y = (float) q2y - (float) e1y;
        final float delta_e2x = (float) e2x - (float) e1x;
        final float delta_e2y = (float) e2y - (float) e1y;

        p.rCubicTo(delta_q1x, delta_q1y, delta_q2x, delta_q2y, delta_e2x, delta_e2y);

        eta1 = eta2;
        e1x = e2x;
        e1y = e2y;
        ep1x = ep2x;
        ep1y = ep2y;
    }
}