public static void DrawGradientIntPolygon(this Texture2D texture, IntPolygon polygon, Color color0, Color color1) { if (polygon.Count < 2) { return; } for (var i = 0; i < polygon.Count; i++) { var distance = Vertex2.Distance((Vertex2)polygon[i], (Vertex2)polygon[i + 1]); Action <int, int> draw; if (distance > 0) { draw = (x, y) => { var percent = Vertex2.Distance((Vertex2)polygon[i], new Vertex2(x, y)) / distance; texture.SetPixel(x, y, Color.Lerp(color0, color1, percent)); }; } else { draw = (x, y) => texture.SetPixel(x, y, color0); } BresenhamLine(polygon[i], polygon[i + 1], draw); } texture.Apply(); }
public static float PointToLine(Vertex2 point, Vertex2 lineStart, Vertex2 lineEnd) { Vertex2 v = lineEnd - lineStart; Vertex2 w = point - lineStart; float c1 = Vertex2.Dot(w, v); float c2 = Vertex2.Dot(v, v); float b = c1 / c2; Vertex2 pb = lineStart + b * v; return(Vertex2.Distance(point, pb)); }
public static void DrawGradientLine(this Texture2D texture, int x0, int y0, int x1, int y1, Color color0, Color color1) { var distance = Vertex2.Distance(new Vertex2(x0, y0), new Vertex2(x1, y1)); Action <int, int> draw; if (distance > 0) { draw = (x, y) => { var percent = Vertex2.Distance(new Vertex2(x0, y0), new Vertex2(x, y)) / distance; texture.SetPixel(x, y, Color.Lerp(color0, color1, percent)); }; } else { draw = (x, y) => texture.SetPixel(x, y, color0); } BresenhamLine(x0, y0, x1, y1, draw); texture.Apply(); }
public static float PointToLineSegment(Vertex2 point, Vertex2 segmentStart, Vertex2 segmentEnd) { Vertex2 v = segmentEnd - segmentStart; Vertex2 w = point - segmentStart; float c1 = Vertex2.Dot(w, v); if (c1 <= 0) { return(Vertex2.Distance(point, segmentStart)); } float c2 = Vertex2.Dot(v, v); if (c2 <= c1) { return(Vertex2.Distance(point, segmentEnd)); } float b = c1 / c2; Vertex2 pb = segmentStart + b * v; return(Vertex2.Distance(point, pb)); }