Ejemplo n.º 1
0
        /// <summary>
        /// MyLocation类的+运算符重载,必须是Static
        /// </summary>
        /// <param name="loc">new Loaction</param>
        /// <param name="loc1">new Loaction</param>
        /// <returns></returns>
        public static MyLocation operator +(MyLocation loc, MyLocation loc1)
        {
            MyLocation MyLocation = new MyLocation();

            foreach (PropertyInfo item in MyLocation.GetType().GetProperties())
            {
                Type t = item.PropertyType;
                item.SetValue(MyLocation, (double)loc.GetType().GetProperty(item.Name).GetValue(loc) + (double)loc1.GetType().GetProperty(item.Name).GetValue(loc1));
            }
            return(MyLocation);
        }
Ejemplo n.º 2
0
        private void btnRun_Click(object sender, EventArgs e)
        {
            double deltaX = para.MyPoint.X - para.Center.X;
            double deltaY = para.MyPoint.Y - para.Center.Y;
            double radius = Math.Sqrt(Math.Pow(deltaX, 2) + Math.Pow(deltaY, 2));


            Point point = para.Center;

            TransPoint(ref point);
            graphic.DrawEllipse(new Pen(Color.Blue, 3), (int)(point.X - radius), (int)(point.Y - radius), (int)(2 * radius), (int)(2 * radius));


            MyLocation myLocation = new MyLocation();

            myLocation.X = para.MyPoint.X;
            myLocation.Y = para.MyPoint.Y;
            var l = myLocation.GetLocation(myLocation, para.Center.X, para.Center.Y, para.Angle, para.XDirection, para.YDirection);

            Point pointResult = new Point(Convert.ToInt32(l.X), Convert.ToInt32(l.Y));

            TransPoint(ref pointResult);

            graphic.FillEllipse(Brushes.Green, pointResult.X - 5, pointResult.Y - 5, 10, 10);

            graphic.DrawString(string.Format("({0}º,{1},{2})", para.Angle.ToString("0"), l.X.ToString("0"), l.Y.ToString("0")), new Font("宋体", 10, FontStyle.Italic), Brushes.Black, pointResult);

            Point myPoint = para.MyPoint;

            TransPoint(ref myPoint);

            Point center = para.Center;

            TransPoint(ref center);

            graphic.DrawLine(new Pen(Brushes.Cyan, 2), myPoint, center);

            graphic.DrawLine(new Pen(Brushes.Cyan, 2), pointResult, center);



            //旋转180度参考点
            var point180 = myLocation.GetLocation(myLocation, para.Center.X, para.Center.Y, 180, para.XDirection, para.YDirection);

            Point pointResult180 = new Point(Convert.ToInt32(point180.X), Convert.ToInt32(point180.Y));

            TransPoint(ref pointResult180);

            graphic.FillEllipse(Brushes.Black, pointResult180.X - 5, pointResult180.Y - 5, 10, 10);

            graphic.DrawString(string.Format("(旋转180度)", point180.X.ToString("0"), point180.Y.ToString("0")), new Font("宋体", 10, FontStyle.Italic), Brushes.Black, pointResult180);

            this.pictureBox1.Image = the_back;
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 返回旋转后的MyLocation
        /// </summary>
        /// <param name="MyLocation">旋转之前MyLocation</param>
        /// <param name="X0">旋转中心X0</param>
        /// <param name="Y0">旋转中心Y0</param>
        /// <param name="degree">旋转的角度</param>
        /// <param name="X_Positive">用于判断相限,水平方向沿→递增为真</param>
        /// <param name="Y_Positive">用于判断相限,垂直方向向↑递增为真</param>
        /// <returns></returns>
        public MyLocation GetLocation(MyLocation myLocation, double X0, double Y0, double degree, bool X_Positive = true, bool Y_Positive = true)
        {
            /*绕原点旋转矩阵表达式    https://blog.csdn.net/u012138730/article/details/80320162
             * [cos(θ),sin(θ)]    [x]    [x1]
             * [-sin(θ),cos(θ)]   [y]    [y1]
             */

            MyLocation loc = new MyLocation();

            double rad = (degree / 180) * Math.PI;

            if (X_Positive == true && Y_Positive == true)
            {
                //角度为正 顺时针旋转
                loc.X = (myLocation.X - X0) * Math.Cos(rad) + (myLocation.Y - Y0) * Math.Sin(rad) + X0;
                loc.Y = -(myLocation.X - X0) * Math.Sin(rad) + (myLocation.Y - Y0) * Math.Cos(rad) + Y0;
            }
            else if (X_Positive == false && Y_Positive == true)
            {
                //角度为正 逆时针旋转
                rad   = -rad;
                loc.X = (myLocation.X - X0) * Math.Cos(rad) + (myLocation.Y - Y0) * Math.Sin(rad) + X0;
                loc.Y = -(myLocation.X - X0) * Math.Sin(rad) + (myLocation.Y - Y0) * Math.Cos(rad) + Y0;
            }
            else if (X_Positive == true && Y_Positive == false)
            {
                //角度为正 逆时针旋转
                rad   = -rad;
                loc.X = (myLocation.X - X0) * Math.Cos(rad) + (myLocation.Y - Y0) * Math.Sin(rad) + X0;
                loc.Y = -(myLocation.X - X0) * Math.Sin(rad) + (myLocation.Y - Y0) * Math.Cos(rad) + Y0;
            }
            else
            {
                //角度为正 顺时针旋转
                loc.X = (myLocation.X - X0) * Math.Cos(rad) + (myLocation.Y - Y0) * Math.Sin(rad) + X0;
                loc.Y = -(myLocation.X - X0) * Math.Sin(rad) + (myLocation.Y - Y0) * Math.Cos(rad) + Y0;
            }

            return(loc);
        }