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