Skip to content

Commit ff91bcf

Browse files
committed
added boundary checks to triangle bounding rasterization
1 parent 20ae45c commit ff91bcf

1 file changed

Lines changed: 15 additions & 5 deletions

File tree

triangle.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,21 @@ func (triangle Triangle) boundingTriangle(canvas *Canvas, color color.NRGBA, per
6262
return 0, 0, 0, 0, fmt.Errorf("Triangle area is less than 1 pixel") // discarding triangles that cover less than a pixel
6363
}
6464

65-
// TODO: add canvas bounds check (via min/max with canvas bounds?)
66-
bbminx = int(math.Min(math.Min(triangle.a.x, triangle.b.x), triangle.c.x))
67-
bbminy = int(math.Min(math.Min(triangle.a.y, triangle.b.y), triangle.c.y))
68-
bbmaxx = int(math.Max(math.Max(triangle.a.x, triangle.b.x), triangle.c.x))
69-
bbmaxy = int(math.Max(math.Max(triangle.a.y, triangle.b.y), triangle.c.y))
65+
// outer min / max resembles a canvas bounds check (0 to width/height)
66+
borders := canvas.canvas.Rect
67+
minx := math.Min(math.Min(triangle.a.x, triangle.b.x), triangle.c.x)
68+
miny := math.Min(math.Min(triangle.a.y, triangle.b.y), triangle.c.y)
69+
maxx := math.Max(math.Max(triangle.a.x, triangle.b.x), triangle.c.x)
70+
maxy := math.Max(math.Max(triangle.a.y, triangle.b.y), triangle.c.y)
71+
72+
bbminx = max(int(math.Floor(minx)), borders.Min.X)
73+
bbminy = max(int(math.Floor(miny)), borders.Min.Y)
74+
bbmaxx = min(int(math.Ceil(maxx)), borders.Max.X-1)
75+
bbmaxy = min(int(math.Ceil(maxy)), borders.Max.Y-1)
76+
77+
if bbminx > bbmaxx || bbminy > bbmaxy {
78+
return
79+
}
7080

7181
inv_total_area := 1 / total_area
7282

0 commit comments

Comments
 (0)