GfsSurface

(Difference between revisions)
 Revision as of 23:40, 14 December 2007Popinet (Talk | contribs) (Simplified stuff about differentiable implicit function)← Previous diff Revision as of 22:03, 10 January 2008Popinet (Talk | contribs) (→Boolean operations - fixed inconsistency in orientations)Next diff → Line 50: Line 50: Boolean operations between implicit surfaces can be used to create more complex objects (a technique also know as [[:w:Constructive solid geometry|Constructive Solid Geometry]]). Given two implicit surfaces A and B with associated implicit functions fA and fB, the standard boolean set operations can be constructed as: Boolean operations between implicit surfaces can be used to create more complex objects (a technique also know as [[:w:Constructive solid geometry|Constructive Solid Geometry]]). Given two implicit surfaces A and B with associated implicit functions fA and fB, the standard boolean set operations can be constructed as: - ;Intersection: A ^ B = { MIN (fA(x,y,z), fB(x,y,z)) } + ;Intersection: A ^ B = { MAX (fA(x,y,z), fB(x,y,z)) } - ;Union: A U B = { MAX (fA(x,y,z), fB(x,y,z)) } + ;Union: A U B = { MIN (fA(x,y,z), fB(x,y,z)) } - ;Difference: A - B = { MIN (fA(x,y,z), - fB(x,y,z)) } + ;Difference: A - B = { MAX (fA(x,y,z), - fB(x,y,z)) } For example the following will replicate the [[:w:Image:Csg tree.png|example]] of the wikipedia [[:w:Constructive solid geometry|CSG]] page For example the following will replicate the [[:w:Image:Csg tree.png|example]] of the wikipedia [[:w:Constructive solid geometry|CSG]] page Line 59: Line 59: double s = sphere (0, 0, 0, 0.25); double s = sphere (0, 0, 0, 0.25); double c = cube (0,0,0,0.38); double c = cube (0,0,0,0.38); - double sUc = MAX (s, c); + double sIc = MAX (s, c); double cylinder1 = x*x + y*y - 0.12*0.12; double cylinder1 = x*x + y*y - 0.12*0.12; double cylinder2 = z*z + y*y - 0.12*0.12; double cylinder2 = z*z + y*y - 0.12*0.12; double cylinder3 = x*x + z*z - 0.12*0.12; double cylinder3 = x*x + z*z - 0.12*0.12; - double cylinderI = MIN (MIN (cylinder1, cylinder2), cylinder3); + double cylinderU = MIN (MIN (cylinder1, cylinder2), cylinder3); - return MAX (sUc, - cylinderI); + return MAX (sIc, - cylinderU); }) })

Revision as of 22:03, 10 January 2008

A GfsSurface is an oriented surface (in 3D) or an oriented curve (in 2D).

The surface can be defined implicitly using for example:

```(x*x + y*y + z*z - 0.1*0.1)
```

which defines the surface as the set of points of coordinates `(x,y,z)` such that `x*x + y*y + z*z - 0.1*0.1 = 0` (i.e. a sphere of radius 0.1 centered on the origin).

The sign of the implicit function defines the surface orientation. The function should be continuous. For example it is not a good idea to do

```(x*x + y*y + z*z > 0.1*0.1 ? 1. : -1.)
```

Surfaces can also be defined explicitly using GTS files. For example:

```sphere.gts
```

When using GTS surfaces in two dimensions, the oriented curve is defined as the intersection of the GTS surface with the `z = 0` plane.

The surface definition can be followed by an optional parameter block with the following syntax:

```{
tx = 0.1 ty = -0.2 tz = 0.4
sx = 2.  sy = 1.5  sz = -1
rx = -45 ry = -5.5 rz = 25
scale = 3.
flip = 1
twod = 1
}
```

where `(tx,ty,tz)` is a translation vector, `(sx,sy,sz)` is a scaling vector and `(rx,ry,rz)` is a rotation vector (angles in degrees around each principal direction). Note that the translation is always performed after rotation and scaling.

If the `scale` parameter is specified, uniform scaling is applied along the three axis.

The `flip` parameter can be used to flip the surface orientation.

If set to one the `twod` parameter "flattens" the surface on the `z = 0` plane (this is used in 3D by the GfsRefineSurface object).

Several simple implicit surfaces are pre-defined:

`ellipse(x,y,a,b)`
an ellipse (an elliptical prism in 3D) centered on `(x,y)` and with semimajor axis `a` and semiminor axis `b`.
`sphere(x,y,z,r)`
a sphere centered on `(x,y,z)` and of radius `r`.
`cube(x,y,z,h)`
a cube centered on `(x,y,z)` and of size `h`.

Boolean operations

Boolean operations between implicit surfaces can be used to create more complex objects (a technique also know as Constructive Solid Geometry). Given two implicit surfaces A and B with associated implicit functions `fA` and `fB`, the standard boolean set operations can be constructed as:

Intersection
A ^ B = { `MAX (fA(x,y,z), fB(x,y,z))` }
Union
A U B = { `MIN (fA(x,y,z), fB(x,y,z))` }
Difference
A - B = { `MAX (fA(x,y,z), - fB(x,y,z))` }

For example the following will replicate the example of the wikipedia CSG page

```Solid ({
double s = sphere (0, 0, 0, 0.25);
double c = cube (0,0,0,0.38);
double sIc = MAX (s, c);

double cylinder1 = x*x + y*y - 0.12*0.12;
double cylinder2 = z*z + y*y - 0.12*0.12;
double cylinder3 = x*x + z*z - 0.12*0.12;
double cylinderU = MIN (MIN (cylinder1, cylinder2), cylinder3);

return MAX (sIc, - cylinderU);
})
```