public static void DrawLine(float x0float, float y0float, float x1float, float y1float, float pixelSize, DelegateDDA2 del) { DrawLine(x0float / pixelSize, y0float / pixelSize, x1float / pixelSize, y1float / pixelSize, del); }
/// <summary> /// DONT FORGET TO SCALE ALL SO ONE PIXEL IS 1f /// </summary> public static void DrawLine(float x0float, float y0float, float x1float, float y1float, DelegateDDA2 del) { //UnityEngine.Debug.LogFormat("x0: {0}, y0: {1}, x1: {2}, y1: {3}", x0float, y0float, x1float, y1float); int x0int = (int)x0float; int y0int = (int)y0float; int x1int = (int)x1float; int y1int = (int)y1float; if (x0int == x1int) { if (y0int == y1int) //inside one pixel { del(x0int, y0int); return; } //along x axis if (y0int < y1int) { for (int y = y0int; y < y1int + 1; y++) { if (del(x0int, y)) { return; } } } else { for (int y = y0int; y > y1int - 1; y--) { if (del(x0int, y)) { return; } } } return; } if (y0int == y1int) //along y axis { if (x0int < x1int) { for (int x = x0int; x < x1int + 1; x++) { if (del(x, y0int)) { return; } } } else { for (int x = x0int; x > x1int - 1; x--) { if (del(x, y0int)) { return; } } } return; } //some funky DDA based line rasterization if (SomeMath.InRangeInclusive((x1float - x0float) / (y1float - y0float), -1, 1)) //y { float lineDirX = x1float - x0float; float lineDirY = y1float - y0float; float t0y, t1y; if (x0float < x1float) { t0y = IntersectionY(x0int, x0float, y0float, lineDirX, lineDirY); t1y = IntersectionY(x0int + 1, x0float, y0float, lineDirX, lineDirY); //DrawCross(x0int, t0y, Color.red, 10f, "t0"); //DrawCross(x0int + 1, t1y, Color.green, 10f, "t1"); } else { t0y = IntersectionY(x0int + 1, x0float, y0float, lineDirX, lineDirY); t1y = IntersectionY(x0int, x0float, y0float, lineDirX, lineDirY); //DrawCross(x0int + 1, t0y, Color.red, 10f, "t0"); //DrawCross(x0int, t1y, Color.green, 10f, "t1"); } int xDelta = Math.Sign(x1int - x0int); float yDelta = t1y - t0y; float curYfloat = t0y; if (y1float < y0float) { while (true) { curYfloat += yDelta; for (; y0int > (int)curYfloat - 1; y0int--) { if (del(x0int, y0int)) { return; } if (y0int == y1int) { del(x1int, y1int); return; } } y0int = (int)curYfloat; x0int += xDelta; } } else { while (true) { curYfloat += yDelta; for (; y0int < (int)curYfloat + 1; y0int++) { if (del(x0int, y0int)) { return; } if (y0int == y1int) { if (x0int != x1int) { del(x1int, y1int); } return; } } y0int = (int)curYfloat; x0int += xDelta; } } } else //x { float lineDirX = x1float - x0float; float lineDirY = y1float - y0float; float t0x, t1x; if (y0float < y1float) { t0x = IntersectionX(y0int, x0float, y0float, lineDirX, lineDirY); t1x = IntersectionX(y0int + 1, x0float, y0float, lineDirX, lineDirY); //DrawCross(t0x, y0int, Color.red, 10f, "t0"); //DrawCross(t1x, y0int + 1, Color.green, 10f, "t1"); } else { t1x = IntersectionX(y0int, x0float, y0float, lineDirX, lineDirY); t0x = IntersectionX(y0int + 1, x0float, y0float, lineDirX, lineDirY); //DrawCross(t1x, y0int, Color.green, 10f, "t1"); //DrawCross(t0x, y0int + 1, Color.red, 10f, "t0"); } int yDelta = Math.Sign(y1int - y0int); float xDelta = t1x - t0x; float curXfloat = t0x; if (x1float < x0float) { while (true) { curXfloat += xDelta; for (; x0int > (int)curXfloat - 1; x0int--) { if (del(x0int, y0int)) { return; } if (x0int == x1int) { if (y0int != y1int) { del(x1int, y1int); } return; } } x0int = (int)curXfloat; y0int += yDelta; } } else { while (true) { curXfloat += xDelta; for (; x0int < (int)curXfloat + 1; x0int++) { if (del(x0int, y0int)) { return; } if (x0int == x1int) { if (y0int != y1int) { del(x1int, y1int); } return; } } x0int = (int)curXfloat; y0int += yDelta; } } } }