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

Function gilbert_xy2d_r

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

Source from the content-addressed store, hash-verified

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

Callers 1

gilbert_xy2dFunction · 0.70

Calls 2

sgnFunction · 0.70
in_boundsFunction · 0.70

Tested by

no test coverage detected