Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

specific cubic-cubic intersection not detected #4

Open
hamoid opened this issue Feb 25, 2021 · 0 comments
Open

specific cubic-cubic intersection not detected #4

hamoid opened this issue Feb 25, 2021 · 0 comments

Comments

@hamoid
Copy link

hamoid commented Feb 25, 2021

I found some cases in which intersections between cubic curves are not detected.
As the algorithm is iterative it is harder for me to figure out at which point something goes wrong.

Here a test program that can be dropped into src/io/lacuna/artifex:

package io.lacuna.artifex;

import io.lacuna.artifex.utils.Intersections;

public class TEST2 {
    public static void main(String[] args) {
        Vec2 s0 = new Vec2(435.3194971681168, 905.231313655894);
        Vec2 a0 = new Vec2(436.60194226635423, 904.5228510213844);
        Vec2 b0 = new Vec2(438.3935801257989, 904.1857845636355);
        Vec2 e0 = new Vec2(440.3919343740061, 904.1270373708342);

        Vec2 s1 = new Vec2(435.198246034818, 896.3191997888123);
        Vec2 a1 = new Vec2(436.84762896823827, 898.9951604687135);
        Vec2 b1 = new Vec2(438.2241643938649, 902.5923131816958);
        Vec2 e1 = new Vec2(439.1164972433261, 906.1884150468093);

        // SVG for debugging
        System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<svg width=\"420mm\" height=\"297mm\" version=\"1.1\" viewBox=\"0 0 420 297\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n" +
                " <g fill=\"none\" stroke=\"#000\" stroke-width=\".01\">");
        System.out.println("<path d=\"M " + s0.x + "," + s0.y +
                " L " + a0.x + "," + a0.y +
                " L " + b0.x + "," + b0.y +
                " L " + e0.x + "," + e0.y + "\" />");

        System.out.println("<path d=\"M " + s1.x + "," + s1.y +
                " L " + a1.x + "," + a1.y +
                " L " + b1.x + "," + b1.y +
                " L " + e1.x + "," + e1.y + "\" />");
        System.out.println(" </g>\n" + "</svg>\n");

        Bezier2.CubicBezier2 curve0 = (Bezier2.CubicBezier2) Bezier2.curve(s0, a0, b0, e0);
        Bezier2.CubicBezier2 curve1 = (Bezier2.CubicBezier2) Bezier2.curve(s1, a1, b1, e1);
        test2(curve0, curve1);
    }

    private static void test2(Bezier2.CubicBezier2 curve0, Bezier2.CubicBezier2 curve1) {
        System.out.println("\n# Intersections between");
        System.out.println("curve 0: " + curve0);
        System.out.println("curve 1: " + curve1);

        Vec2[] intersections = Intersections.intersections(curve0, curve1);
        System.out.println(intersections.length + " intersections");
        for (Vec2 intersection : intersections) {
            System.out.println(intersection);
        }
    }
}

The output of the program:

<?xml version="1.0" encoding="UTF-8"?>
<svg width="420mm" height="297mm" version="1.1" viewBox="0 0 420 297" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
 <g fill="none" stroke="#000" stroke-width=".01">
<path d="M 435.3194971681168,905.231313655894 L 436.60194226635423,904.5228510213844 L 438.3935801257989,904.1857845636355 L 440.3919343740061,904.1270373708342" />
<path d="M 435.198246034818,896.3191997888123 L 436.84762896823827,898.9951604687135 L 438.2241643938649,902.5923131816958 L 439.1164972433261,906.1884150468093" />
 </g>
</svg>


# Intersections between
curve 0: p0=[x=435.3194971681168, y=905.231313655894], p1=[x=436.60194226635423, y=904.5228510213844], p2=[x=438.3935801257989, y=904.1857845636355], p3=[x=440.3919343740061, y=904.1270373708342]
curve 1: p0=[x=435.198246034818, y=896.3191997888123], p1=[x=436.84762896823827, y=898.9951604687135], p2=[x=438.2241643938649, y=902.5923131816958], p3=[x=439.1164972433261, y=906.1884150468093]
0 intersections

And the produced svg (bounding boxes, vertices and colors rendered by Inkscape)
2021-02-25-143955_428x776_scrot

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant