summaryrefslogtreecommitdiff
path: root/algorithm.mod/algorithm.bmx
blob: db68305849a13226d1b0d2c0bbf817bc79bb0681 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
Rem
bbdoc: noddybox.algorithm
EndRem
Module noddybox.algorithm

ModuleInfo "Framework: Various algorithm routines"
ModuleInfo "Copyright: Public Domain"
ModuleInfo "Author: Ian Cowburn"
ModuleInfo "Version: $Revision$"

' $Id$

Strict
Import brl.math
Import brl.linkedlist

Rem
bbdoc: Used to return points from algorithms.
EndRem
Type TAlgoPoint
	Rem
	bbdoc: The X co-ordinate of the point
	EndRem
	Field	x:Int
	Rem
	bbdoc: The Y co-ordinate of the point
	EndRem
	Field	y:Int
	
	Rem
	bbdoc: Create a point.
	returns: Newly created point.
	about: @x and @y are initialised with the passed parameters.
	EndRem
	Function Create:TAlgoPoint(x:Int, y:Int)
		Local o:TAlgoPoint=New TAlgoPoint
		o.x=x
		o.y=y
		Return o
	End Function
	
End Type

Rem
bbdoc: Implements a Bresenham style line.
returns: A list of points making up the line.
about: @px1, @py1, @px2 and @py2 are the end points of the line.
EndRem
Function DoLine:TList(p1x:Int, p1y:Int, p2x:Int, p2y:Int)
	Local list:TList=CreateList()
	Local f:Int
	Local dx:Int
	Local dy:Int
	Local ix:Int
	Local iy:Int
	Local incrE:Int
	Local incrNE:Int
	Local d:Int
	Local x:Int
	Local y:Int
	Local ymode:Int

	dx=p2x-p1x
	dy=p2y-p1y
	
	ix=Sgn(dx)
	iy=Sgn(dy)
	
	dx=Abs(dx)
	dy=Abs(dy)

	If dy>dx
		ymode=True
		d=dx*2-dy
		incrE=dx*2
		incrNE=(dx-dy)*2
	Else
		ymode=False
		d=dy*2-dx
		incrE=dy*2
		incrNE=(dy-dx)*2
	EndIf

	x=p1x
	y=p1y

	list.AddLast(TAlgoPoint.Create(x,y))

	If ymode
		While y<>p2y
			If d<=0
				d:+incrE
				y:+iy
			Else
				d:+incrNE
				y:+iy
				x:+ix
			EndIf
			
			list.AddLast(TAlgoPoint.Create(x,y))
		Wend
    Else
		While x<>p2x
			If d<=0
				d:+incrE
				x:+ix
			Else
				d:+incrNE
				y:+iy
				x:+ix
			EndIf
			
			list.AddLast(TAlgoPoint.Create(x,y))
		Wend
	EndIf
	
	Return list
End Function