diff --git a/masque/shapes/shape.py b/masque/shapes/shape.py index ee6f19a..efc0859 100644 --- a/masque/shapes/shape.py +++ b/masque/shapes/shape.py @@ -139,22 +139,24 @@ class Shape(FlippableImpl, PivotableImpl, RepeatableImpl, AnnotatableImpl, for v, v_next in zip(p_verts, numpy.roll(p_verts, -1, axis=0), strict=True): dv = v_next - v - # Find x-index bounds for the line # TODO: fix this and err_xmin/xmax for grids smaller than the line / shape + # Find x-index bounds for the line gxi_range = numpy.digitize([v[0], v_next[0]], gx) - gxi_min = numpy.min(gxi_range - 1).clip(0, len(gx) - 1) - gxi_max = numpy.max(gxi_range).clip(0, len(gx)) + gxi_min = int(numpy.min(gxi_range - 1).clip(0, len(gx) - 1)) + gxi_max = int(numpy.max(gxi_range).clip(0, len(gx))) - err_xmin = (min(v[0], v_next[0]) - gx[gxi_min]) / (gx[gxi_min + 1] - gx[gxi_min]) - err_xmax = (max(v[0], v_next[0]) - gx[gxi_max - 1]) / (gx[gxi_max] - gx[gxi_max - 1]) + if gxi_min < len(gx) - 1: + err_xmin = (min(v[0], v_next[0]) - gx[gxi_min]) / (gx[gxi_min + 1] - gx[gxi_min]) + if err_xmin >= 0.5: + gxi_min += 1 - if err_xmin >= 0.5: - gxi_min += 1 - if err_xmax >= 0.5: - gxi_max += 1 + if gxi_max > 0 and gxi_max < len(gx): + err_xmax = (max(v[0], v_next[0]) - gx[gxi_max - 1]) / (gx[gxi_max] - gx[gxi_max - 1]) + if err_xmax >= 0.5: + gxi_max += 1 if abs(dv[0]) < 1e-20: # Vertical line, don't calculate slope - xi = [gxi_min, gxi_max - 1] + xi = [gxi_min, max(gxi_min, gxi_max - 1)] ys = numpy.array([v[1], v_next[1]]) yi = numpy.digitize(ys, gy).clip(1, len(gy) - 1) err_y = (ys - gy[yi]) / (gy[yi] - gy[yi - 1])