protected override List <Point2D> GeneratePoint2DList(Parabola para) { List <Point2D> list = new List <Point2D>(); int a = para.a; int b = para.b; int aSign = a < 0 ? -1 : 1; int bSign = b < 0 ? -1 : 1; int x = 0; int y = 0; int xprev = x; int yprev = y; int yInc = -aSign * bSign; // First half int p = -2 * yInc * a - b; while (Math.Abs(2 * a * x) < Math.Abs(b)) { if (para.orientation == Orientation.Vertical) { list.Add(new Point2D(x, y)); } else { list.Add(new Point2D(y, -x)); } xprev = x; yprev = y; if ((b > 0 && p > 0) || (b < 0 && p < 0)) { p += yInc * -2 * a * (2 * x + 3) - 2 * b; y += yInc; } else { p += yInc * -2 * a * (2 * x + 3); } x += 1; } // Second half x = xprev; y = yprev; p = -2 * b * (y + yInc) - a * (2 * x * x + 2 * x + 1); while (y * yInc <= para.limit * yInc) { if (para.orientation == Orientation.Vertical) { list.Add(new Point2D(x, y)); } else { list.Add(new Point2D(y, -x)); } if ((a > 0 && p > 0) || (a < 0 && p < 0)) { p += -2 * b * yInc - 2 * a * (2 * x + 2); x += 1; } else { p += -2 * b * yInc; } y += yInc; } if (para.orientation == Orientation.Vertical) { list = GenerateOnYSymmetricPoint2D(list, para.pivot); } else { list = GenerateOnXSymmetricPoint2D(list, para.pivot); } return(list); }
protected override List <Point2D> GeneratePoint2DList(Parabola para) { List <Point2D> list = new List <Point2D>(); int a = para.a; int b = para.b; int aSign = a < 0 ? -1 : 1; int bSign = b < 0 ? -1 : 1; int x = 0; int y = 0; int xprev = x; int yprev = y; int yInc = -aSign * bSign; // First half while (Math.Abs(2 * a * x) < Math.Abs(b)) { if (para.orientation == Orientation.Vertical) { list.Add(new Point2D(x, y)); } else { list.Add(new Point2D(y, -x)); } xprev = x; yprev = y; x += 1; y = (int)Math.Round(-a * x * x / (double)b); } // Second half x = xprev; y = yprev; while (y * yInc <= para.limit * yInc) { if (para.orientation == Orientation.Vertical) { list.Add(new Point2D(x, y)); } else { list.Add(new Point2D(y, -x)); } y += yInc; x = (int)Math.Round(Math.Sqrt(-y * b * 1.0 / a)); } if (para.orientation == Orientation.Vertical) { list = GenerateOnYSymmetricPoint2D(list, para.pivot); } else { list = GenerateOnXSymmetricPoint2D(list, para.pivot); } return(list); }
protected override List <Point2D> GeneratePoint2DList(Parabola para) { throw new NotImplementedException(); }
protected abstract List <Point2D> GeneratePoint2DList(Parabola para);
protected override List <Point2D> GeneratePoint2DList(Parabola para) { List <Point2D> list = new List <Point2D>(); int a = para.a; int b = para.b; if (b > 0) { a = -a; b = -b; } int aSign = a < 0 ? -1 : 1; int x = 0; int y = 0; int xprev = x; int yprev = y; int yInc = aSign; // First half int p = 2 * yInc * a + b; while (Math.Abs(2 * a * x) < Math.Abs(b) && Math.Abs(y) < Math.Abs(para.limit)) { if (para.orientation == Orientation.Vertical) { list.Add(new Point2D(x, y)); } else { list.Add(new Point2D(y, -x)); } xprev = x; yprev = y; if (p > 0) { p += yInc * 2 * a * (2 * x + 3) + 2 * b; y += yInc; } else { p += yInc * 2 * a * (2 * x + 3); } x += 1; } // Second half x = xprev; y = yprev; if (a > 0) { a = -a; b = -b; } p = 4 * a * x * (x + 1) + a + 4 * b * (y + yInc); while (y * yInc <= para.limit * yInc) { if (para.orientation == Orientation.Vertical) { list.Add(new Point2D(x, y)); } else { list.Add(new Point2D(y, -x)); } if (p > 0) { p += 4 * a * (2 * x + 2) + 4 * b * yInc; x += 1; } else { p += 4 * b * yInc; } y += yInc; } if (para.orientation == Orientation.Vertical) { list = GenerateOnYSymmetricPoint2D(list, para.pivot); } else { list = GenerateOnXSymmetricPoint2D(list, para.pivot); } return(list); }