1. You can use BSplineFunction
as follows:
pts = {{-1, 0}, {-1, 1}, {0, 0}, {1, 1}, {1, 0}};
ClearAll[explode, bsf]
explode[f_] := f[#] + #2 Cross @ Normalize[f'[#]] &;
bsf = BSplineFunction[pts, SplineClosed -> True];
Graphics[{Thick, BSplineCurve[pts, SplineClosed -> True], Blue,
Line[explode[bsf][#, .2] & /@ Subdivide[100]]}] // Framed

Graphics[{Thick, Line[bsf /@ Subdivide[100]], Blue,
Line[explode[bsf][#, .2] & /@ Subdivide[100]]}] // Framed

2. You can also use bsf
and explode
with ParametricPlot
:
ParametricPlot[{bsf@t, explode[bsf][t, .2], explode[bsf][t, -.1]}, {t, 0, 1},
PlotStyle -> {Black, Blue, Green}, BaseStyle -> Thick, Axes -> False,
ImageSize -> Large]

3. Alternatively, you can use SignedRegionDistance
+ ContourPlot
:
srd = SignedRegionDistance[Polygon[bsf /@ Subdivide[100]]];
ContourPlot[srd[{x, y}], {x, -3/2, 3/2}, {y, -.5, 1},
ContourShading -> None,
Contours -> {{.2, Blue}, {0., {Thick, Black}}},
Frame -> False, ImageSize -> Large, AspectRatio -> Automatic]

Use the options ContourShading ->{PatternFilling["Grid", ImageScaled[1/12]], None,None}
and Epilog->{Red, Disk[{0.,.75},.25], Black,Disk[{-.5,.8},.1],Disk[{.5,.8},.1]}
to get

Related Q/As:
pts = {{-1, 0}, {-1, 1}, {0, 0}, {1, 1}, {1, 0}}; Graphics[{Thick, BSplineCurve[pts, SplineClosed -> True], BSplineCurve[1.1*pts, SplineClosed -> True]}]
? $\endgroup$ – user64494 Aug 14 '20 at 15:34