begin
An array
of boolean flags
.
Integer variables
and
.
Variables
and
comprising a point in
space.
Another array of flags
.
Boolean flags
,
,
and
.
The variables
,
,
,
and
array
are used to keep track of the best fit as the
algorithm proceeds.
Set all the
to
.
For each point
:
begin
if
set
to
,
otherwise set it to
.
if
set
to
,
otherwise set it to
.
if
set
to
,
otherwise set it to
.
if
set
to
,
otherwise set it to
.
If the
's are either all true or all false, the line
misses the root rectangle,
otherwise they intersect. If they intersect, set
to
,
to
and
to
.
Call the procedure
with arguments as follows:
Procedure
( array of flags
, arrays of
intercepts
and
,
variables
and
,
subdivision level
, accumulator value
,
line of descent list ):
begin
Array
of
intercepts with
elements.
Accumulators
,
,
and
, initialised
to zero.
Variable
.
Nine boolean flags
,
,
,
,
,
,
,
,
.
Boolean flag
, initialised to
.
Sum the votes for the child rectangles: For each
such that
:
begin
Set
to
.
If
then:
begin
If
then:
begin
If
then set
to
.
Repeat for intercept
and flags
,
and
.
Repeat for intercept
and flags
,
and
.
If
,
,
and
are not all either
or
:
begin
Set flag
to
.
Repeat for flags
,
,
and
, accumulator
and flag
.
Repeat for flags
,
,
and
, accumulator
and flag
.
Repeat for flags
,
,
and
, accumulator
and flag
.
Subdivide child rectangles receiving greater than or equal to
votes:
If
:
begin
begin
Call
with arguments
,
,
,
,
,
,
and extended line of descent.
Set flag
to
.
Repeat with accumulator
, index pair [-1,1], flag list
, intercept arrays
and
, and
values
and
.
Repeat with accumulator
, index pair [1,-1], flag list
, intercept arrays
and
, and
values
and
.
Repeat with accumulator
, index pair [1,1], flag list
, intercept arrays
and
, and
values
and
.
If
is still
(i.e. no further
subdivision of this rectangle), test for best fit so far:
begin
Set
to
.
Calculate centre of rectangle in
direction by calling
procedure
with the line of descent as argument.
The result is copied into
.
Set
to
.
Copy array of flags
into array
.
Procedure
( line of descent list ):
begin
Set
to zero.
While line of descent not traversed (i.e. root rectangle not yet reached):
begin
Replace old value of
:
Add centre
-coordinate of root cube to
:
At the end of the algorithm
is the highest level of subdivision
reached,
the highest accumulator value at level
,
while
and
hold the best fit line
parameters.
Note that the points
are never used by the procedure
. All the information about the points is contained in
the intercept arrays. The
index part of the line of descent is
actually superflous since the
positions of rectangles are passed
from parent to child via
and
.