参考指令
G00X5.0Y2.6
G03X6.0Y1.6A1.0
转换方法:
/// <summary>
/// 将G02|G03圆弧段R参数转换成IJ参数
/// </summary>
/// <param name="x0">起始点X坐标</param>
/// <param name="y0">起始点Y坐标</param>
/// <param name="x1">结束点X坐标</param>
/// <param name="y1">结束点Y坐标</param>
/// <param name="r">圆弧半径。如果半径大于0,则圆弧角度小于180度,否则大于180度</param>
/// <param name="clockwise">是否是顺时针,G02表示顺时针,G03表示逆时针,不需要考虑轴版本做调整</param>
/// <returns>参数(I,J)</returns>
public static (double, double) XYAToXYIJ(double x0, double y0, double x1, double y1, double r, bool clockwise)
{
// 计算圆点中心坐标
double centerX, centerY;
if (Equals(y0, y1))
{
centerX = (x0 + x1) / 2;
double w = centerX - x0;
double h = Math.Sqrt(r * r - w * w);
int sign = Math.Sign(x1 - x0) * Math.Sign(r);
centerY = clockwise ? y0 - sign * h : y0 + sign * h;
}
else if (Equals(x0, x1))
{
centerY = (y0 + y1) / 2;
double h = centerY - y0;
double w = Math.Sqrt(r * r - h * h);
int sign = Math.Sign(y1 - y0) * Math.Sign(r);
centerX = clockwise ? x0 + sign * w : x0 - sign * w;
}
else
{
double mx = (x0 + x1) / 2;
double my = (y0 + y1) / 2;
double m = (x0 - x1) / (y1 - y0);
double d = my - m * mx - y0;
double a = 1 + m * m;
double b = 2 * (m * d - x0);
double c = d * d + x0 * x0 - r * r;
d = Math.Sqrt(b * b - 4 * a * c);
int sign = Math.Sign(x1 - x0) * Math.Sign(r);
centerX = clockwise ? (-b - sign * d) / (2 * a) : (-b + sign * d) / (2 * a);
centerY = m * (centerX - mx) + my;
}
return (centerX - x0, centerY - y0);
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。