MCPcopy Create free account
hub / github.com/CompVis/zigma / gilbert_xy2d_r

Function gilbert_xy2d_r

utils/utils_zigzag.py:54–120  ·  view source on GitHub ↗
(cur_idx, x_dst, y_dst, x, y, ax, ay, bx, by)

Source from the content-addressed store, hash-verified

52
53
54def gilbert_xy2d_r(cur_idx, x_dst, y_dst, x, y, ax, ay, bx, by):
55
56 w = abs(ax + ay)
57 h = abs(bx + by)
58
59 (dax, day) = (sgn(ax), sgn(ay)) # unit major direction
60 (dbx, dby) = (sgn(bx), sgn(by)) # unit orthogonal direction
61
62 dx = dax + dbx
63 dy = day + dby
64
65 if h == 1:
66 if dax == 0:
67 return cur_idx + (dy * (y_dst - y))
68 return cur_idx + (dx * (x_dst - x))
69
70 if w == 1:
71 if dbx == 0:
72 return cur_idx + (dy * (y_dst - y))
73 return cur_idx + (dx * (x_dst - x))
74
75 (ax2, ay2) = (ax // 2, ay // 2)
76 (bx2, by2) = (bx // 2, by // 2)
77
78 w2 = abs(ax2 + ay2)
79 h2 = abs(bx2 + by2)
80
81 if 2 * w > 3 * h:
82 if (w2 % 2) and (w > 2):
83 # prefer even steps
84 (ax2, ay2) = (ax2 + dax, ay2 + day)
85
86 if in_bounds(x_dst, y_dst, x, y, ax2, ay2, bx, by):
87 return gilbert_xy2d_r(cur_idx, x_dst, y_dst, x, y, ax2, ay2, bx, by)
88
89 cur_idx += abs((ax2 + ay2) * (bx + by))
90 return gilbert_xy2d_r(
91 cur_idx, x_dst, y_dst, x + ax2, y + ay2, ax - ax2, ay - ay2, bx, by
92 )
93
94 else:
95 if (h2 % 2) and (h > 2):
96 # prefer even steps
97 (bx2, by2) = (bx2 + dbx, by2 + dby)
98
99 # standard case: one step up, one long horizontal, one step down
100 if in_bounds(x_dst, y_dst, x, y, bx2, by2, ax2, ay2):
101 return gilbert_xy2d_r(cur_idx, x_dst, y_dst, x, y, bx2, by2, ax2, ay2)
102 cur_idx += abs((bx2 + by2) * (ax2 + ay2))
103
104 if in_bounds(x_dst, y_dst, x + bx2, y + by2, ax, ay, bx - bx2, by - by2):
105 return gilbert_xy2d_r(
106 cur_idx, x_dst, y_dst, x + bx2, y + by2, ax, ay, bx - bx2, by - by2
107 )
108 cur_idx += abs((ax + ay) * ((bx - bx2) + (by - by2)))
109
110 return gilbert_xy2d_r(
111 cur_idx,

Callers 1

gilbert_xy2dFunction · 0.70

Calls 2

sgnFunction · 0.70
in_boundsFunction · 0.70

Tested by

no test coverage detected