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

GeomAPI_ExtremaCurveCurve fails to detect intersection [30316] #305

Open
dpasukhi opened this issue Jan 28, 2025 · 0 comments
Open

GeomAPI_ExtremaCurveCurve fails to detect intersection [30316] #305

dpasukhi opened this issue Jan 28, 2025 · 0 comments
Labels
0. New The issue was created, but not updated by maintainer. Waiting for updates labels and categories 1. Modeling Boolean operations, offsets, primitives, any conversion, brep builders and etc... 2. Bug Something isn't working 7. FreeCAD The issue related to FreeCAD project

Comments

@dpasukhi
Copy link
Member

Description

All the intersections of two offset curves, each of the offset curves having a basis curve being an arc of ellipse, are not detected by the GeomAPI_ExtremaCurveCurve algorithm.

In the attached pictures you can see the two original arcs and the two offset curves on those arcs. This report is about the two intersections of the offset curves, so the intersection is not at the endpoint like in ticket 0030217.

The algorithm only detects the bottom intersection, but not the one at the top (around [-7.1,-0.5]).

More information about what is being tried to accomplish in here:
https://forum.freecadweb.org/viewtopic.php?f=10&t=31700&p=265165#p265038

May be related to ticket 30217

Image

Output of the binary:
OUTPUT VALUES OF THE CURVES:

Arc of Ellipse 1 :
3.749540: (-7.275644,-2.246404,0)
4.256173: (-8.422482,-1.084028,0)
4.762806: (-9.997476,-0.612632,0)
5.269439: (-11.604936,-0.950647,0)
5.776072: (-12.841013,-2.013152,0)
6.282705: (-13.395164,-3.533211,0)
6.789338: (-13.128167,-5.128934,0)
7.295971: (-12.107101,-6.399421,0)
7.802604: (-10.588492,-7.025484,0)
8.309237: (-8.953866,-6.849835,0)
8.815870: (-7.613894,-5.916603,0)

Arc of Ellipse 2 :
3.427630: (-7.613843,-5.916620,0)
3.946857: (-6.363137,-7.268858,0)
4.466084: (-4.565407,-7.837935,0)
4.985311: (-2.694522,-7.473846,0)
5.504538: (-1.243637,-6.272562,0)
6.023765: (-0.595196,-4.550735,0)
6.542992: (-0.920124,-2.762228,0)
7.062219: (-2.132772,-1.378480,0)
7.581446: (-3.913494,-0.764240,0)
8.100673: (-5.792902,-1.081417,0)
8.619900: (-7.275595,-2.246405,0)

Offset Arc of Ellipse 1 :
3.749540: (-6.100171,-1.565646,0)
4.256173: (-7.723394,0.080638,0)
4.762806: (-9.940595,0.744547,0)
5.269439: (-12.205122,0.267937,0)
5.776072: (-13.957389,-1.239283,0)
6.282705: (-14.747802,-3.408550,0)
6.789338: (-14.367174,-5.685738,0)
7.295971: (-12.919871,-7.487803,0)
7.802604: (-10.780575,-8.370205,0)
8.309237: (-8.479384,-8.122642,0)
8.815870: (-6.582633,-6.800723,0)

Offset Arc of Ellipse 2 :
3.427630: (-8.819565,-6.542242,0)
3.946857: (-7.087416,-8.418028,0)
4.466084: (-4.641189,-9.194190,0)
4.985311: (-2.115470,-8.702613,0)
5.504538: (-0.140323,-7.064943,0)
6.023765: (0.757442,-4.675394,0)
6.542992: (0.302230,-2.169759,0)
7.062219: (-1.378655,-0.248668,0)
7.581446: (-3.803608,0.589678,0)
8.100673: (-6.340850,0.161532,0)
8.619900: (-8.357785,-1.425408,0)

Calculate intersection of offset curves

GeomAPI_ExtremaCurveCurve NbExtrema = 1
Extrema nr 1: (-7.845691,-7.830647,0.000000),(-7.845691,-7.830647,0.000000)

Expected Behavior

--

Actual Behavior

--

