(cur_idx, x_dst, y_dst, x, y, ax, ay, bx, by)
| 52 | |
| 53 | |
| 54 | def 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, |
no test coverage detected