37

If you type

?Region`*

you'll get:

Mathematica graphics

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!

Dr. belisarius
  • 115,881
  • 13
  • 203
  • 453

5 Answers5

16

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]

test for 7D triangle

Maybe some of them (LevelFunction) work only on "full-rank" regions?

simplex = Function[dim, SimplexRegion[RandomInteger[{-10, 10}, {dim + 1, dim}]]] @ 4
testfunc @ simplex

test for 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.

Silvia
  • 27,556
  • 3
  • 84
  • 164
13

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}

Silvia
  • 27,556
  • 3
  • 84
  • 164
m_goldberg
  • 107,779
  • 16
  • 103
  • 257
9

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]]

enter image description here

Simon Woods
  • 84,945
  • 8
  • 175
  • 324
7

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
*)
Dr. belisarius
  • 115,881
  • 13
  • 203
  • 453
0

So far as I know, the region properties can be:

In[1]:= Union[
 Join[Region`SpecialBoundaryProperty[]; 
  Cases[GeneralUtilities`Definitions[
    "SpecialBoundariesDump`SRBdryRule"], _String, -1], 
  Region`SpecialRegionProperty[]; 
  Cases[GeneralUtilities`Definitions[
    "SpecialRegionsDump`SRPropRule"], _String, \[Infinity]]]]

Out[1]= {"Assumptions", "Boundary", "BoundingBox", "Centroid",
"ConvexQ", "Distance", "ImplicitDescription",
"InjectiveParametricDescription", "Instance", "LinearGraphics",
"Measure", "Nearest", "ParametricDescription", "Primitive", "Region",
"RegionDimension", "SignedDistance", "SimpleBoundary",
"SimplicialDecomposition", "SpaceDimension", "Type"}

Unfortunately, this list is incomplete. According to

In[2]:= Region`RegionProperty[Pyramid[],{x,y,z},"FastDescription"]
Out[2]= {{{x,y,z},-4 (-2-2 y+2 z)>=0&&-4 (-2+2 x+2 z)>=0&&-4 (-2+2 y+2 z)>=0&&4 (2+2 x-2 z)>=0&&16 z>=0}}
In[3]:= Region`RegionProperty[Pyramid[],{x,y,z},"FastImplicitDescription"]
Out[3]= -4 (-2-2 y+2 z)>=0&&-4 (-2+2 x+2 z)>=0&&-4 (-2+2 y+2 z)>=0&&4 (2+2 x-2 z)>=0&&16 z>=0
In[4]:= Region`RegionProperty[Pyramid[],{x,y,z},True,"ImplicitDescription"]
Out[4]= {(x==-1&&((y==-1&&z==0)||(-1<y<0&&z==0)||(y==0&&z==0)||(0<y<1&&z==0)||(y==1&&z==0)))||(-1<x<0&&((y==-1&&z==0)||(-1<y<x&&0<=z<=1+y)||(y==x&&0<=z<=1+y)||(x<y<0&&0<=z<=1+x)||(y==0&&0<=z<=1+x)||(0<y<-x&&0<=z<=1+x)||(y==-x&&0<=z<=1+x)||(-x<y<1&&0<=z<=1-y)||(y==1&&z==0)))||(x==0&&((y==-1&&z==0)||(-1<y<0&&0<=z<=1+y)||(y==0&&0<=z<=1-y)||(0<y<1&&0<=z<=1-y)||(y==1&&z==0)))||(0<x<1&&((y==-1&&z==0)||(-1<y<-x&&0<=z<=1+y)||(y==-x&&0<=z<=1+y)||(-x<y<0&&0<=z<=1-x)||(y==0&&0<=z<=1-x)||(0<y<x&&0<=z<=1-x)||(y==x&&0<=z<=1-y)||(x<y<1&&0<=z<=1-y)||(y==1&&z==0)))||(x==1&&((y==-1&&z==0)||(-1<y<0&&z==0)||(y==0&&z==0)||(0<y<1&&z==0)||(y==1&&z==0))),True}

"FastImplicitDescription" is also a valid region property.
So, is there a complete list?

user688486
  • 485
  • 1
  • 7