Files
WaferAdjust/WaferAdjust/Rotation2D.cs
2025-11-21 11:29:53 +08:00

177 lines
6.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WaferAdjust
{
/// <summary>
/// 二维坐标旋转计算器(支持自定义坐标系方向)
/// </summary>
public class Rotation2D
{
#region
/// <summary>
/// 点A绕点B逆时针旋转指定角度角度制
/// </summary>
/// <param name="ax">点A的X坐标</param>
/// <param name="ay">点A的Y坐标</param>
/// <param name="bx">旋转中心B的X坐标</param>
/// <param name="by">旋转中心B的Y坐标</param>
/// <param name="angleDegrees">旋转角度(角度制,逆时针)</param>
/// <param name="isRight">X轴正方向是否向右默认true</param>
/// <param name="isUp">Y轴正方向是否向上默认true</param>
/// <returns>旋转后的点A'坐标 (x', y')</returns>
public static (double x, double y) RotatePointDegrees(
double ax, double ay,
double bx, double by,
double angleDegrees,
bool isRight = true,
bool isUp = true)
{
return RotatePointRadians(ax, ay, bx, by,
DegreesToRadians(angleDegrees), isRight, isUp);
}
/// <summary>
/// 点A绕点B逆时针旋转指定角度弧度制
/// </summary>
/// <param name="ax">点A的X坐标</param>
/// <param name="ay">点A的Y坐标</param>
/// <param name="bx">旋转中心B的X坐标</param>
/// <param name="by">旋转中心B的Y坐标</param>
/// <param name="angleRadians">旋转角度(弧度制,逆时针)</param>
/// <param name="isRight">X轴正方向是否向右默认true</param>
/// <param name="isUp">Y轴正方向是否向上默认true</param>
/// <returns>旋转后的点A'坐标 (x', y')</returns>
public static (double x, double y) RotatePointRadians(
double ax, double ay,
double bx, double by,
double angleRadians,
bool isRight = true,
bool isUp = true)
{
// 1. 转换为标准数学坐标系(向右为正,向上为正)
double mathAx = isRight ? ax : -ax;
double mathAy = isUp ? ay : -ay;
double mathBx = isRight ? bx : -bx;
double mathBy = isUp ? by : -by;
// 2. 在标准坐标系中执行旋转
double cosR = Math.Cos(angleRadians);
double sinR = Math.Sin(angleRadians);
double dx = mathAx - mathBx;
double dy = mathAy - mathBy;
double rotatedDx = dx * cosR - dy * sinR;
double rotatedDy = dx * sinR + dy * cosR;
double mathNewX = mathBx + rotatedDx;
double mathNewY = mathBy + rotatedDy;
// 3. 转换回用户指定的坐标系
double outputX = isRight ? mathNewX : -mathNewX;
double outputY = isUp ? mathNewY : -mathNewY;
return (outputX, outputY);
}
#endregion
#region
/// <summary>
/// 已知旋转后的点A'求绕点B逆时针旋转前的原始点A角度制
/// </summary>
/// <param name="rotatedX">旋转后的点A'的X坐标</param>
/// <param name="rotatedY">旋转后的点A'的Y坐标</param>
/// <param name="bx">旋转中心B的X坐标</param>
/// <param name="by">旋转中心B的Y坐标</param>
/// <param name="angleDegrees">旋转角度(角度制,逆时针)</param>
/// <param name="isRight">X轴正方向是否向右默认true</param>
/// <param name="isUp">Y轴正方向是否向上默认true</param>
/// <returns>原始的未旋转点A坐标 (x, y)</returns>
public static (double x, double y) GetOriginalPointDegrees(
double rotatedX, double rotatedY,
double bx, double by,
double angleDegrees,
bool isRight = true,
bool isUp = true)
{
return GetOriginalPointRadians(rotatedX, rotatedY, bx, by,
DegreesToRadians(angleDegrees), isRight, isUp);
}
/// <summary>
/// 已知旋转后的点A'求绕点B逆时针旋转前的原始点A弧度制
/// </summary>
/// <param name="rotatedX">旋转后的点A'的X坐标</param>
/// <param name="rotatedY">旋转后的点A'的Y坐标</param>
/// <param name="bx">旋转中心B的X坐标</param>
/// <param name="by">旋转中心B的Y坐标</param>
/// <param name="angleRadians">旋转角度(弧度制,逆时针)</param>
/// <param name="isRight">X轴正方向是否向右默认true</param>
/// <param name="isUp">Y轴正方向是否向上默认true</param>
/// <returns>原始的未旋转点A坐标 (x, y)</returns>
public static (double x, double y) GetOriginalPointRadians(
double rotatedX, double rotatedY,
double bx, double by,
double angleRadians,
bool isRight = true,
bool isUp = true)
{
// 1. 转换为标准数学坐标系
double mathRotatedX = isRight ? rotatedX : -rotatedX;
double mathRotatedY = isUp ? rotatedY : -rotatedY;
double mathBx = isRight ? bx : -bx;
double mathBy = isUp ? by : -by;
// 2. 在标准坐标系中执行反向旋转
double cosR = Math.Cos(angleRadians);
double sinR = Math.Sin(angleRadians);
double dx = mathRotatedX - mathBx;
double dy = mathRotatedY - mathBy;
// 反向旋转(相当于顺时针旋转)
double originalDx = dx * cosR + dy * sinR;
double originalDy = -dx * sinR + dy * cosR;
double mathOriginalX = mathBx + originalDx;
double mathOriginalY = mathBy + originalDy;
// 3. 转换回用户指定的坐标系
double outputX = isRight ? mathOriginalX : -mathOriginalX;
double outputY = isUp ? mathOriginalY : -mathOriginalY;
return (outputX, outputY);
}
#endregion
#region
/// <summary>
/// 角度转弧度
/// </summary>
private static double DegreesToRadians(double degrees)
{
return degrees * Math.PI / 180.0;
}
/// <summary>
/// 弧度转角度(公共方法,供外部使用)
/// </summary>
public static double RadiansToDegrees(double radians)
{
return radians * 180.0 / Math.PI;
}
#endregion
}
}