Newer
Older
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
#include <iostream>
#include "digitalstraightsegment.h"
DigitalStraightSegment::DigitalStraightSegment (Pt2i p1, Pt2i p2, int type,
int xmin, int ymin, int xmax, int ymax)
: DigitalStraightLine (p1, p2, type)
{
if (a < (b < 0 ? -b : b))
{
min = xmin;
max = xmax;
}
else
{
min = ymin;
max = ymax;
}
}
DigitalStraightSegment::DigitalStraightSegment (Pt2i p1, Pt2i p2, Pt2i p3,
int xmin, int ymin, int xmax, int ymax)
: DigitalStraightLine (p1, p2, p3)
{
if (a < (b < 0 ? -b : b))
{
min = xmin;
max = xmax;
}
else
{
min = ymin;
max = ymax;
}
}
Pt2i DigitalStraightSegment::getABoundingPoint (bool upper) const
{
int sa = a, sb = b, u1 = 1, v1 = 0, u2 = 0, v2 = 1;
while (sb != 0)
{
int r = sa % sb;
int q = sa / sb;
int u3 = u1 - q * u2;
int v3 = v1 - q * v2;
u1 = u2;
v1 = v2;
u2 = u3;
v2 = v3;
sa = sb;
sb = r;
}
if (sa < 0) // should be 1 or -1 if a and b are primal
{
u1 = - u1; // necessary if sa = -1
v1 = - v1;
}
Pt2i extr (upper ? Pt2i (u1 * (c + nu - 1), v1 * (c + nu - 1))
: Pt2i (u1 * c, v1 * c));
int dec = 0;
int bb = (b < 0 ? -b : b);
if (a < bb)
{
if (extr.x () > max)
dec = 1 + (extr.x () - max) / bb;
else if (extr.x () < min)
dec = -1 - (min - extr.x ()) / bb;
if (b < 0) dec = -dec;
}
else
{
if (extr.y () > max)
dec = -1 - (extr.y () - max) / a;
else if (extr.y () < min)
dec = 1 + (min - extr.y ()) / a;
}
extr.set (extr.x () - dec * b, extr.y () + dec * a);
return extr;
}
void DigitalStraightSegment::adjustWorkArea (int &xmin, int &ymin,
int &width, int &height) const
{
if (b > a || -b > a)
{
if (xmin < min) xmin = min;
// Caution, segment max limit is excluded
int x2 = (xmin + width < max + 1 ? xmin + width : max + 1);
width = (xmin >= x2 ? 0 : x2 - xmin);
}
else
{
if (ymin < min) ymin = min;
// Cochon, segment max limit is excluded
int y2 = (ymin + height < max + 1 ? ymin + height : max + 1);
height = (ymin >= y2 ? 0 : y2 - ymin);
}
}