# Any ideas on how to use the Region context?

If you type

?Region*


you'll get:

which seems a bunch of interesting and not documented symbols.

Any idea (or experience) on how to use them?

Edit

By using our "collective spelunking" I was able to work out this answer - Great! :)

And Silvia used it to write another one!

-
RegionRegionMeasure[Circle[]] -> 2 Pi :) – cormullion Dec 20 '13 at 18:34
Christmas has arrived in your region? :) – cormullion Dec 20 '13 at 18:47
Check this: RegionRegionProperty[Polygon[{{1, 0}, {0, 1}, {2, 3}}], {x, y}, "FastDescription"] – Simon Woods Dec 20 '13 at 22:10
Great find by the way. I wish we could get documentation for some of the useful stuff in these hidden-away packages. – Simon Woods Dec 20 '13 at 22:24
In Simon's footsteps, trying to find valid arguments for RegionProperty I ran Union@Cases[ ToExpression[#, InputForm, DownValues] & /@ Names["Region*"], HoldPattern[RegionRegionProperty[__, s_String]] :> s, Infinity] to find {"Distance", "FastDescription", "ImplicitDescription", "Nearest", "SpaceDimension"}. SpecialRegionProperty can take {"Assumptions", "BoundingBox", "Centroid", "ConvexQ", "Distance", "ImplicitDescription", "InjectiveParametricDescription", "Instance", "Measure", "Nearest", "ParametricDescription", "RegionDimension", "SignedDistance", "SpaceDimension"} – Szabolcs Dec 21 '13 at 0:12

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 *Regions 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[...],GraphicsRegionRegionDumpFillingMethod->"OddEvenRule"]  An example can be found here. - Great! In a few days we'll be able to write a manual! :) – Dr. belisarius Dec 21 '13 at 3:31 @belisarius The Uncomplete Unofficial Documentation for Undocumented Functions :P – Silvia Dec 21 '13 at 4:02 take a look! mathematica.stackexchange.com/a/39206/193 – Dr. belisarius Dec 21 '13 at 6:49 @belisarius Thanks for you and Simon's enlightenment, I found a similar solution :) – Silvia Dec 22 '13 at 0:25 @belisarius Found a new one SimplePolygonPartition :) – Silvia Jan 28 '14 at 6:30 This is quite a find. I've only had time to play with it a little, but are some interesting results: RegionConvexRegionQ[Disk[{1., 0.}]]  True  RegionRegionCentroid[Disk[{1., 0.}]]  {1., 0.}  RegionRegionMeasure[Disk[{1., 0.}]]  π  RegionRegionIntersection[Disk[{0, 0}], Disk[{1, 0}]]  seems to do nothing, but RegionRegionMeasure @ RegionRegionIntersection[Disk[{0, 0}], Disk[{1, 0}]]  -(Sqrt[3]/2) + (2 π)/3  It appears one can create regions and operate on them: box = RegionBoxRegion[{0, 0}, {2, 3}]; RegionRegionMeasure @ box  6  RegionRegionCentroid @ box  {1, 3/2} - +1 And it seems most of them also work for 3D cases. – Silvia Dec 21 '13 at 0:11 Its interesting to note that the Region context is loaded when you evaluate GraphicsRegionRegionInit[]. Old favourite GraphicsMesh gets loaded too. There is some interesting looking stuff in GraphicsRegion, clearly incomplete, for example one of the definitions is this... BoundingRegion[___] := "Implement me..."  I've not done much spelunking yet, but did find this: GraphicsRegionRegionInit[]; RegionConvert[Disk[]] (* MeshRegion[{2, 2}, {951, 2289, 1339}, <>] *) Graphics[Line @ MeshCoordinates[%, 1]]  - "Implement me..." There's some sentient code! – cormullion Dec 22 '13 at 0:02 Four more: RegionNearest[] returns the nearest point inside a region to a given point: AppendTo[$ContextPath, "Region"]

RegionNearest[Disk[], {3, 4}]
(*
{3/5, 4/5}
*)


RegionDifference[] seems to return unevaluated ... but no:

RegionMeasure@RegionDifference[Rectangle[], Disk[]]
(*
1 - π/4
*)


TransformedRegion[] also seems to return unevaluated ... but again:

RegionMeasure@TransformedRegion[Rectangle[], ScalingTransform[{3, 2}]]
(*
6
*)


ParametricRegion[]:

RegionMeasure@ParametricRegion[{{x, y}, 0 < x < 1 && 0 < y < 2}]
(*
2
*)

-
@Silvia RegionMeasure@ParametricRegion[{{x, y}, 0 < x < 1 && 0 < y < 2}] – Dr. belisarius Dec 21 '13 at 5:58
Sorry I missed that.. But ParametricRegion` will be my most interested one :) – Silvia Dec 21 '13 at 5:58
Wow! Brilliant! – Silvia Dec 21 '13 at 5:58