NOTE: This is an exaggeration, but incorporates a number of techniques that might be applied to many other problems.
Let's take
r[t_] = {2.9 Cos[3.2 Pi t], Sin[4 Pi t] + 5 t};
and the bounds for t
min = 0;
max = 3;
The first step is to extract the intersections from the plot:
curve = ParametricPlot[r[t], {t, min, max}, Axes -> None,
PlotRangePadding -> None]

The pixel positions of the intersections can be extracted with
px = PixelValuePositions[#, White] & @
MorphologicalBranchPoints @ Thinning @ Binarize @ curve
{{74, 410}, {64, 407}, {64, 313}, {74, 311}, {71, 180}, {75,
180}, {74, 50}, {64, 47}}
We need to connect them to the actual coordinates on the plot:
pl = PlotRange@curve
{{-2.9, 2.9}, {0., 15.}}
id = ImageDimensions@curve
{167, 432}
The relation between pl
and id
is linear, $y=ax+b$ and $y=cx+d$ in the horizontal and vertical directions, respecively:
{a, b} = {a, b} /.
First@Solve[{pl[[1, 1]] == b, pl[[1, 2]] == a id[[1]] + b}, {a, b}]
{c, d} = {c, d} /.
First@Solve[{pl[[2, 1]] == d, pl[[2, 2]] == c id[[2]] + d}, {c, d}]
{0.0347305, -2.9}
{0.0347222, 0.}
The pixel positions transformed to plot coordinates:
ic = {a #1 + b, c #2 + d} & @@@ px
{{-0.32994, 14.2361}, {-0.677245, 14.1319}, {-0.677245,
10.8681}, {-0.32994, 10.7986}, {-0.434132, 6.25}, {-0.29521,
6.25}, {-0.32994, 1.73611}, {-0.677245, 1.63194}}
look like this:

Not exactly at the intersections, but this is good enough. We can get rid of the ambiguity with clustering:
clu = ClusterClassify@ic
Method: DBSCAN
Number of classes: 4
g = GatherBy[ic, clu]
{{{-0.32994, 14.2361}, {-0.677245, 14.1319}}, {{-0.677245,
10.8681}, {-0.32994, 10.7986}}, {{-0.434132, 6.25}, {-0.29521,
6.25}}, {{-0.32994, 1.73611}, {-0.677245, 1.63194}}}
icmean = Reverse[Mean /@ g]
{{-0.503593, 1.68403}, {-0.364671, 6.25}, {-0.503593,
10.8333}, {-0.503593, 14.184}}
which works very well:
Show[ParametricPlot[r[t], {t, min, max}, Axes -> None,
PlotRangePadding -> None],
Graphics[{PointSize[Large], Point[#]}] &@icmean]

The above works perfectly, and I believe it answers a number of other questions here: (41496), (78616), (99529), (126847).
Now, to find t
for which the intersection occur, we need to do some careful solving:
ff1 = Flatten@
Table[Select[min < # < max &][
t /. Quiet@NSolve[r[t][[1]] == icmean[[i, 1]], t]], {i, 1,
Length@icmean}]
ff2 = Table[
t /. NSolve[r[t][[2]] == icmean[[i, 2]], t, Reals], {i, 1,
Length@icmean}]
{0.173612, 0.168792, 0.173612, 0.173612}
{{0.140671, 0.174995, 0.451432}, {1.08048, 1.25, 1.41952}, {2.04971,
2.31875, 2.36513}, {2.64067, 2.675, 2.95143}}
and create the set of starting points:
fr = Table[{ff2[[i, 1]], ff2[[i, -1]]}, {i, 1, Length@ff2}]
{{0.140671, 0.451432}, {1.08048, 1.41952}, {2.04971,
2.36513}, {2.64067, 2.95143}}
and now use Xavier's idea
final = {t1, t2} /.
Table[FindRoot[
r[t2] - r[t1], {{t1, fr[[i, 1]]}, {t2, fr[[i, 2]]}}], {i, 1,
Length@fr}]
{{0.173318, 0.451682}, {1.08048, 1.41952}, {2.04832,
2.32668}, {2.67332, 2.95168}}
Each pair {t1, t2}
should correspond to one intersection:
points = Table[
Graphics[{Red, Disk[r[Flatten[final][[i]]], .1]}], {i, 1,
Length@Flatten[final]}];

All solutions have been found in an automated manner.
t
s where the plot "comes back", e.g. $(x,y)=(-2.9,0.9)$? $\endgroup$