/// <summary> /// Рисует прямую линию на канве /// </summary> /// <param name="canvas"></param> /// <param name="x1"></param> /// <param name="y1"></param> /// <param name="x2"></param> /// <param name="y2"></param> public override void Draw(StudCanvas canvas, ushort x1, ushort y1, ushort x2, ushort y2) { #region Подготовка параметров для вычисления _a = y1 - y2; _b = x2 - x1; _c = x1 * y2 - x2 * y1; DevTools.Normalize(ref x1, ref x2); DevTools.Normalize(ref y1, ref y2); DevTools.CheckRightX(ref x2, canvas); DevTools.CheckRightX(ref y2, canvas); #endregion for (float i = x1; i <= x2; i += XStep) { for (int j = y1; j <= y2; j++) { //На случай, если x2-x1 == 0 _currentY = j; if (CheckXY(i, j)) { if (_currentY > canvas.GetHeight()) continue; canvas.Field[(int)Math.Round(i), _currentY] = BackChar; } } } }
/// <summary> /// Рисует круг /// </summary> /// <param name="canvas"></param> /// <param name="x1"></param> /// <param name="y1"></param> /// <param name="x2"></param> /// <param name="y2"></param> public override void Draw(StudCanvas canvas, ushort x1, ushort y1, ushort x2, ushort y2) { #region Подготовка параметров для вычисления DevTools.Normalize(ref x1, ref x2); DevTools.Normalize(ref y1, ref y2); // Приводим прямоугольник к квадрату максимального размера, левый верхний угол остается на месте if ((x2 - x1) > (y2 - y1)) { x2 = Convert.ToUInt16(x1 + y2 - y1); } _radius = (double) (x2 - x1) / 2; _x0 = x1 + _radius; _y0 = y1 + _radius; DevTools.CheckRightX(ref x2, canvas); #endregion for (float i = x1; i <= x2; i += Step) { CheckY(i); if (IsSolid) { DevTools.CheckLowY(ref _currentY2, canvas); for (int j = _currentY1; j <= _currentY2; j++) { canvas.Field[(int)Math.Round(i), j] = BackChar; } } else { if (_currentY1 >= canvas.GetHeight()) continue; canvas.Field[(int) Math.Round(i), _currentY1] = BackChar; if (_currentY2 >= canvas.GetHeight()) continue; canvas.Field[(int) Math.Round(i), _currentY2] = BackChar; } } }
/// <summary> /// Проверяет, не выходит ли данный y за нижний край канвы. Если выходит - устанавливает его на предельно допустимое значение /// </summary> /// <param name="y">Проверяемое значение</param> /// <param name="canvas">Ссылка на канву</param> public static void CheckLowY(ref ushort y, StudCanvas canvas) { ushort height = Convert.ToUInt16(canvas.GetHeight() - 1); y = (y > height) ? height : y; }
/// <summary> /// Проверяет, не выходит ли данный y за нижний край канвы. Если выходит - устанавливает его на предельно допустимое значение /// </summary> /// <param name="y">Проверяемое значение</param> /// <param name="canvas">Ссылка на канву</param> public static void CheckLowY(ref int y, StudCanvas canvas) { int height = canvas.GetHeight() - 1; y = (y > canvas.GetHeight()) ? height : y; }