Use your fingers or mouse to control model
(hold *shift* key or use mouse wheel to zoom it).
Ramiform node. Two (semi-ellipse ×
Bezier curve) tensor product patches are used to make a branch.
Branches are *C*^{1} continuous at junctions.
Procedural bark textures are used.

## XY Ramiform node

Two *(semi-ellipse × Bezier curve)*
tensor product patches are used to make a twig.
E.g. dark and light- gray patches below. Generating semi-circle
*ae* and semi-ellipsis *bO, cO* are dashed lines and
Bezier curve is the red one on the dark-gray patch.
If points *b, c, d* lie on one line, then
twigs are *C*^{1} continuous with
the ramiform node.

Ramiform is determined by 3 vectors *Oe, Og, Oh*
(they lie in the *xOy* plane),
3 base circle radiuses *r1, r2, r3* (*ea, hf*, ... )
and minor ellipse radius *r0* (rather arbitrary yet).
Tne *O* point is at the center *(0,0,0)*.
*Oc* direction is determined as

**n**_{Oe} + **n**_{Oh },

where e.g. **n**_{Oe} is the unit vector in the
*Oe* direction. *Ob* direction depends on scalar product
(**n**_{Oe}·**n**_{Oh }).
function ramiform(r0,r1,r2,r3, x1,y1, x2,y2, x3,y3, tex_off){
patch(r0,r1,r2, x1,y1, x2,y2, 1, tex_off);
patch(r0,r2,r3, x2,y2, x3,y3, 0, tex_off);
patch(r0,r3,r1, x3,y3, x1,y1, -1, tex_off);
}
function patch(r0,r1,r2, b1x,b1y, b2x,b2y, dir_u, tex_off){
...
}

The function *ramiform()* makes two smoothly connected patches
(e.g. dark-gray and blue above). We call it 3 times to build the whole ramiform.
To combine two *B, B'* ramiforms *C*^{1} continuously
*df* and *a'b'* points shall lie on one line.

Black forest demo.

Modeling the Mighty Maple for Web
*updated* 6 Apr 2015