First of all, we need 2 more options in `boundedOpenCone`

. The option `BoundaryStyle -> Automatic`

creates a `Line`

on the boundary so we can easily locate the coordinates of point on the boundary. `PlotPoints -> 100`

isn’t actually necessary, but will make the resulting boundary smoother.

```
boundedOpenCone(centre_, tip_, Rc_, vec1_, vec2_, sign_) :=
Module({v1, v2, v3, e1, e2,
e3},(*function to make 3d parametric plot of the section of a cone bounded between
two vectors:tvec1 and tvec2*){v1, v2, v3} = # & /@ HodgeDual(centre - tip);
e1 = Normalize(v1);
e3 = Normalize(centre - tip);
e2 = Cross(e1, e3);
ParametricPlot3D(
s*tip + (1 - s)*(centre + Rc*(Cos(t)*e1 + Sin(t)*e2)), {t, 0, 2 (Pi)}, {s, 0, 1},
Boxed -> False, Axes -> False, Mesh -> None, BoundaryStyle -> Automatic,
RegionFunction ->
Function({x, y, z},
RegionMember(HalfSpace(sign*Cross(vec1 - tip, vec2 - tip), tip), {x, y, z})),
PlotPoints -> 100, PlotStyle -> ColorData("Rainbow")(1)))
vec1 = {1, 0, 0}; vec2 = (1/Sqrt(2))*{1, 1, 0};
coneTip = {0, 0, 3};
cvec = {0, 0, 0};
Rc = Norm(vec1 - cvec);
pplot = boundedOpenCone(cvec, coneTip, Rc, vec1, vec2, -1);
```

Then we modify `normalsShow`

from the document of `VertexNormals`

a little to preserve only the normals on the boundary:

```
boundarynormals(g_Graphics3D) :=
Module({pl, vl, boundaryindexlst = Flatten@Cases(g, Line(a_) :> a, Infinity)},
{pl, vl} = First@Cases(g,
GraphicsComplex(pl_, prims_, VertexNormals -> vl_,
opts___?OptionQ) :> {pl, vl}(Transpose)((boundaryindexlst))(Transpose),
Infinity);
Transpose@{pl, pl + vl/3});
vectors = boundarynormals@pplot;
Graphics3D({Arrowheads(0.01), Arrow@vectors})~Show~pplot
```