Any ideas on how to use the Region` context?
For a more clear view, here is a table of some of the Region
functions.
AppendTo[$ContextPath, "Region`"]
Clear[testfunc]
testfunc[reg_] := {ToString /@ #, Through[#[reg]]} &[{
ConvexRegionQ,
BoundedRegionQ,
RegionDimension,
Module[{dim = RegionEmbeddingDimension[#]},
var = Symbol["x" <> ToString[#]] & /@ Range[dim];
dim] &,
RegionMeasure,
RegionCentroid,
RegionProperty[#, var, "FastDescription"] &,
RegionProperty[#, var, "ImplicitDescription"] &,
RegionElement,
LevelFunction[RegionProperty[#, var, "FastDescription"][[1, 2]]] &
}] //
Grid[Insert[#, {ConvexRegionQ, BoundedRegionQ, RegionDimension,
RegionEmbeddingDimension, RegionMeasure, RegionCentroid,
FastDescription, ImplicitDescription, RegionElement,
LevelFunction}, 2]\[Transpose], Dividers -> All,
FrameStyle -> GrayLevel[.8], Alignment -> Left] & // Quiet
In addition of BoxRegion, other *Region
s also seems to be used to declare regions:
Names["Region`*Region"]
{"BallRegion", "BooleanRegion", "BoxRegion", "EllipsoidRegion", "EmptyRegion", "FullRegion", "InverseTransformedRegion", "ParametricRegion", "SimplexRegion", "TransformedRegion"}
For example, a 2D triangle embeded in 7D space:
tri3d = RandomInteger[{-10, 10}, {3, 3}];
tri7d = ArrayFlatten[{{tri3d, ConstantArray[0, {3, 4}]}}];
(* a random rotate in 7D space: *)
rt7d = RotationTransform[{{0, 0, 1, 0, 0, 0, 0}, RandomInteger[{-1, 1}, 7]},
ConstantArray[0, 7]];
tri7d = rt7d /@ tri7d;
testfunc@SimplexRegion[tri7d]
Maybe some of them (LevelFunction
) work only on "full-rank" regions?
simplex = Function[dim, SimplexRegion[RandomInteger[{-10, 10}, {dim + 1, dim}]]] @ 4
testfunc @ simplex
Some regions look like special cases:
RegionDimension@EmptyRegion[2]
$-\infty$
RegionMeasure@FullRegion[3]
$\infty$
Edit:
SimplePolygonPartition
can be used to divide self-intersecting Polygon
to simple pieces. The usage is like
SimplePolygonPartition[Polygon[...]]
SimplePolygonPartition[Polygon[...],Graphics`Region`RegionDump`FillingMethod->"OddEvenRule"]
An example can be found here.
This is quite a find. I've only had time to play with it a little, but are some interesting results:
Region`ConvexRegionQ[Disk[{1., 0.}]]
True
Region`RegionCentroid[Disk[{1., 0.}]]
{1., 0.}
Region`RegionMeasure[Disk[{1., 0.}]]
π
Region`RegionIntersection[Disk[{0, 0}], Disk[{1, 0}]]
seems to do nothing, but
Region`RegionMeasure @ Region`RegionIntersection[Disk[{0, 0}], Disk[{1, 0}]]
-(Sqrt[3]/2) + (2 π)/3
It appears one can create regions and operate on them:
box = Region`BoxRegion[{0, 0}, {2, 3}];
Region`RegionMeasure @ box
6
Region`RegionCentroid @ box
{1, 3/2}
Its interesting to note that the Region
context is loaded when you evaluate Graphics`Region`RegionInit[]
. Old favourite Graphics`Mesh
gets loaded too. There is some interesting looking stuff in Graphics`Region
, clearly incomplete, for example one of the definitions is this...
BoundingRegion[___] := "Implement me..."
I've not done much spelunking yet, but did find this:
Graphics`Region`RegionInit[];
RegionConvert[Disk[]]
(* MeshRegion[{2, 2}, {951, 2289, 1339}, <>] *)
Graphics[Line @ MeshCoordinates[%, 1]]