- Avoid using
White to fill the ouside.
Clear["Global`*"];
hatpolykite = LaminaData["HatPolykite"];
region = hatpolykite["BoundaryMeshRegion"][1];
bd = RegionBounds[region];
{{x1, x2}, {y1, y2}} = ScalingTransform[1.5*{1, 1}, Mean /@ bd]@bd;
space0 = Rectangle[{x1, y1}, {x2, y2}];
obstacles0 = RegionDifference[space0, region];
domain = region;
lines = MeshPrimitives[domain, 1][[;; , 1]];
L = 15;
shadow[loc_, line_] :=
Polygon[{line[[1]] + L*Normalize[line[[1]] - loc], line[[1]],
line[[2]], line[[2]] + L*Normalize[line[[2]] - loc]}];
loc = RandomPoint[region];
regA = Fold[RegionDifference, region, shadow[loc, #] & /@ lines];
regB = RegionDifference[region, regA];
Graphics[{{FaceForm[], EdgeForm[Blue], region}, {Yellow, regA}, {Gray,
regB}, Red, AbsolutePointSize[5], Point@loc}]

Clear["Global`*"];
hatpolykite = LaminaData["HatPolykite"];
region = hatpolykite["BoundaryMeshRegion"][1];
bd = RegionBounds[region];
{{x1, x2}, {y1, y2}} = ScalingTransform[1.2*{1, 1}, Mean /@ bd]@bd;
space0 = Rectangle[{x1, y1}, {x2, y2}];
obstacles0 = RegionDifference[space0, region];
domain = region;
lines = MeshPrimitives[domain, 1][[;; , 1]];
L = 15;
shadow[loc_, line_] :=
Polygon[{line[[1]] + L*Normalize[line[[1]] - loc], line[[1]],
line[[2]], line[[2]] + L*Normalize[line[[2]] - loc]}];
Manipulate[
Module[{regA, regB},
regA = Fold[RegionDifference, region, shadow[loc, #] & /@ lines];
regB = RegionDifference[region, regA];
Graphics[{{FaceForm[], EdgeForm[Blue], region}, {Yellow,
regA}, {Gray, regB}, Red, AbsolutePointSize[5], Point@loc},
PlotRange -> {{x1, x2}, {y1, y2}}]], {{loc, {1, 1}}, Locator,
TrackingFunction -> Function[pos, loc = RegionNearest[domain]@pos],
Appearance -> Graphics[{Red, AbsolutePointSize[10], Point[{0, 0}]}]}]
Original
Clear["Global`*"];
hatpolykite = LaminaData["HatPolykite"];
region = hatpolykite["BoundaryMeshRegion"][1];
bd = RegionBounds[region];
{{x1, x2}, {y1, y2}} = ScalingTransform[1.5*{1, 1}, Mean /@ bd]@bd;
space0 = Rectangle[{x1, y1}, {x2, y2}];
obstacles0 = RegionDifference[space0, region];
domain = region;
lines = MeshPrimitives[domain, 1][[;; , 1]];
L = 15;
shadow[loc_, line_] :=
Polygon[{line[[1]] + L*Normalize[line[[1]] - loc], line[[1]],
line[[2]], line[[2]] + L*Normalize[line[[2]] - loc]}];
Manipulate[
Graphics[{Orange, space0, AbsolutePointSize[10], Red, Point@loc,
Black, shadow[loc, #] & /@ lines, White, obstacles0},
PlotRange -> RegionBounds[domain]], {{loc, {8, 1}}, Locator,
TrackingFunction -> Function[pos, loc = RegionNearest[domain]@pos],
Appearance ->
Graphics[{Red, AbsolutePointSize[10], Point[{0, 0}]}]}]
