/// <summary> /// Возвращает повернутую DeltaRepresentation на заданный угол относительно заданной точки /// </summary> public DeltaRepresentation GetTurnedDelta(double angle) { if (angle == 0) { return(this); } DeltaRepresentation res = new DeltaRepresentation(); res.angle = this.angle + angle; List <Point> newDeltas = new List <Point>(); double cosAngle = Math.Cos(angle); double sinAngle = Math.Sin(angle); foreach (Point p_old in deltas) { double newX = p_old.X * cosAngle + p_old.Y * sinAngle; double newY = p_old.X * sinAngle + p_old.Y * cosAngle; newDeltas.Add(new Point((int)newX, (int)newY)); // также добавляем точки вокруг, чтобы устранить дырки newDeltas.Add(new Point((int)newX + 1, (int)newY)); newDeltas.Add(new Point((int)newX - 1, (int)newY)); } // Попытка не убирать дубликаты, а обработать этот случай на моменте с превращением в сегменты res.deltas = newDeltas;//.Distinct().ToList(); return(res); }
/// <summary> /// Загрузка дельт из картинки /// </summary> /// <param name="borderDistance">Количество пикселей прироста в ширине фигуры</param> private void LoadFigureFromItsBitmap(int borderDistance) { noScaling = new DeltaRepresentation(bitmap, figColor); if (noScaling.deltas.Count == 0) { throw new Exception("Empty figure, maybe different color?"); } ; if (borderDistance == 0) { withBorderDistance = noScaling; } else { withBorderDistance = new DeltaRepresentation(bitmap, figColor, borderDistance); } }
/// <summary> /// Перезагружает withBorderDistance для нового количества дополнительных пикселей /// </summary> /// <param name="borderDistance">Количество доп пикселей с каждой из сторон</param> public void ChangeBorderDistance(int borderDistance) { withBorderDistance = new DeltaRepresentation(bitmap, figColor, borderDistance); }