Here in C# ...
public static List<LinhaGCode> Bulge2IJ(double X1, double Y1, double X2, double Y2, double Bulge, Config config)
{
double C = 0;
double H = 0;
double alpha2 = 0;
double beta = 0;
List<LinhaGCode> lista = new List<LinhaGCode>();
double I, J, R;
if (Bulge != 0)
{
C = Math.Sqrt(Math.Pow((X2 - X1), 2) + Math.Pow((Y2 - Y1), 2));
alpha2 = Math.Atan(Bulge) * 2;
R = Math.Abs(C / (2 * Math.Sin(alpha2)));
H = Math.Sqrt(Math.Pow(R, 2) - Math.Pow((C / 2), 2));
if ((Bulge > 1) || ((Bulge < 0) && (Bulge > -1)))
{
alpha2 = alpha2 + Math.PI;
}
if (X1 != X2)
{
beta = Math.Atan(System.Convert.ToDouble(Y2 - Y1) / System.Convert.ToDouble(X2 - X1));
if (X2 < X1)
{
beta = beta + Math.PI;
}
}
else
{
if (Y2 < Y1)
{
beta = (-1) * (Math.PI / 2);
}
else
{
beta = Math.PI / 2; ;
}
}
if ((Bulge > 1) || ((Bulge < 0) && (Bulge > -1)))
{
I = (X2 - X1) / 2 + (Math.Cos(beta - Math.PI / 2) * H);
J = (Y2 - Y1) / 2 + (Math.Sin(beta - Math.PI / 2) * H);
}
else
{
I = (X2 - X1) / 2 - (Math.Cos(beta - Math.PI / 2) * H);
J = (Y2 - Y1) / 2 - (Math.Sin(beta - Math.PI / 2) * H);
}
if (Bulge > 0)
{
lista.Add(new LinhaGCode("G03", X2, Y2, config.Z_G03, I, J));
}
else
{
lista.Add(new LinhaGCode("G02", X2, Y2, config.Z_G03, I, J));
}
}
else
{
lista.Add(new LinhaGCode("G01", X2, Y2, config.Z_G01));
}
return lista;
}