旋转中心计算推导及C#代码实现

using System;

public class CoordinateRotation
{
    /// <summary>
    /// 坐标旋转
    /// </summary>
    /// <param name="x0">原始点的 X 坐标</param>
    /// <param name="y0">原始点的 Y 坐标</param>
    /// <param name="degree">旋转角度(度)</param>
    /// <param name="refX">参考点的 X 坐标(默认为 0)</param>
    /// <param name="refY">参考点的 Y 坐标(默认为 0)</param>
    /// <returns>旋转后的坐标 (x1, y1)</returns>
    public static (double x1, double y1) Rotate(double x0, double y0, double degree, double refX = 0.0, double refY = 0.0)
    {
        double beta = degree * Math.PI / 180; // 将角度转换为弧度
        double cosBeta = Math.Cos(beta);
        double sinBeta = Math.Sin(beta);

        // 计算旋转后的坐标
        double x1 = (x0 - refX) * cosBeta - (y0 - refY) * sinBeta + refX;
        double y1 = (x0 - refX) * sinBeta + (y0 - refY) * cosBeta + refY;

        return (x1, y1);
    }
}

class Program
{
    static void Main()
    {
        // 示例:将点 (1, 1) 绕原点旋转 90 度
        var result = CoordinateRotation.Rotate(1, 1, 90);
        Console.WriteLine($"旋转后的坐标: ({result.x1}, {result.y1})");

        // 示例:将点 (2, 3) 绕参考点 (1, 1) 旋转 45 度
        var result2 = CoordinateRotation.Rotate(2, 3, 45, 1, 1);
        Console.WriteLine($"旋转后的坐标: ({result2.x1}, {result2.y1})");
    }
}

在这里插入图片描述

using System;

public class RotationCenterSolver
{
    /// <summary>
    /// 求解旋转参考点
    /// </summary>
    /// <param name="x1">旋转前的点的 X 坐标</param>
    /// <param name="y1">旋转前的点的 Y 坐标</param>
    /// <param name="x2">旋转后的点的 X 坐标</param>
    /// <param name="y2">旋转后的点的 Y 坐标</param>
    /// <param name="degree">旋转角度(度)</param>
    /// <returns>旋转参考点 (xc, yc)</returns>
    public static (double xc, double yc) SolveRotationCenter(double x1, double y1, double x2, double y2, double degree)
    {
        double theta = degree * Math.PI / 180; // 将角度转换为弧度
        double cosTheta = Math.Cos(theta);
        double sinTheta = Math.Sin(theta);

        // 构造线性方程组的系数矩阵
        double a11 = 1 - cosTheta;
        double a12 = sinTheta;
        double a21 = -sinTheta;
        double a22 = 1 - cosTheta;

        // 构造常数项
        double b1 = x1 * cosTheta - y1 * sinTheta - x2;
        double b2 = x1 * sinTheta + y1 * cosTheta - y2;

        // 解线性方程组
        double determinant = a11 * a22 - a12 * a21;
        if (Math.Abs(determinant) < 1e-10)
        {
            throw new InvalidOperationException("无解或无穷多解,可能旋转角度为 0 或 360 度。");
        }

        double xc = (a22 * b1 - a12 * b2) / determinant;
        double yc = (-a21 * b1 + a11 * b2) / determinant;

        return (xc, yc);
    }
}

class Program
{
    static void Main()
    {
        // 示例:已知旋转前的点 (1, 1),旋转后的点 (-1, 1),旋转角度 90 度
        var result = RotationCenterSolver.SolveRotationCenter(1, 1, -1, 1, 90);
        Console.WriteLine($"旋转参考点: ({result.xc}, {result.yc})");

        // 示例:已知旋转前的点 (2, 3),旋转后的点 (0.707, 2.414),旋转角度 45 度
        var result2 = RotationCenterSolver.SolveRotationCenter(2, 3, 0.707, 2.414, 45);
        Console.WriteLine($"旋转参考点: ({result2.xc}, {result2.yc})");
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值