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
.