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, line2}, {100,line1}}]];
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?

• – Michael E2 Sep 10 '18 at 16:04
• Pick[data, RegionMember[HalfPlane[{line1, line1}, {0, -1}], data]] – Michael E2 Sep 10 '18 at 16:09

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

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

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[#[]]<=#[]<=line2[#[]]&];

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[#[]] <= #[] &];
{above2, below2} = GeneralUtilities`SelectDiscard[data, line2[#[]] <= #[] &];

{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] 