using PaintDotNet.Annotation.Enum; using PaintDotNet.Base.CommTool; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Globalization; using System.Runtime.Serialization; using System.Windows.Forms; namespace PaintDotNet.Annotation.FieldView { /// /// 圆形视场绘制 /// public class ViewCircle : ViewBase { #region Calculate List> m_circleTemple; float _radius; float _centerx; float _centery; public override double Width { get { return _radius * 2; } set { _centerx = Points[1].X; _centery = Points[3].Y; _radius = (float)value / 2; Points = CalculateCirclePoints(); } } public override double Height => Width; void InitCircleTemplate() { m_circleTemple = new List>(); m_circleTemple.Add( new Func(() => { return new PointF(-(float)(_radius / Math.Sqrt(2)), -(float)(_radius / Math.Sqrt(2))); })); m_circleTemple.Add( new Func(() => { return new PointF(0, -_radius); })); m_circleTemple.Add( new Func(() => { return new PointF((float)(_radius / Math.Sqrt(2)), -(float)(_radius / Math.Sqrt(2))); })); m_circleTemple.Add( new Func(() => { return new PointF(_radius, 0); })); m_circleTemple.Add( new Func(() => { return new PointF((float)(_radius / Math.Sqrt(2)), (float)(_radius / Math.Sqrt(2))); })); m_circleTemple.Add( new Func(() => { return new PointF(0, _radius); })); m_circleTemple.Add( new Func(() => { return new PointF(-(float)(_radius / Math.Sqrt(2)), (float)(_radius / Math.Sqrt(2))); })); m_circleTemple.Add( new Func(() => { return new PointF(-_radius, 0); })); } private List CalculateCirclePoints() { List points = new List(); foreach (var func in m_circleTemple) { var p = func.Invoke(); points.Add(new PointF(p.X + _centerx, p.Y + _centery)); } return points; } public override double Getacreage() { var r = BasicCalculationHelper.GetDistance(Points[0], Points[4]) / 2; return Math.PI * r * r; } #endregion #region Constructor public ViewCircle() { objectType = DrawClass.View; drawToolType = DrawToolType.ViewCircle; Initialize(); InitCircleTemplate(); } public ViewCircle(List points) : this() { Points = points; } public ViewCircle(int x, int y) : this() { for (int i = 0; i < 8; i++) AddPoint(x, y); } #endregion #region Clone public override DrawObject Clone() { return Clone(ISurfaceBox); } public override DrawObject Clone(ISurfaceBox surfaceBox) { ViewCircle drawRectangle = new ViewCircle(Points); drawRectangle.ISurfaceBox = surfaceBox; drawRectangle.ID = ID; drawRectangle.combineMode = this.combineMode; drawRectangle.Color = Color; FillDrawObjectFields(drawRectangle); return drawRectangle; } #endregion #region Handle public override int HandleCount { get { return 8; } } public override PointF GetHandle(int handleNumber) { return Points[handleNumber - 1]; } public override Cursor GetHandleCursor(int handleNumber) { switch (handleNumber) { case 1: return Cursors.SizeNWSE; case 2: return Cursors.SizeNS; case 3: return Cursors.SizeNESW; case 4: return Cursors.SizeWE; case 5: return Cursors.SizeNWSE; case 6: return Cursors.SizeNS; case 7: return Cursors.SizeNESW; case 8: return Cursors.SizeWE; default: return Cursors.Default; } } public override void MoveHandleTo(Point point, int handleNumber) { if (handleNumber % 2 != 0) MoveCorner(point); else MoveEdage(point, handleNumber); OnPropertyChanged(); } private void MoveCorner(Point point) { _centerx = Points[1].X; _centery = Points[3].Y; _radius = (float)BasicCalculationHelper.GetDistance(Center, point); Points = CalculateCirclePoints(); } private void MoveEdage(Point point, int i) { if (i % 4 == 0) { i--; _centery = Points[3].Y; _centerx = (point.X + Points[(i + 4) % 8].X) / 2; _radius = Math.Abs(point.X - Points[(i + 4) % 8].X) / 2; } else { i--; _centerx = Points[1].X; _centery = (point.Y + Points[(i + 4) % 8].Y) / 2; _radius = Math.Abs(point.Y - Points[(i + 4) % 8].Y) / 2; } Points = CalculateCirclePoints(); } #endregion } }