/// <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); }
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; }
/// <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); }