# Selecting points on either side of a curve

I have the following array of data. Suppose I want only to keep data within the two lines. I can achieve my result using the following code:

data = Table[{i, RandomReal[{-10, 10}]}, {i, 0, 100}];
line1[x_] := 0.1 x - 10;
line2[x_] := -0.1 x + 10;


rf = RegionMember[Polygon[{{0, line1[0]}, {0, line2[0]}, {100,line1[100]}}]];
bool1 = rf[data];
notbool1 = Not[#] & /@ bool1
datain = Pick[data, bool1];
dataout = Pick[data, notbool1];


This has the desired effect.

Now suppose I only have one line, since I can't make a closed region what would be the best way to select points either above or below a line? What if the curve is not a straight line? Any ideas?

• Sep 10, 2018 at 16:04
• Pick[data, RegionMember[HalfPlane[{line1[0], line1[1]}, {0, -1}], data]] Sep 10, 2018 at 16:09

Some knowledge about (planar) analytic geometry facilitates this problem. Suppose now you only have line1, this

Select[data, line1[ #[[1]] ] < #[[2]] &]


selects out the points above line1; the key lies in the inequality. If it is connected by >, then the points below line1 you will get.

{in, out} = GeneralUtilitiesSelectDiscard[data, line1[#[[1]]]<=#[[2]]<=line2[#[[1]]]&];

Show[ListPlot[{in, out}, PlotStyle -> {Green, Red}],
Plot[{line1@x, line2@x}, {x, 0, 100},
Filling -> {1 -> {{2}, {Opacity[.5, LightBlue], None}}}]]


{above1, below1} = GeneralUtilitiesSelectDiscard[data, line1[#[[1]]] <= #[[2]] &];
{above2, below2} = GeneralUtilitiesSelectDiscard[data, line2[#[[1]]] <= #[[2]] &];

{plt1, plt2} = Show[ListPlot[#, PlotStyle -> {Green, Red}],
Plot[{line1@x, line2@x}, {x, 0, 100},
Filling -> {1 -> {{2}, {Opacity[.5, LightBlue], None}}}]] & /@
{{above1,below1}, {above2, below2} };
Row[{plt1, plt2}, Spacer[5]]
`