Example #1
0
 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);
 }
Example #2
0
        /// <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;
                    }
                }
            }
        }