# Interactive eraser for a ContourPlot

I recently had my interest peaked by the excellent thread "Exclude data from a list." In particular, the second answer which constructs an interactive eraser which allows one to delete data points in a ListPlot. For example,

data = Table[{RandomReal[{-10, 10}], RandomReal[{-10, 10}]}, {i, 1, 300}];
DynamicModule[{pt = {0, 0}, r = 3},
Column[{Slider[Dynamic[r], {0.1, 5}],
Button["Delete",
data = Select[data, EuclideanDistance[#, pt] > r &]],
LocatorPane[Dynamic[pt],
Dynamic[
ListPlot[data,
Frame -> True,
Axes -> False,
AspectRatio -> 1,
Epilog -> Circle[pt, r],
ImageSize -> 300]],
Appearance -> None]}]]


My question is, can one do something like this with ContourPlot? My idea was to make a contour plot, and then use Union to extract the data points, and plot them with ListPlot to apply the eraser:

F[x_, y_] := x^2 + y^2 - 4;

AB = Union[ContourPlot[{F[x, y] == 0}, {x, -3, 3}, {y, -3, 3}][[1, 1]]];
DynamicModule[{pt = {0, 0}, r = 3},
Column[
{Slider[Dynamic[r], {0.1, 5}],
Button["Delete", AB = Select[AB, EuclideanDistance[#, pt] > r &]],
LocatorPane[Dynamic[pt],
Dynamic[ListPlot[AB,
Frame -> True,
Axes -> False,
AspectRatio -> 1,
Epilog -> Circle[pt, r],
ImageSize -> 300]],
Appearance -> None]}]]


The problem with this attempt is that there's many gaps in the ListPlot. So does anyone know how to improve my awful method? Or perhaps is there another way to erase certain data points from a ContourPlot? If it helps, I don't care about collecting the resulting data points at all; this is purely about plotting a result.

• If F is really the input then taking about erasing points doesn't make sense so much. ContourPlot[{F[x, y] == 0}, {x, -3, 3}, {y, -3, 3}, RegionFunction -> Function[{x, y}, EuclideanDistance[{x, y}, {2, 0}] > 1]] is something to start with, you can also take a look at ImplicitRegion, RegionDifference and friends. – Kuba Aug 12 '16 at 19:27
• @Kuba Why exactly doesn't it make much sense? Maybe I should have said I was hoping to erase certain points in the zero set I told ContourPlot to plot. – Benighted Aug 12 '16 at 20:13
• Because F[x, y] == 0 represents an infinite set of points and using Select approach with sample point representation you will lose precission quite quickly, as you noticed. – Kuba Aug 12 '16 at 20:21

## 1 Answer

Maybe an implementation using ListCurvePathPlot will work for you. With your example contour function it works well. It might not work so well for less well-behaved contours.

F[x_, y_] := x^2 + y^2 - 4
contour =
Union[ContourPlot[{F[x, y] == 0}, {x, -3, 3}, {y, -3, 3}][[1, 1]]];

DynamicModule[{pts = contour, eraser = {0, 0}, eraserR = .2},
Column[
{Row[
{Style["eraser radius ", "SR"],
Slider[Dynamic[eraserR], {.05, 1., .05}], " ",
Dynamic[eraserR]}],
Button["Delete",
pts = Select[pts, EuclideanDistance[#, eraser] > eraserR &]],
LocatorPane[Dynamic[eraser],
Dynamic[ListCurvePathPlot[pts,
Frame -> True,
Axes -> False,
PlotRange -> {{-2, 2}, {-2, 2}},
PlotRangePadding -> Scaled[.05],
Epilog -> Circle[eraser, eraserR],
ImageSize -> 350]],
Appearance -> None]}]]


Here is how it looks at start-up. And this is how it looks after some deletions. 