# Find intersection points between ParametricRegion and other curves

How do you instruct Mathematica to return intersection points between curves as numerical values, when using ParametricRegion to represent at least one of the curves? For example, these are the regions for a line segment and a cubic Bezier curve:

cubicbez[a_, b_, c_, d_, t_] := (1 - t)^3*a + 3*(1 - t)^2*t*b + 3*(1 - t)*t^2*c + t^3*d

bezierRegion[{a_,b_,c_,d_}]:=ParametricRegion[cubicbez[a,b,c,d,t],{{t,0,1}}]

r1=Line[{{2,1},{4,7}}];
r2=bezierRegion[{{0,5},{9,6},{-2,4},{6,3}}];
ri=RegionIntersection[r1,r2];

Show[{Region[r1],Region[r2],Region[ri,BaseStyle->Red]},Frame->True]


As you can see, Mathematica has no trouble finding the intersection points.

I then ask Mathematica to return the coordinates of the intersection points as follows:

MeshCoordinates[DiscretizeRegion[ri]]


which returns

{{3.20154, 4.60463}, {3.42285, 5.26855}}

when using Mathematica 12.3.0.0. I.e., one of the intersections points (the lower left one) is missing.

What would be the proper way to get the intersection points?

(N.B. I know that you can compute the intersections of a cubic Bezier curve and a line in other ways, e.g. algebraically using Cardano's formula, or using numerical methods, but I'd like to know how to use Mathematica's regions for that purpose.)

• MeshCoordinates[DiscretizeRegion[ri, CoordinateBounds[ri]]] gives all three points.
– kglr
Jun 7, 2021 at 7:14
• With version 12.3 one can do: DiscretizeRegion[ri, CoordinateBounds[ri]] // MeshCoordinates or Solve[{x, y} \[Element] r1 && {x, y} \[Element] r2, {x, y}] // N.
– rmw
Jun 7, 2021 at 8:39
• Version 11.2 give me correct result with same code {{2.95674, 3.87023}, {3.20154, 4.60463}, {3.42285, 5.26855}} Jun 7, 2021 at 8:50

Using the two-argument form of DiscretizeRegion we get three points:

MeshCoordinates[DiscretizeRegion[ri, CoordinateBounds[ri]]]

 {{2.95674, 3.87023}, {3.20154, 4.60463}, {3.42285, 5.26855}}


FWIW, we can also use MeshPrimitives to get the three Points:

MeshPrimitives[DiscretizeRegion@ri, 0]

{Point[{2.95674, 3.87023}], Point[{3.20154, 4.60463}], Point[{3.42285, 5.26855}]}

• The expression MeshPrimitives[DiscretizeRegion@ri, 0] yields only the latter two points for me. Maybe its a bug in Mathematica 12.3.0.0 ... . The option CoordinateBounds[ri], however, works nicely. Jun 7, 2021 at 13:01

We can also use RegionMember and Solve or Reduce to get the points.

sol = Solve[RegionMember[ri, {x, y}]]
{x, y} /. sol // N


{{2.95674, 3.87023}, {3.20154, 4.60463}, {3.42285, 5.26855}}