前面讲了如何使用C#拟合圆,取得圆的半径与中心坐标,参阅C#已知圆周上三点计算圆心。接上文,求圆周上任意一点绕圆心旋转一定角度后的坐标。
假设对圆周上任意点(x,y),绕一个坐标点(rx0,ry0)逆时针旋转RotaryAngle角度后的新的坐标设为(x’, y’),有公式:
复制
x'= (x - rx0)*cos(RotaryAngle) + (y - ry0)*sin(RotaryAngle) + rx0 ; y'=-(x - rx0)*sin(RotaryAngle) + (y - ry0)*cos(RotaryAngle) + ry0 ;
C#代码
复制
/// <summary> /// 旋转后坐标 /// </summary> /// <param name="center">圆心坐标</param> /// <param name="fpoint">旋转前坐标</param> /// <param name="alg">旋转角度</param> /// <returns>旋转后坐标</returns> mPoint PointRotate(mPoint center, mPoint fpoint, double alg) { mPoint lpoint; alg = (alg / 180.0) * Math.PI; double a = Math.Cos(alg); double b = Math.Sin(alg); lpoint.X = (fpoint.X - center.X) * a + (fpoint.Y - center.Y) * b + center.X; lpoint.Y = -(fpoint.X - center.X) * b + (fpoint.Y - center.Y) * a + center.Y; return lpoint; }
mPoint的结构体这里就不贴了,请联系前文阅读:C#已知圆周上三点计算圆心
这里需要注意两个地方,在测试代码的时候容易让你怀疑人生。
- 在进行浮点运算时,一定不要让整型参与,建议统一格式化成浮点类型。
- 浮点数转字符串时不要直接使用
ToString()
,要写成ToString("0.00")
这样。
几位小数随便你,我在测试时遇到浮点数0.0000000XX这种使用ToString()
结果给我变成了1.0000000XX。
评论 (0)