Giter Club home page Giter Club logo

artifex's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

artifex's Issues

specific cubic-cubic intersection not detected

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

lineQuadratic() not finding one specific intersection

Hi,

I'm working with intersections in OPENRNDR and I have the following design made out of 4 segments (two lines and two curves):

image

There should be 5 intersections detected but only 4 are found. The original program simplified to only use the two involved segments looks like this:

fun doTest() {
    val l = Line2.line(Vec2(512.0, 96.0), Vec2(128.0, 384.0))
    val c = Bezier2.curve(Vec2(128.0, 384.0), Vec2(320.0, 168.0), Vec2(512.0, 384.0)) as Bezier2.QuadraticBezier2?
    println(l)
    println(c)
    val i = Intersections.lineQuadratic(l, c)
    println(i.size)
    i.forEach { println(it) }
}

This is the output of the program:

a=[x=512.0, y=96.0], b=[x=128.0, y=384.0]
p0=[x=128.0, y=384.0], p1=[x=320.0, y=168.0], p2=[x=512.0, y=384.0]
0

Zero intersections are found.

This is a visualization of those vertices using Inkscape. Even if the blue line should be a curve, I think it shows that there should be an intersection:

image

Any ideas why this happens?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.