# Find intersections points with axes

Let's create some points corresponding to a simple closed curve

C0 = ContourPlot[x^2/4 + y^2/9 == 1, {x, -5, 5}, {y, -5, 5}, PlotPoints -> 100];
data = C0[[1, 1]];
S0 = ListPlot[data, PlotStyle -> {Blue, PointSize[0.005]}]


Now I would like to find the intersection points with the two axes. In this example the solutions should be $x = \pm 2$ and $y = \pm 3$.

IMPORTANT NOTE: The real data file corresponds to a closed curve with unknown analytical equation, so in the suggested solution you should not take into account the equation of the ellipse, only data is known.

• What version are you on? C0[[1, 1]] works for extracting points in old versions, but not in the new ones. – J. M. is away Nov 21 '15 at 18:00
• @J.M. I have v9.0. – Vaggelis_Z Nov 21 '15 at 18:02
• @J.M. BTW, if I want to extract points in v10 what should I use? – Vaggelis_Z Nov 21 '15 at 18:09
• @J.M. Actually C0[[1,1]] works just fine in v10.3: it extracts the actual coordinates of the points from the GraphicsComplex generated by ContourPlot. – MarcoB Nov 21 '15 at 18:50
• @Marco, ah, right; nevertheless, it's not really the best way of extracting those points. – J. M. is away Nov 21 '15 at 19:05

Get rid of duplicate x values we can feed to an interpolation function

domain = Select[Tally[data[[All, 1]]], #[[2]] == 1 &][[All, 1]];


Create Interpolation functions and evaluate at 0 These are for the top and bottom halves of the fn

Interpolation[Select[data, #[[2]] < 0 && MemberQ[domain, #[[1]]] &]][0]
Interpolation[Select[data, #[[2]] > 0 && MemberQ[domain, #[[1]]] &]][0]

-2.99994
2.99994


Max and Min on the domain can approximate the x intercepts:

Max[domain]
Min[domain]

1.99985
-1.99985


## EDIT

Assuming your ellipse isn't 0-centered you will need exact x-intercepts

This requires a second domain and second set of interpolating functions, necessitating a transposition and reevaluation.

data2 = Reverse /@ data;
domain2 = Select[Tally[data2[[All, 1]]], #[[2]] == 1 &][[All, 1]];

Interpolation[Select[data2, #[[2]] < 0 && MemberQ[domain2, #[[1]]] &]][0]
Interpolation[Select[data2, #[[2]] > 0 && MemberQ[domain2, #[[1]]] &]][0]

-1.99996
1.99996

• It works like a charm! However I think that the second Max and Min of the domain approximate the x intercepts, not y, right? – Vaggelis_Z Nov 21 '15 at 19:16
• @Vaggelis_Z correct! made the edit in the answer – Peter Roberge Nov 21 '15 at 19:18
• @Vaggelis_Z please see the edit I made to actually solve for the x-intercepts, which will allow for your data to not be centered on 0 – Peter Roberge Nov 23 '15 at 1:16