-
Notifications
You must be signed in to change notification settings - Fork 0
/
ellipseCarpenter.py
62 lines (50 loc) · 1.47 KB
/
ellipseCarpenter.py
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
def midpointEllipse(rx, ry, xc, yc):
x = 0
y = ry
d1 = ((ry * ry) - (rx * rx * ry) + (0.25 * rx * rx))
dx = 2 * ry * ry * x
dy = 2 * rx * rx * y
result = []
temp = []
while (dx < dy):
result.append((xc+x, yc+y)) # Q1
result.append((xc-x, yc+y)) # Q2
result.append((xc-x, yc-y)) # Q3
result.append((xc+x, yc-y)) # Q4
if (d1 < 0):
x += 1
dx = dx + (2 * ry * ry)
d1 = d1 + dx + (ry * ry)
else:
x += 1
y -= 1
dx = dx + (2 * ry * ry)
dy = dy - (2 * rx * rx)
d1 = d1 + dx - dy + (ry * ry)
d2 = (((ry * ry) * ((x + 0.5) * (x + 0.5))) +
((rx * rx) * ((y - 1) * (y - 1))) -
(rx * rx * ry * ry))
while (y >= 0):
result.append((xc+x, yc+y)) # Q1
result.append((xc-x, yc+y)) # Q2
result.append((xc-x, yc-y)) # Q3
result.append((xc+x, yc-y)) # Q4
if (d2 > 0):
y -= 1
dy = dy - (2 * rx * rx)
d2 = d2 + (rx * rx) - dy
else:
y -= 1
x += 1
dx = dx + (2 * ry * ry)
dy = dy - (2 * rx * rx)
d2 = d2 + dx - dy + (rx * rx)
for i in result:
if i not in temp:
temp.append(i)
return temp
rx, ry, xc, yc = input('').split()
rx, ry, xc, yc = int(rx), int(ry), int(xc), int(yc)
s=midpointEllipse(rx, ry, xc, yc)
for i in s:
print(i)