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
119
120
|
/*
* Syringe driver
*
* Adrian Bowyer
* 3 May 2005
*
*/
#ifndef SYRINGE_H
#define SYRINGE_H
#include "stdlib.h" // System library
#include "stdio.h" // Standard input/output definitions
#include "string.h" // String function definitions
#include "unistd.h" // UNIX standard function definitions
#include "sys/stat.h" // Env stuff...
#include "sys/types.h"// ...and the like
#include "fcntl.h" // File control definitions
#include "errno.h" // Error number definitions
#include "termios.h" // POSIX terminal control definitions
#include "ctype.h" // Useful character stuff
#include "iostream.h" // C++ console i/o
#include "fstream.h" // C++ file i/o
#include <strstream> // String i/o
#include "math.h" // Sine cos etc
#define PORT "/dev/ttyS0" // Port minicom talks to
// Swap a pair of integers
inline void swp(int& a, int& b)
{
int t;
t = a;
a = b;
b = t;
}
// 3-dimensional Bressenham DDA
class dda
{
private:
// x, y, z are the current point
// xo, yo, zo are the start point
// xd, yd, zd are the differences between the start and end
// iy, iz are the y and z DDA sums
// nx, ny, nz are flags for the x, y, and z differences being negative
// sxy and sxz are flags to swap x and y, and to swap x and z
int x, y, z, xo, yo, zo, xd, yd, zd, iy, iz, nx, ny, nz, sxy, sxz;
public:
// Constructor initializes everything given where we are and where
// we want to go.
dda(int x0, int y0, int z0, int x1, int y1, int z1)
{
xo = x0;
yo = y0;
zo = z0;
xd = x1 - x0;
yd = y1 - y0;
zd = z1 - z0;
if(nx = (xd < 0)) xd = -xd;
if(ny = (yd < 0)) yd = -yd;
if(nz = (zd < 0)) zd = -zd;
if(sxy = (xd < yd)) swp(xd, yd);
if(sxz = (xd < zd)) swp(xd, zd);
x = 0;
y = 0;
z = 0;
iy = -xd/2;
iz = iy;
}
// Return the current point, given all the negates and swaps
void point(int& a, int& b, int& c)
{
a = x;
b = y;
c = z;
if(sxz) swp(a, c);
if(sxy) swp(a, b);
if(nx) a = -a;
if(ny) b = -b;
if(nz) c = -c;
a = a + xo;
b = b + yo;
c = c + zo;
}
// Take 1 step of the DDA.
// Return 1 if we're still going, 0 if we've finished
int step()
{
x++;
iy = iy + yd;
if(iy > 0)
{
iy = iy - xd;
y++;
}
iz = iz + zd;
if(iz > 0)
{
iz = iz - xd;
z++;
}
return(x <= xd);
}
};
#endif
|