Skip to Content.
Sympa Menu

cgal-discuss - Re: [cgal-discuss] Polygon adding circular arc work in some cases but not always

Subject: CGAL users discussion list

List archive

Re: [cgal-discuss] Polygon adding circular arc work in some cases but not always


Chronological Thread 
  • From: Efi Fogel <>
  • To:
  • Subject: Re: [cgal-discuss] Polygon adding circular arc work in some cases but not always
  • Date: Sat, 25 Nov 2023 10:53:22 +0200
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None ; spf=Pass ; spf=None
  • Ironport-data: A9a23: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
  • Ironport-hdrordr: A9a23:5+q396E1wZgr3CANpLqE0ceALOsnbusQ8zAXPiFKOGVom6mj/f xG885rsCMc5AxhOk3I3OrwW5VoIkm8yXcW2/h0AV7KZmCP01dAbrsD0WKI+UyGJ8SRzJ866U 6iScRD4R/LYGSSQfyU3OBwKbgd/OU=
  • Ironport-phdr: A9a23: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 1s41lc4buMq+zPhpVwwIwiSzBY=
  • Ironport-sdr: 6561b618_Lm6quZ8HurcEh071yDj+4ecW6/mcZw3uPAiqtROVrorLUfJ 5H8QeCegpPWMxojhEgqleG757y4BGJWoH1O1HDA==

Please provide a complete stand-alone example that compiles.
   ____  _        ____             _
  /_____/_) o    /__________  __  //
 (____ (   (    (    (_/ (_/-(-'_(/
                         _/




On Fri, 24 Nov 2023 at 23:44, Nicklas SB Karlsson <> wrote:
Have been able to make polygons with connected lines, circles and
boolean operations in between them. While possible to make polygons with
circular arcs using boolean operations of these it is not a desirable
solution. Preferred solution is of course to add lines and then needed
circular arcs.


Have code below that for some angles cases succeed making a polygon with
half circle and a line connecting the two endpoints example in attached
picture. It seems to work perfect for different angles then circle is to
the right the first if condition if(p2.y() < p3.y()) in code snippet
below. But for the second if condition if(p2.y() > p3.y()) it only seems
to work then pointing to the left the angle=PI but otherwise fail with
the error message at bottom. Suspect this is because something does not
fit perfectly together for example the points on the circle. Guess I am
not the first person try to do this. Anybody have any suggestions how to
make it work?


typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2 K_Point_2;
typedef CGAL::Arr_circle_segment_traits_2<Kernel>::Point_2 Apoint_2;
typedef Kernel::Circle_2 K_Circle_2;
typedef CGAL::Gps_circle_segment_traits_2<Kernel> Traits_2; /* The
traits class Gps_circle_segment_traits_2 models the
GeneralPolygonSetTraits_2 concept.
                                                                      *
It enables Boolean set-operations on general polygons bounded by linear
segments or circular arcs. It should be parameterized with a kernel. */
typedef CGAL::General_polygon_set_2<Traits_2> Polygon_set_2;
typedef Traits_2::General_polygon_2 Polygon_2;
typedef Traits_2::General_polygon_with_holes_2 Polygon_with_holes_2;
typedef Traits_2::Curve_2                                 Curve_2;
typedef Traits_2::X_monotone_curve_2 X_monotone_curve_2;
typedef Traits_2::CoordNT                                 coordnt;

tool_type::tool_type(point_type pOld, point_type pNew)
{
   const double xOld = pOld.x;
   const double yOld = pOld.y;
   const double xNew = pNew.x;
   const double yNew = pNew.y;
   const double radius = 6;
   const double angle = atan2(yNew-yOld, xNew-xOld);
   const FT radiusFT = radius;

   {
     const K_Point_2 p0(xOld+radius*std::cos(angle + M_PI/2),
yOld+radius*std::sin(angle + M_PI/2)); // angle zero and pNew to the right
     const K_Point_2 p1(xOld+radius*std::cos(angle - M_PI/2),
yOld+radius*std::sin(angle - M_PI/2)); // of pOld arrangement below:
     const K_Point_2 p2(xNew+radius*std::cos(angle - M_PI/2),
yNew+radius*std::sin(angle - M_PI/2)); //   p0 p3
     const K_Point_2 p3(xNew+radius*std::cos(angle + M_PI/2),
yNew+radius*std::sin(angle + M_PI/2)); //   p1 p2

     {
       Polygon_2 pgn;
       const K_Circle_2 tool_circle(K_Point_2(xOld,yOld),
radiusFT*radiusFT);
       const K_Circle_2 tool_circle2(p2, p3, CGAL::COUNTERCLOCKWISE);
       toolFront = construct_polygon(tool_circle);
       monotone_curves_type cc;// = construct_circular_arc(tool_circle2,
radiusFT, p2, p3, CGAL::COUNTERCLOCKWISE); // Test function remove!!
then done
       if(p2.y() < p3.y())
       {
         const Apoint_2 p(p2.x(), p2.y());
         const K_Point_2 pRight(xNew + radius, yNew);
         const Apoint_2 r(p3.x(), p3.y());
         const K_Circle_2 c(p2, pRight, p3);
         const K_Point_2 center = c.center();
         const Apoint_2 q(pRight.x(), pRight.y());

         cc.x1 = X_monotone_curve_2(c, p, q, CGAL::COUNTERCLOCKWISE);
         cc.x2 = X_monotone_curve_2(c, q, r, CGAL::COUNTERCLOCKWISE);
         cc.valid = 2;
       }
       if(p2.y() > p3.y())
       {
         const Apoint_2 p(p2.x(), p2.y());
         const K_Point_2 pLeft(xNew - radius, yNew);
         const Apoint_2 r(p3.x(), p3.y());
         const K_Circle_2 c(p2, pLeft, p3);
         const K_Point_2 center = c.center();
         const Apoint_2 q(pLeft.x(), pLeft.y());

         cc.x1 = X_monotone_curve_2(c, p, q, CGAL::COUNTERCLOCKWISE);
         cc.x2 = X_monotone_curve_2(c, q, r, CGAL::COUNTERCLOCKWISE);
         cc.valid = 2;
       }
       pgn.push_back(cc.x1);
       pgn.push_back(cc.x2);
       pgn.push_back(X_monotone_curve_2(p3, p2));

       closed.insert(pgn);
     }
   }
}

terminate called after throwing an instance of
'CGAL::Precondition_exception'

   what(): CGAL ERROR: precondition violation!

Expr: cv1.point_position (p) == EQUAL && cv2.point_position (p) == EQUAL

File: /usr/include/CGAL/Arr_circle_segments_traits2.h

Line: 255

Aborted


For the curios persons it should be used to iteratively calculate tool
path for a CNC machine. If Successful I will try to add it to the CAM
module called path workbench in Freecad. At first tried to use the
builtin representation of material and tool shape but seems I got some
accuracy problem. Then I tried Open Cascade which Freecad use internally
or are built upon so to say but calculations where slow. So then I
decided to switch to CGAL as I had seen before it have an impressive
list of developers so guess it is the best possible to get.



Nicklas SB Karlsson

--
You are currently subscribed to cgal-discuss.
To unsubscribe or access the archives, go to
https://sympa.inria.fr/sympa/info/cgal-discuss





Archive powered by MHonArc 2.6.19+.

Top of Page