Java Curve Intersect intersectQuads(double x1, double y1, double x2, double y2, double x3, double y3, double qx1, double qy1, double qx2, double qy2, double qx3, double qy3, double[] params)

Here you can find the source of intersectQuads(double x1, double y1, double x2, double y2, double x3, double y3, double qx1, double qy1, double qx2, double qy2, double qx3, double qy3, double[] params)

Description

Checks whether two quads (x1, y1) - (x2, y2) - (x3, y3) and (qx1, qy1) - (qx2, qy2) - (qx3, qy3) intersect.

License

Apache License

Return

the number of roots that lie in the interval.

Declaration

public static int intersectQuads(double x1, double y1, double x2, double y2, double x3, double y3, double qx1,
        double qy1, double qx2, double qy2, double qx3, double qy3, double[] params) 

Method Source Code

//package com.java2s;
//License from project: Apache License 

public class Main {
    public static final double EPSILON = Math.pow(10, -14);

    /**/*from   ww w .  j  av  a 2 s  .com*/
     * Checks whether two quads (x1, y1) - (x2, y2) - (x3, y3) and (qx1, qy1) - (qx2, qy2) - (qx3,
     * qy3) intersect. The result is saved to {@code params}. Thus {@code params} must be of length
     * at least 4.
     *
     * @return the number of roots that lie in the interval.
     */
    public static int intersectQuads(double x1, double y1, double x2, double y2, double x3, double y3, double qx1,
            double qy1, double qx2, double qy2, double qx3, double qy3, double[] params) {
        double[] initParams = new double[2];
        double[] xCoefs1 = new double[3];
        double[] yCoefs1 = new double[3];
        double[] xCoefs2 = new double[3];
        double[] yCoefs2 = new double[3];
        int quantity = 0;

        xCoefs1[0] = x1 - 2 * x2 + x3;
        xCoefs1[1] = -2 * x1 + 2 * x2;
        xCoefs1[2] = x1;

        yCoefs1[0] = y1 - 2 * y2 + y3;
        yCoefs1[1] = -2 * y1 + 2 * y2;
        yCoefs1[2] = y1;

        xCoefs2[0] = qx1 - 2 * qx2 + qx3;
        xCoefs2[1] = -2 * qx1 + 2 * qx2;
        xCoefs2[2] = qx1;

        yCoefs2[0] = qy1 - 2 * qy2 + qy3;
        yCoefs2[1] = -2 * qy1 + 2 * qy2;
        yCoefs2[2] = qy1;

        // initialize params[0] and params[1]
        params[0] = params[1] = 0.25f;
        quadNewton(xCoefs1, yCoefs1, xCoefs2, yCoefs2, initParams);
        if (initParams[0] <= 1 && initParams[0] >= 0 && initParams[1] >= 0 && initParams[1] <= 1) {
            params[2 * quantity] = initParams[0];
            params[2 * quantity + 1] = initParams[1];
            ++quantity;
        }
        // initialize params
        params[0] = params[1] = 0.75f;
        quadNewton(xCoefs1, yCoefs1, xCoefs2, yCoefs2, params);
        if (initParams[0] <= 1 && initParams[0] >= 0 && initParams[1] >= 0 && initParams[1] <= 1) {
            params[2 * quantity] = initParams[0];
            params[2 * quantity + 1] = initParams[1];
            ++quantity;
        }

        return quantity;
    }

    private static void quadNewton(double xCoefs1[], double yCoefs1[], double xCoefs2[], double yCoefs2[],
            double params[]) {
        double t = 0f, s = 0f;
        double t1 = params[0];
        double s1 = params[1];
        double d, dt, ds;

        while (Math.sqrt((t - t1) * (t - t1) + (s - s1) * (s - s1)) > EPSILON) {
            t = t1;
            s = s1;
            d = -(2 * t * xCoefs1[0] + xCoefs1[1]) * (2 * s * yCoefs2[0] + yCoefs2[1])
                    + (2 * s * xCoefs2[0] + xCoefs2[1]) * (2 * t * yCoefs1[0] + yCoefs1[1]);

            dt = -(t * t * xCoefs1[0] + t * xCoefs1[1] + xCoefs1[1] - s * s * xCoefs2[0] - s * xCoefs2[1]
                    - xCoefs2[2]) * (2 * s * yCoefs2[0] + yCoefs2[1])
                    + (2 * s * xCoefs2[0] + xCoefs2[1]) * (t * t * yCoefs1[0] + t * yCoefs1[1] + yCoefs1[2]
                            - s * s * yCoefs2[0] - s * yCoefs2[1] - yCoefs2[2]);

            ds = (2 * t * xCoefs1[0] + xCoefs1[1])
                    * (t * t * yCoefs1[0] + t * yCoefs1[1] + yCoefs1[2] - s * s * yCoefs2[0] - s * yCoefs2[1]
                            - yCoefs2[2])
                    - (2 * t * yCoefs1[0] + yCoefs1[1]) * (t * t * xCoefs1[0] + t * xCoefs1[1] + xCoefs1[2]
                            - s * s * xCoefs2[0] - s * xCoefs2[1] - xCoefs2[2]);

            t1 = t - dt / d;
            s1 = s - ds / d;
        }
        params[0] = t1;
        params[1] = s1;
    }
}

Related

  1. intersectQuadAndCubic(double qx1, double qy1, double qx2, double qy2, double qx3, double qy3, double cx1, double cy1, double cx2, double cy2, double cx3, double cy3, double cx4, double cy4, double[] params)