So `DiscretizeGraphics` seems to always miss the first or last point of a `BSplineCurve` (it seems to do it with a `BezierCurve` as well). Here's the simplest example of this,
pts = {{.5, 0}, {1, 0}, {1, 1}, {.5, 1}, {0, 1}, {0, 0}, {.5, 0}};
GraphicsRow[{Graphics@#, DiscretizeGraphics@#} &@BSplineCurve[pts],
ImageSize -> 600]
[![enter image description here][1]][1]
Why does it do this? Not sure, hopefully one of the kernel developers that hang around here can chime in. But I've got a workaround. Just extract the points from the curve, create a `Line` object from them, and discretize that. Inspiration came from [this answer](http://stackoverflow.com/a/28860072/4712538) over on stackoverflow,
discretizableBSplineCurve[pts_, opts : OptionsPattern[]] :=
Line@(BSplineFunction[pts,
Evaluate[FilterRules[{opts}, Options[BSplineCurve]]]] /@
Range[0, 1, .01])
Trying it on the above case,
GraphicsRow[{Graphics@#, DiscretizeGraphics@#} &@
discretizableBSplineCurve[pts], ImageSize -> 600]
[![enter image description here][2]][2]
Here it is applied to puzzle piece M.R. is drawing,
p1 = {discretizableBSplineCurve[{{0.1288208346384372`,
0.24716061799090383`}, {0.18307091717113483`,
0.29633799186027077`}, {0.18104183370580254`,
0.25496700929944494`}, {0.22444189973196066`,
0.2943089083949385`}, {0.18307091717113483`,
0.29633799186027077`}, {0.23732099970383244`,
0.34551536572963765`}},
SplineWeights -> {1, 15, 25, 25, 15, 1}],
discretizableBSplineCurve[{{0.1288208346384372`,
0.47866942629949966`}, {0.18307091717113483`,
0.41209239601456865`}, {0.13474007204408336`,
0.417023175115462`}, {0.17814013807024148`,
0.3637615508875172`}, {0.18307091717113483`,
0.41209239601456865`}, {0.23732099970383244`,
0.34551536572963765`}},
SplineWeights -> {1, 15, 25, 25, 15, 1}],
Line[{{0.1288208346384372`,
0.24716061799090383`}, {0.1288208346384372`,
0.47866942629949966`}}]};
{Graphics@p1, DiscretizeGraphics[p1]}
[![enter image description here][3]][3]
Another way to do it would be to modify 'DiscretGraphics`, that way you can work with objects that still have the head `BSplineCurve`. Here is how I thing that might work, (here `p` is defined as in the OP)
SetAttributes[discretizeGraphics2, Listable];
discretizeGraphics2[graphics_BSplineCurve] :=
DiscretizeGraphics@
Line@(Cases[{graphics}, BSplineCurve[a__] :> BSplineFunction[a],
Infinity][[1]] /@ Range[0, 1, .01]);
discretizeGraphics2[graphics_] := DiscretizeGraphics@graphics
discretizeGraphics2[p]
[![enter image description here][4]][4]
But sadly, this creates a list of `MeshRegion` objects, and I'm not sure how to combine them. Any help on this would be appreciated.
[1]: https://i.sstatic.net/6tnIb.png
[2]: https://i.sstatic.net/WM15g.png
[3]: https://i.sstatic.net/FsZiO.png
[4]: https://i.sstatic.net/9QmCw.png