在运动控制中经常当修正某一产品角度后同时需要修正他的XY轴使得产品在相机中的位置不变也就是所谓的偏心旋转求坐标
前段时间在做这个需求的时候发现需要一个关键参数:圆心坐标
///
/// 偏心旋转
///
/// 点1x
/// 点1y
/// 旋转中心x
/// 旋转中心y
/// 旋转角度
///
public static Epoint RotatePoint(double x, double y, double cx, double cy, double angle)
{
// 将角度转换为弧度
double radians = angle * Math.PI / 180.0;
// 平移点到原点
double translatedX = x - cx;
double translatedY = y - cy;
// 应用旋转矩阵
double rotatedX = translatedX * Math.Cos(radians) - translatedY * Math.Sin(radians);
double rotatedY = translatedX * Math.Sin(radians) + translatedY * Math.Cos(radians);
// 平移回原位置
double newX = rotatedX + cx;
double newY = rotatedY + cy;
return new Epoint(newX, newY);
}
但是由于我们这里的当时无法直接拿到旋转中心的坐标所以需要进行“旋转标定”(自己起的);简单来说就是通过拿到一个点在旋转θ后的坐标,通过拿到初始坐标和旋转后的坐标就可以直接拿到圆心坐标
///
/// 通过两点计算旋转中心
///
/// 旋转前x
/// 旋转前y
/// 旋转后x
/// 旋转后y
/// 旋转角度
///
public static Epoint FindCircleCenter(double x1, double y1, double x2, double y2, double theta)
{
// 将角度转换为弧度
double thetaRad = theta * Math.PI / 180.0;
// 计算中点
double midX = (x1 + x2) / 2;
double midY = (y1 + y2) / 2;
// 计算旋转角的正弦和余弦
double sinTheta = Math.Sin(thetaRad);
double cosTheta = Math.Cos(thetaRad);
// 计算圆心坐标
double a = midX + (y1 - y2) * sinTheta / (2 * (1 - cosTheta));
double b = midY + (x2 - x1) * sinTheta / (2 * (1 - cosTheta));
return new Epoint(a, b);
}