Sample Code or DRAW Tcl Script

///// c++ code
# include <Geom_Ellipse.hxx>
# include <Geom_Curve.hxx>
# include <Geom_TrimmedCurve.hxx>
# include <Geom_OffsetCurve.hxx>
# include <Geom_Line.hxx>
# include <Geom_Plane.hxx>


# include <GC_MakeEllipse.hxx>
# include <GC_MakeSegment.hxx>
# include <GC_MakeArcOfEllipse.hxx>

# include <gp.hxx>
# include <gp_Ax2.hxx>
# include <gp_Pnt.hxx>
# include <gp_Dir.hxx>
# include <gp_Pln.hxx>
# include <gp_Elips.hxx>

# include <GeomAPI.hxx>
# include <Geom2d_Curve.hxx>
# include <Geom2dAPI_InterCurveCurve.hxx>
# include <GeomAPI_ExtremaCurveCurve.hxx>

int main()
{

    double precision = 1.0e-8;

    // A first arc of ellipse
    // ArcOfEllipse (MajorRadius : 3.28231, MinorRadius : 3.22419, AngleXU : 3.05018,
    // Position : (-10.1267, -3.83438, 0), Direction : (0, 0, 1), Parameter : (3.74954, 8.81587))
    gp_Pnt p1(-10.1267,-3.83438,0);
    gp_Dir norm(0,0,1);

    gp_Ax1 normaxis(p1,norm);

    gp_Ax2 xdir(p1, norm);

    xdir.Rotate(normaxis,3.05018);

    GC_MakeEllipse mc(xdir, 3.28231, 3.22419);

    if (!mc.IsDone()) {
    printf("First ellipse not done");
    return -1;
    }

    GC_MakeArcOfEllipse ma(mc.Value()->Elips(), 3.74954, 8.81587, 1);

    if (!ma.IsDone()) {
        printf("First arc of ellipse not done");
    return -1;
    }

    Handle(Geom_TrimmedCurve) aoe1 = ma.Value();

    // A second arc of ellipse
    // ArcOfEllipse (MajorRadius : 3.7124, MinorRadius : 3.54058, AngleXU : 0.179513,
    // Position : (-4.28788, -4.29777, 0), Direction : (0, -0, 1), Parameter : (3.42763, 8.6199))

    gp_Pnt p2(-4.28788, -4.29777, 0);
    gp_Dir norm2(0,0,1);

    gp_Ax1 normaxis2(p2,norm2);

    gp_Ax2 xdir2(p2, norm2);

    xdir2.Rotate(normaxis2, 0.179513);

    GC_MakeEllipse mc2(xdir2, 3.7124, 3.54058);

    if (!mc2.IsDone()){
        printf("Second ellipse not done");
    return -1;
    }

    GC_MakeArcOfEllipse ma2(mc2.Value()->Elips(), 3.42763, 8.6199, 1);

    if (!ma2.IsDone()){
        printf("Second arc of ellipse not done");
    return -1;
    }

    Handle(Geom_TrimmedCurve) aoe2 = ma2.Value();

    // TEST SETUP: OUTPUT CURVES

    printf("\nOUTPUT VALUES OF THE CURVES:\n");

    auto printcurve = [](Handle(Geom_Curve) c, char const* title) {
    printf("\n%s :\n",title);
        for(double param = c->FirstParameter(); param < c->LastParameter(); param = param + (c->LastParameter()-c->FirstParameter())/10)
            printf("%f: (%f,%f,0)\n", param, c->Value(param).X(),c->Value(param).Y());

          printf("%f: (%f,%f,0)\n", c->LastParameter(), c->Value(c->LastParameter()).X(),c->Value(c->LastParameter()).Y());

    };

    printcurve(aoe1,"Arc of Ellipse 1");
    printcurve(aoe2,"Arc of Ellipse 2");

    // Construct Offset curves from the Arc of Ellipses
    double offset = 1.358370;
    gp_Dir norm3(0,0,1);

    Handle(Geom_OffsetCurve) oaoe1 = new Geom_OffsetCurve(aoe1, offset, norm3);
    Handle(Geom_OffsetCurve) oaoe2 = new Geom_OffsetCurve(aoe2, offset, norm3);

    printcurve(oaoe1,"Offset Arc of Ellipse 1");
    printcurve(oaoe2,"Offset Arc of Ellipse 2");

    // From the output, there are two intersections:
    //Offset Arc of Ellipse 1 :
    //3.749540: (-6.100171,-1.565646,0) <= Cross 1 of offset curves
    //4.256173: (-7.723394,0.080638,0) <= Cross 1 of offset curves
    //4.762806: (-9.940595,0.744547,0)
    //5.269439: (-12.205122,0.267937,0)
    //5.776072: (-13.957389,-1.239283,0)
    //6.282705: (-14.747802,-3.408550,0)
    //6.789338: (-14.367174,-5.685738,0)
    //7.295971: (-12.919871,-7.487803,0)
    //7.802604: (-10.780575,-8.370205,0)
    //8.309237: (-8.479384,-8.122642,0) <= Cross 2 of offset curves
    //8.815870: (-6.582633,-6.800723,0) <= Cross 2 of offset curves

    //Offset Arc of Ellipse 2 :
    //3.427630: (-8.819565,-6.542242,0) <= Cross 2 of offset curves
    //3.946857: (-7.087416,-8.418028,0) <= Cross 2 of offset curves
    //4.466084: (-4.641189,-9.194190,0)
    //4.985311: (-2.115470,-8.702613,0)
    //5.504538: (-0.140323,-7.064943,0)
    //6.023765: (0.757442,-4.675394,0)
    //6.542992: (0.302230,-2.169759,0)
    //7.062219: (-1.378655,-0.248668,0)
    //7.581446: (-3.803608,0.589678,0)
    //8.100673: (-6.340850,0.161532,0) <= Cross 1 of offset curves
    //8.619900: (-8.357785,-1.425408,0) <= Cross 1 of offset curves

    // Calculate intersection of offset curves

    printf("\nCalculate intersection of offset curves\n");

    GeomAPI_ExtremaCurveCurve intersector(oaoe1, oaoe2);

    if (intersector.NbExtrema() == 0 || intersector.LowerDistance() > precision) {
        // No intersection
    printf("\nNo intersection between offset curves\n");
        return -1;
    }
    printf("\nGeomAPI_ExtremaCurveCurve NbExtrema = %d\n",intersector.NbExtrema());

    for (int i = 1; i <= intersector.NbExtrema(); i++) {
        if (intersector.Distance(i) > precision)
            continue;

        gp_Pnt p1, p2;
        intersector.Points(i, p1, p2);

    printf("\tExtrema nr %d: (%f,%f,%f),(%f,%f,%f)\n",i,p1.X(),p1.Y(),p1.Z(),p2.X(),p2.Y(),p2.Z());
    }

    return 0;
}

under ubuntu can be compiled as:

g++ intersector3.cpp -I/usr/include/occt -L/usr/lib/x86_64-linux-gnu -lTKG3d -lTKernel -lTKMath -lTKGeomBase -lTKGeomAlgo -o intersector3

Operating System

Linux

Compiler

GCC

Bitness

64-bit

OCCT Version

latest

Additional Files

No response

@dpasukhi dpasukhi added 0. New The issue was created, but not updated by maintainer. Waiting for updates labels and categories 1. Modeling Boolean operations, offsets, primitives, any conversion, brep builders and etc... 2. Bug Something isn't working 7. FreeCAD The issue related to FreeCAD project labels Jan 28, 2025
@dpasukhi dpasukhi changed the title GeomAPI_ExtremaCurveCurve fails to detect intersection GeomAPI_ExtremaCurveCurve fails to detect intersection [30316] Jan 28, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
0. New The issue was created, but not updated by maintainer. Waiting for updates labels and categories 1. Modeling Boolean operations, offsets, primitives, any conversion, brep builders and etc... 2. Bug Something isn't working 7. FreeCAD The issue related to FreeCAD project
Projects
Status: Todo
Development

No branches or pull requests

1 participant