未完成的控件

using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace ImageControls
{
    /// <summary>
    /// 控件
    /// </summary> 
    public class ShapeEx : Control
    {
        #region 字段

        private Color _BackColor; //背景颜色

        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private Color _BorderColor; //边框颜色

        private Point _MouseLocation;

        private bool _ReSizeble; //是否可调整大小
        private int _SelectSelctedIndex; //0-8,0:SizeAll
        private int _SelfHeight;
        private Point _SelfLocation;
        private int _SelfWidth;
        private Rectangle _rectBottomSelector;
        private Rectangle _rectLeftBottomSelector;
        private Rectangle _rectLeftSelector;
        private Rectangle _rectLeftTopSelector;
        private Rectangle _rectRightBottomSelector;
        private Rectangle _rectRightSelector;
        private Rectangle _rectRightTopSelector;
        private Rectangle _rectTopSelector;

        private Container components;

        #region modify by anby

        private float _ShapeExAngle; //控件的旋转角度
        private int _ShapeExIsFocus; //0表示没有获取焦点,1表示获取焦点

        #endregion

        #endregion

        #region 构造函数

        public ShapeEx()
        {
            // 该调用是 Windows.Forms 窗体设计器所必需的。
            InitializeComponent();
        }

        #endregion

        #region 属性

        [DefaultValue("Black"), Description("边框颜色"), Category("Appearance")]
        public Color BorderColor
        {
            get
            {
                // Insert code here.
                return _BorderColor;
            }
            set
            {
                _BorderColor = value;
                Invalidate();
            }
        }

        [Description("控件ID号,自增长"), Category("Appearance")]
        public int ShapeExControlID { get; set; }

        [Description("用于连接外部控件ID"), Category("Appearance")]
        public int ShapeExJoinID { get; set; }

        [DefaultValue("Control"), Description("背景颜色"), Category("Appearance")]
        public override Color BackColor
        {
            get
            {
                // Insert code here.
                return _BackColor;
            }
            set
            {
                _BackColor = value;
                Invalidate();
            }
        }

        [DefaultValue(false), Description("运行中控件大小是否可拖拽编辑"), Category("Behavior")]
        public bool ReSizeble
        {
            get
            {
                // Insert code here.
                return _ReSizeble;
            }
            set
            {
                _ReSizeble = value;
                Invalidate();
            }
        }

        [Description("控件选择区域"), Category("Behavior")]
        public Rectangle SelectRectangle
        {
            get
            {
                var selectRectangler = new Rectangle();
                selectRectangler.X = Location.X + 7;
                selectRectangler.Y = Location.Y + 7;
                selectRectangler.Height = Height - 15;
                selectRectangler.Width = Width - 15;
                return selectRectangler;
            }
        }

        /// <summary>
        /// 是否被获取焦点
        /// </summary>
        [Description("控件是否获取焦点"), Category("Focus")]
        public int ShapeExIsFocus
        {
            get { return _ShapeExIsFocus; }
            set { _ShapeExIsFocus = value; }
        }

        [Description("控件旋转角度"), Category("Angle")]
        public float ShapeExAngle
        {
            get { return _ShapeExAngle; }
            set
            {
                _ShapeExAngle = value;
                this.Invalidate();
                this.Visible = false;
                this.Visible = true;
            }
        }

        //CreateParams
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00000020;
                return cp;
            }
        }

        #endregion

        #region 私有方法

        private void DrawSelector(Graphics graphics,Rectangle rect,Point[] Points) 
        {
            //graphics.TranslateTransform(Pcenter.X, Pcenter.Y);
            //graphics.RotateTransform(_ShapeExAngle);
            ////恢复绘图平面在水平和垂直方向的平移    rPoints[0]
            //graphics.TranslateTransform(-Pcenter.X, -Pcenter.Y);

            var SelectorPen = new SolidBrush(Color.White);
            var borderPen = new Pen(_BorderColor, 1);
            try
            {
                //实心
                Point[] LeftPoints = RPoints(getPoint(rect.X - 7, Height / 2 - 3, 6, 6));
                graphics.FillClosedCurve(SelectorPen, LeftPoints);

                Point[] TopPoints = RPoints(getPoint(Width / 2 - 3, rect.Y - 7, 6, 6));
                graphics.FillClosedCurve(SelectorPen, TopPoints);

                Point[] RightPoints = RPoints(getPoint(rect.X + rect.Width, Height / 2 - 3, 6, 6));
                graphics.FillClosedCurve(SelectorPen, RightPoints);

                Point[] BottomPoints = RPoints(getPoint(Width / 2 - 3, rect.Y + rect.Height, 6, 6));
                graphics.FillClosedCurve(SelectorPen, BottomPoints);

                Point[] LeftTopPoints = RPoints(getPoint(rect.X - 7, rect.Y - 7, 6, 6));
                graphics.FillClosedCurve(SelectorPen, LeftTopPoints);

                Point[] RightTopPoints =RPoints(getPoint(rect.X + rect.Width, rect.Y - 7, 6, 6));
                graphics.FillClosedCurve(SelectorPen, RightTopPoints);

                Point[] RightBottomPoints = RPoints(getPoint(rect.X + rect.Width, rect.Y + rect.Height, 6, 6));
                graphics.FillClosedCurve(SelectorPen, RightBottomPoints);

                Point[] LeftBottomPoints =  RPoints(getPoint(rect.X - 7, rect.Y + rect.Height, 6, 6));
                graphics.FillClosedCurve(SelectorPen, LeftBottomPoints);

                //边框
                _rectLeftSelector.X = rect.X-7;
                _rectLeftSelector.Y =Height/2-3;
                _rectLeftSelector.Height = 6;
                _rectLeftSelector.Width = 6;
                var leftRpoints = RPoints(getPoint(_rectLeftSelector.X, _rectLeftSelector.Y, 6, 6));
                graphics.DrawPolygon(borderPen, leftRpoints);
                _rectLeftSelector.X = leftRpoints[0].X;
                _rectLeftSelector.Y = leftRpoints[0].Y;

                //graphics.DrawRectangle(borderPen, _rectLeftSelector);

                _rectTopSelector.X = Width/2 - 3;
                _rectTopSelector.Y =rect.Y-7;
                _rectTopSelector.Height = 6;
                _rectTopSelector.Width = 6;
                var topRpoints = RPoints(getPoint(_rectTopSelector.X, _rectTopSelector.Y, 6, 6));
                graphics.DrawPolygon(borderPen, topRpoints);
                _rectTopSelector.X = topRpoints[0].X;
                _rectTopSelector.Y = topRpoints[0].Y;
                //graphics.DrawRectangle(borderPen, _rectTopSelector);

                _rectRightSelector.X = rect.X+rect.Width;
                _rectRightSelector.Y = Height/2-3;
                _rectRightSelector.Height = 6;
                _rectRightSelector.Width = 6;
                var rightRpoints = RPoints(getPoint(_rectRightSelector.X, _rectRightSelector.Y, 6, 6));
                graphics.DrawPolygon(borderPen, rightRpoints);
                _rectRightSelector.X = rightRpoints[0].X;
                _rectRightSelector.Y = rightRpoints[0].Y;
                //graphics.DrawRectangle(borderPen, _rectRightSelector);

                _rectBottomSelector.X = Width/2-3;
                _rectBottomSelector.Y = rect.Y+rect.Height;
                _rectBottomSelector.Height = 6;
                _rectBottomSelector.Width = 6;
                var bottomRpoints = RPoints(getPoint(_rectBottomSelector.X, _rectBottomSelector.Y, 6, 6));
                graphics.DrawPolygon(borderPen, bottomRpoints);
                _rectBottomSelector.X = bottomRpoints[0].X;
                _rectBottomSelector.Y = bottomRpoints[0].Y;
                ////graphics.DrawRectangle(borderPen, _rectBottomSelector);

                _rectLeftTopSelector.X = rect.X-7;
                _rectLeftTopSelector.Y = rect.Y-7;
                _rectLeftTopSelector.Width = 6;
                _rectLeftTopSelector.Height = 6;
                var lefttopRpoints = RPoints(getPoint(_rectLeftTopSelector.X, _rectLeftTopSelector.Y, 6, 6));
                graphics.DrawPolygon(borderPen, lefttopRpoints);
                _rectLeftTopSelector.X = lefttopRpoints[0].X;
                _rectLeftTopSelector.Y = lefttopRpoints[0].Y;
                //graphics.DrawRectangle(borderPen, _rectLeftTopSelector);

                _rectRightTopSelector.X = rect.X+rect.Width;
                _rectRightTopSelector.Y = rect.Y-7;
                _rectRightTopSelector.Width = 6;
                _rectRightTopSelector.Height = 6;
                var righttopRpoints= RPoints(getPoint(_rectRightTopSelector.X, _rectRightTopSelector.Y, 6, 6));
                graphics.DrawPolygon(borderPen, righttopRpoints);
                _rectRightTopSelector.X = righttopRpoints[0].X;
                _rectRightTopSelector.Y = righttopRpoints[0].Y;
                //graphics.DrawRectangle(borderPen, _rectRightTopSelector);

                _rectRightBottomSelector.X = rect.X + rect.Width;
                _rectRightBottomSelector.Y = rect.Y+rect.Height;
                _rectRightBottomSelector.Width = 6;
                _rectRightBottomSelector.Height = 6;
                var rightbottomRpoints = RPoints(getPoint(_rectRightBottomSelector.X, _rectRightBottomSelector.Y, 6, 6));
                graphics.DrawPolygon(borderPen, rightbottomRpoints);
                _rectRightBottomSelector.X = rightbottomRpoints[0].X;
                _rectRightBottomSelector.Y = rightbottomRpoints[0].Y;
                //graphics.DrawRectangle(borderPen, _rectRightBottomSelector);

                _rectLeftBottomSelector.X = rect.X-7;
                _rectLeftBottomSelector.Y = rect.Y + rect.Height;
                _rectLeftBottomSelector.Width = 6;
                _rectLeftBottomSelector.Height = 6;
                var leftbottompointRPoints =  RPoints(getPoint(_rectLeftBottomSelector.X, _rectLeftBottomSelector.Y, 6, 6));
                graphics.DrawPolygon(borderPen,leftbottompointRPoints);
                _rectLeftBottomSelector.X = leftbottompointRPoints[0].X;
                _rectLeftBottomSelector.Y = leftbottompointRPoints[0].Y;
                //graphics.DrawRectangle(borderPen, _rectLeftBottomSelector);

            }
            catch (Exception E)
            {
                throw E;
            }
            finally
            {
                SelectorPen.Dispose();
                borderPen.Dispose();
            }
        }


        public PointF Pcenter = new PointF();
        public Point[] rPoints = null;
        private PointF center = new PointF();
        private void ReDrawControl(Graphics graphics)
        {
            try
            {
                var borderPen = new Pen(_BorderColor, 1);

                //绘制边框    
                var rectBorder = new Rectangle();
                rectBorder.X = 7;
                rectBorder.Y = 7;
                rectBorder.Height = Height - 15;
                rectBorder.Width = Width - 15;

                center = new PointF(this.Width/2, this.Height/2);
                
                //算出要平移的坐标
                Point RationPoint = new Point((int)(center.X - rectBorder.Width / 2), (int)(center.Y - rectBorder.Height / 2));

                //要绘制的矩形
                var picRect = new RectangleF(RationPoint.X, RationPoint.Y, (float)rectBorder.Width, (float)rectBorder.Height);

                //圆心坐标
                Pcenter = new PointF(picRect.X + picRect.Width/2, picRect.Y + picRect.Height/2);

                #region 最后修改

                PointF leftToppoint = new PointF(picRect.X,picRect.Y);
                PointF leftBottompoint = new PointF(picRect.X, (picRect.Y + picRect.Height));
                PointF rightToppoint = new PointF((picRect.X + picRect.Width), picRect.Y);
                PointF rightBottompoint = new PointF((picRect.X + picRect.Width), (picRect.Y + picRect.Height));

                 rPoints = RPoints(Point.Ceiling(leftToppoint),Point.Ceiling(rightToppoint), 
                                Point.Ceiling(rightBottompoint), Point.Ceiling(leftBottompoint));

                RectangleF controlRect = new RectangleF(this.Location.X, this.Location.Y, this.Width, this.Height);
                
                getNewRectangle(rPoints);
                

                graphics.DrawPolygon(borderPen, rPoints);

                #endregion

                #region 旋转内,但是无法获取旋转后的坐标,程序失控
                // //绘图平面以图片的中心点旋转
                //graphics.TranslateTransform(Pcenter.X, Pcenter.Y);
                //graphics.RotateTransform(_ShapeExAngle);
                ////恢复绘图平面在水平和垂直方向的平移
                //graphics.TranslateTransform(-Pcenter.X, -Pcenter.Y);
                //绘制图片
                //graphics.DrawRectangle(borderPen, Rectangle.Ceiling(picRect));
                 //重置绘图平面的所有变换
                 //graphics.ResetTransform();
                #endregion

                #region 图片旋转 图片超出边界

                ////圆心坐标
                //var center = new PointF(rectBorder.Width/2, rectBorder.Height/2);

                ////矩形左上坐标
                //float offsetX = 0;
                //float offsetY = 0;
                //offsetX = center.X - rectBorder.Width/2;
                //offsetY = center.Y - rectBorder.Height/2;

                ////要画的图
                //var picRect = new RectangleF(offsetX, offsetY, rectBorder.Width, rectBorder.Height);
                //var Pcenter = new PointF(picRect.X + picRect.Width/2, picRect.Y + picRect.Height/2);

                ////让图片绕中心旋转一周
                ////for (int i = 0; i < 361; i += 10)
                ////{
                //var changeRect = new Rectangle((int) picRect.X, (int) picRect.Y, (int) picRect.Width,
                //                               (int) picRect.Height);
              
                ////绘图平面以图片的中心点旋转
                //graphics.TranslateTransform(Pcenter.X, Pcenter.Y);
                //graphics.RotateTransform(_ShapeExAngle);
                ////恢复绘图平面在水平和垂直方向的平移
                //graphics.TranslateTransform(-Pcenter.X, -Pcenter.Y);
                
                ////绘制图片并延时
                //graphics.DrawRectangle(borderPen, changeRect);
                ////重置绘图平面的所有变换
                //graphics.ResetTransform();

                ////}

                #endregion

                //绘制编辑框
                if (_ReSizeble)
                {
                    DrawSelector(graphics,Rectangle.Ceiling(picRect),rPoints);
                }
            }
            catch (Exception E)
            {
                throw E;
            }
            finally
            {
                graphics.Dispose();
            }
        }

        /// <summary>
        /// 根据数组坐标获取新的矩形
        /// </summary>
        /// <param name="rPoints"></param>
        private void getNewRectangle(Point[] rPoints)
        {
            try
            {
                int maxCoorX = getPointCoorX(rPoints, true);
                int minCoorX = getPointCoorX(rPoints, false);
                int maxCoorY = getPointCoorY(rPoints, true);
                int minCoorY = getPointCoorY(rPoints, false);

                //获得width和height
                double width = Math.Sqrt(maxCoorX*maxCoorX + minCoorX*minCoorX);
                double height = Math.Sqrt(maxCoorY*maxCoorY + minCoorY*minCoorY);
              _SelfWidth = (int) width;
              _SelfHeight   = (int) height;

            }
            catch (Exception)
            {
            }
        }

        private PointF[] getPointF(int x, int y, int Width, int Height)
        {
            var point1 = new PointF(x, y);
            var point2 = new PointF(x + Width, y);
            var point3 = new PointF(x + Width, y + Height);
            var point4 = new PointF(x, y + Height);
            PointF[] points = {point1, point2, point3, point4};
            return points;
        }

        private Point[] getPoint(int x, int y, int Width, int Height)
        { 
            var point1 = new Point(x, y);
            var point2 = new Point(x + Width, y);
            var point3 = new Point(x + Width, y + Height);
            var point4 = new Point(x, y + Height);
            Point[] points = { point1, point2, point3, point4 };
            return points;
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                    components.Dispose();
            }
            base.Dispose(disposing);
        }

        #endregion

        #region 组件设计器生成的代码

        private void InitializeComponent()
        {
            components = new Container();
            Resize += ShapeEx_Resize;
            MouseDown += ShapeEx_MouseDown;
            MouseMove += ShapeEx_MouseMove;
            MouseLeave += ShapeEx_MouseLeave;
            MouseUp += ShapeEx_MouseUp;
           
            //this.GotFocus += new EventHandler(ShapeEx_GotFocus);
            //this.LostFocus += new EventHandler(ShapeEx_LostFocus);        

            _ShapeExAngle = 30;
            _BorderColor = Color.Black;
            _BackColor = Color.FromName("Control");
            _ReSizeble = false;
            _SelectSelctedIndex = -1;
            SetStyle(ControlStyles.SupportsTransparentBackColor
                     | ControlStyles.UserPaint
                     | ControlStyles.AllPaintingInWmPaint
                     | ControlStyles.Opaque, true);
            BackColor = Color.Transparent;
        }

   
        #endregion

        #region 事件

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
            ReDrawControl(pe.Graphics);
        }

        private void ShapeEx_Resize(object sender, EventArgs e)
        {
            if (Width < 16 || Height < 16)
            {
                Width = 16;
                Height = 16;
            }
            Invalidate();
        }

        private void ShapeEx_MouseDown(object sender, MouseEventArgs e)
        {
           
            _ShapeExIsFocus = 1;
            if (_ReSizeble)
            {
                if (_rectLeftSelector.Contains(e.X, e.Y) ||
                    _rectRightSelector.Contains(e.X, e.Y) ||
                    _rectTopSelector.Contains(e.X, e.Y) ||
                    _rectBottomSelector.Contains(e.X, e.Y) ||
                    _rectLeftTopSelector.Contains(e.X, e.Y) ||
                    _rectRightTopSelector.Contains(e.X, e.Y) ||
                    _rectRightBottomSelector.Contains(e.X, e.Y) ||
                    _rectLeftBottomSelector.Contains(e.X, e.Y))
                {
                    if (_rectLeftTopSelector.Contains(e.X, e.Y))
                    {
                        Cursor = Cursors.SizeNWSE;
                        _SelectSelctedIndex = 1;
                    }

                    if (_rectTopSelector.Contains(e.X, e.Y))
                    {
                        Cursor = Cursors.SizeNS;
                        _SelectSelctedIndex = 2;
                    }
                    if (_rectRightTopSelector.Contains(e.X, e.Y))
                    {
                        Cursor = Cursors.SizeNESW;
                        _SelectSelctedIndex = 3;
                    }
                    if (_rectRightSelector.Contains(e.X, e.Y))
                    {
                        Cursor = Cursors.SizeWE;
                        _SelectSelctedIndex = 4;
                    }
                    if (_rectRightBottomSelector.Contains(e.X, e.Y))
                    {
                        Cursor = Cursors.SizeNWSE;
                        _SelectSelctedIndex = 5;
                    }
                    if (_rectBottomSelector.Contains(e.X, e.Y))
                    {
                        Cursor = Cursors.SizeNS;
                        _SelectSelctedIndex = 6;
                    }
                    if (_rectLeftBottomSelector.Contains(e.X, e.Y))
                    {
                        Cursor = Cursors.SizeNESW;
                        _SelectSelctedIndex = 7;
                    }
                    if (_rectLeftSelector.Contains(e.X, e.Y))
                    {
                        Cursor = Cursors.SizeWE;
                        _SelectSelctedIndex = 8;
                    }
                }
                else
                {
                    Cursor = Cursors.SizeAll;
                    _SelectSelctedIndex = 0;
                }
                _SelfLocation.X = Location.X;
                _SelfLocation.Y = Location.Y;
                _MouseLocation.X = Cursor.Position.X;
                _MouseLocation.Y = Cursor.Position.Y;
                _SelfWidth = Width;
                _SelfHeight = Height;
            }
        }

        private void ShapeEx_MouseMove(object sender, MouseEventArgs e)
        {
            //move and resize
            switch (_SelectSelctedIndex)
            {
                case 0:
                    Location = new Point(Cursor.Position.X - (_MouseLocation.X - _SelfLocation.X),
                                         Cursor.Position.Y - (_MouseLocation.Y - _SelfLocation.Y));
                    break;
                case 1:
                    Height = _SelfHeight - (Cursor.Position.Y - _MouseLocation.Y);
                    Width = _SelfWidth - (Cursor.Position.X - _MouseLocation.X);
                    Location = new Point(Cursor.Position.X - _MouseLocation.X + _SelfLocation.X,
                                         Cursor.Position.Y - _MouseLocation.Y + _SelfLocation.Y);
                    break;
                case 2:
                    Height = _SelfHeight - (Cursor.Position.Y - _MouseLocation.Y);
                    Location = new Point(_SelfLocation.X, Cursor.Position.Y - _MouseLocation.Y + _SelfLocation.Y);
                    break;
                case 3:
                    Height = _SelfHeight - (Cursor.Position.Y - _MouseLocation.Y);
                    Width = _SelfWidth + (Cursor.Position.X - _MouseLocation.X);
                    Location = new Point(_SelfLocation.X, Cursor.Position.Y - (_MouseLocation.Y - _SelfLocation.Y));
                    break;
                case 4:
                    Width = _SelfWidth + (Cursor.Position.X - _MouseLocation.X);
                    break;
                case 5:
                    Height = _SelfHeight + (Cursor.Position.Y - _MouseLocation.Y);
                    Width = _SelfWidth + (Cursor.Position.X - _MouseLocation.X);
                    break;
                case 6:
                    Height = _SelfHeight + (Cursor.Position.Y - _MouseLocation.Y);
                    break;
                case 7:
                    Height = _SelfHeight + (Cursor.Position.Y - _MouseLocation.Y);
                    Width = _SelfWidth - (Cursor.Position.X - _MouseLocation.X);
                    Location = new Point(Cursor.Position.X - _MouseLocation.X + _SelfLocation.X, _SelfLocation.Y);
                    break;
                case 8:
                    Width = _SelfWidth - (Cursor.Position.X - _MouseLocation.X);
                    Location = new Point(Cursor.Position.X - _MouseLocation.X + _SelfLocation.X, _SelfLocation.Y);
                    break;
            }
            Invalidate();
        }

        private void ShapeEx_MouseLeave(object sender, EventArgs e)
        {
            Cursor = Cursors.Default;
            _SelectSelctedIndex = -1;
        }

        private void ShapeEx_MouseUp(object sender, MouseEventArgs e)
        {
            _ShapeExIsFocus = 0;
            Cursor = Cursors.Default;
            _SelectSelctedIndex = -1;
        }

        /// <summary>
        /// 用于减少画面闪烁效果及刷新控件
        /// </summary>
        /// <param name="e"></param>
        protected override void OnLocationChanged(EventArgs e)
        {
            Visible = false;
            Visible = true;
        }

        #endregion
        /// <summary>  
        /// 对一个坐标点按照一个中心进行旋转  
        /// </summary>  
        /// <param name="center">中心点</param>  
        /// <param name="p1">要旋转的点</param>  
        /// <param name="angle">旋转角度,笛卡尔直角坐标</param>  
        /// <returns></returns>  
        private Point PointRotate(Point center, Point p1, double angle)
        {
            Point tmp = new Point();
            double angleHude = angle * Math.PI / 180;/*角度变成弧度*/
            double x1 = (p1.X - center.X) * Math.Cos(angleHude) + (p1.Y - center.Y) * Math.Sin(angleHude) + center.X;
            double y1 = -(p1.X - center.X) * Math.Sin(angleHude) + (p1.Y - center.Y) * Math.Cos(angleHude) + center.Y;
            tmp.X = (int)x1;
            tmp.Y = (int)y1;
            return tmp;
        }
        /// <summary>
        /// 根据rectangle的4个顶点获取旋转后的坐标
        /// </summary>
        /// <param name="leftToppoint">左上角坐标</param>
        /// <param name="leftBottompoint">左下脚坐标</param>
        /// <param name="rightToppoint">右上角坐标</param>
        /// <param name="rightBottompoint">右下角坐标</param>
        /// <returns>旋转后的4点坐标</returns>
        private Point[] RPoints(Point leftToppoint, Point rightToppoint, Point rightBottompoint, Point leftBottompoint)
        {
            //旋转后的点
            Point rationleftToppoint = PointRotate(Point.Ceiling(Pcenter), leftToppoint, _ShapeExAngle);
            Point rationleftBottompoint = PointRotate(Point.Ceiling(Pcenter), leftBottompoint, _ShapeExAngle);
            Point rationrightToppoint = PointRotate(Point.Ceiling(Pcenter), rightToppoint, _ShapeExAngle);
            Point rationrightBottompoint = PointRotate(Point.Ceiling(Pcenter), rightBottompoint, _ShapeExAngle);

            Point[] rPoints =
                {
                    rationleftToppoint, rationrightToppoint, rationrightBottompoint, rationleftBottompoint
                };
            return rPoints;
        }
        /// <summary>
        /// 根据rectangle的4个顶点获取旋转后的坐标
        /// </summary>
        /// <param name="points">左上角坐标,左下脚坐标,右上角坐标,右下角坐标 </param>
        /// <returns>旋转后的4点坐标</returns>
        private Point[] RPoints(Point[] points)
        {
            //旋转后的点 
            Point rationleftToppoint = PointRotate(Point.Ceiling(Pcenter), points[0], _ShapeExAngle);
            Point rationrightToppoint = PointRotate(Point.Ceiling(Pcenter), points[1], _ShapeExAngle);
            Point rationrightBottompoint = PointRotate(Point.Ceiling(Pcenter), points[2], _ShapeExAngle);
            Point rationleftBottompoint = PointRotate(Point.Ceiling(Pcenter), points[3], _ShapeExAngle);

            Point[] rPoints =
                {
                    rationleftToppoint, rationrightToppoint, rationrightBottompoint, rationleftBottompoint
                };
            return rPoints;
        }
        private int getPointCoorX (Point[] arr,bool isMax)
        {
                if (arr == null)
                {
                    throw new Exception();
                }
                int max = 0;
                int[] myarr = new int[5];
                for (int i = 0; i < arr.Length - 1; i++)
                {
                    myarr[i] = arr[i].X;
                }
                Array.Sort(myarr);
                if (isMax)
                {
                    return myarr[myarr.Length - 1];
                }
                else
                {
                    return myarr[0];
                }
           
        }
        private int getPointCoorY(Point[] arr,bool isMax)
        {
           
                if (arr == null)
                {
                    throw new Exception();
                }
                int max = 0;
                int[] myarr = new int[5];
                for (int i = 0; i < arr.Length - 1; i++)
                {
                    myarr[i] = arr[i].Y;
                }
                Array.Sort(myarr);
                if (isMax)
                {
                    return myarr[myarr.Length - 1];
                }
                else
                {
                    return myarr[0];
                }
            }
        }
    
}
View Code
原文地址:https://www.cnblogs.com/anbylau2130/p/3174034.html