You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

310 lines
9.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using GummingEntity;
using System;
using System.Collections.Generic;
using System.Text;
namespace GummingSupport
{
public class Common
{
public static double PI = Math.PI;
public static int ToInt(string str)
{
int result = 0;
int.TryParse(str, out result);
return result;
}
public static uint ToUInt32(string str)
{
uint result = 0;
uint.TryParse(str, out result);
return result;
}
public static ushort ToUInt16(int? str)
{
ushort result = 0;
ushort.TryParse(str?.ToString(), out result);
return result;
}
public static double ToDouble(string str)
{
double result = 0;
double.TryParse(str, out result);
return result;
}
public static decimal ToDecimal(string str)
{
decimal result = 0;
decimal.TryParse(str, out result);
return result;
}
public static int Atoi(byte[] chr)
{
//return int.Parse(new string(chr));
return BitConverter.ToInt32(chr, 0);
}
public static double Acos(double value)
{
double getValue = Math.Acos(value);
if (double.IsNaN(getValue))
{
getValue = 0;
}
return getValue;
}
public static double Asin(double value)
{
double getValue = Math.Asin(value);
if (double.IsNaN(getValue))
{
getValue = 0;
}
return getValue;
}
public static double Sqrt(double value)
{
double getValue = Math.Sqrt(value);
if (double.IsNaN(getValue))
{
getValue = 0;
}
return getValue;
}
public static double Speed(double speed, double newSpeed)
{
if (double.IsNaN(newSpeed) || newSpeed == 0)
{
return speed;
}
return newSpeed;
}
public static double Pow(double x, double y)
{
double getValue = Math.Pow(x, y);
if (double.IsNaN(getValue))
{
getValue = 0;
}
return getValue;
}
public static double Sin(double value)
{
double getValue = Math.Sin(value);
if (double.IsNaN(getValue))
{
getValue = 0;
}
return getValue;
}
public static double Cos(double value)
{
double getValue = Math.Cos(value);
if (double.IsNaN(getValue))
{
getValue = 0;
}
return getValue;
}
public static double Atan2(double y, double x)
{
double getValue = Math.Atan2(y, x);
if (double.IsNaN(getValue))
{
getValue = 0;
}
return getValue;
}
public static double Atan(double value)
{
double getValue = Math.Atan(value);
if (double.IsNaN(getValue))
{
getValue = 0;
}
return getValue;
}
public static int Atoi(char[] chr)
{
return int.Parse(new string(chr));
}
public static Point SetEnd(Point pt, Point a)
{
Point b = new Point(a.x + pt.x, a.y + pt.y);
return b;
}
public static int Bitnum(uint num, int bit)
{
uint value = num >> bit & 0x01;
if (value == 1)
return 1;
else
return 0;
}
public static bool Getend(byte a)
{
return !(Bitnum(a, 7) == 1 && Bitnum(a, 6) == 1 && Bitnum(a, 5) == 1 && Bitnum(a, 4) == 1 && Bitnum(a, 3) == 0 && Bitnum(a, 2) == 0 && Bitnum(a, 1) == 1 && Bitnum(a, 0) == 1);
}
public static int GetmoveY(byte a, byte b, byte c)
{
int move_y;
move_y = 81 * Bitnum(a, 5) - 81 * Bitnum(a, 4)
+ 3 * Bitnum(b, 7) - 3 * Bitnum(b, 6) + 27 * Bitnum(b, 5) - 27 * Bitnum(b, 4)
+ 1 * Bitnum(c, 7) - 1 * Bitnum(c, 6) + 9 * Bitnum(c, 5) - 9 * Bitnum(c, 4);
return move_y;
}
public static int GetmoveX(byte a, byte b, byte c)
{
int move_x;
move_x = 81 * Bitnum(a, 2) - 81 * Bitnum(a, 3)
+ 3 * Bitnum(b, 0) - 3 * Bitnum(b, 1) + 27 * Bitnum(b, 2) - 27 * Bitnum(b, 3)
+ 1 * Bitnum(c, 0) - 1 * Bitnum(c, 1) + 9 * Bitnum(c, 2) - 9 * Bitnum(c, 3);
return move_x;
}
//200926根据斜率、针距和合速度RPM计算脉冲合速度P/MS。之前XY轴共用当量当量不一致时会导致XY方向针距不均匀正圆弧针距周期性变化。
public static double Getvel(double zhuansu, double zhenju, double yuxianjiao, double xdang, double ydang)
{
double Vxy = zhuansu * zhenju / 60.0;//rpm-mm/s
double Vx = Vxy * Math.Cos(yuxianjiao);//mm/s
double Vy = Vxy * Math.Sin(yuxianjiao);//mm/s
double Vxyp = Math.Sqrt(Math.Pow(Vx * xdang, 2) + Math.Pow(Vy * ydang, 2)) / 1000.0;//p/ms
return Vxyp;
}
public static byte[] HexStringToByteArray(string s)
{
s = s.Replace(" ", "");
byte[] buffer = new byte[s.Length / 2];
for (int i = 0; i < s.Length; i += 2)
buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
return buffer;
}
public static string ByteArrayToHexString(byte[] data)
{
StringBuilder sb = new StringBuilder(data.Length * 3);
foreach (byte b in data)
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
return sb.ToString().ToUpper();
}
public static double SetAcc(int inacc, double xyscale)
{
double acc = inacc / 1000000.0;
return acc * xyscale;// XYdangScale;
}
/// <summary>
/// 线段与圆的交点
/// </summary>
/// <param name="ptStart">线段起点</param>
/// <param name="ptEnd">线段终点</param>
/// <param name="ptCenter">圆心坐标</param>
/// <param name="Radius2">圆半径平方</param>
/// <param name="ptInter1">交点1(若不存在返回65536)</param>
/// <param name="ptInter2">交点2(若不存在返回65536)</param>
public static bool LineInterCircle(Point ptStart, Point ptEnd, Point ptCenter, double Radius2,
ref Point ptInter1, ref Point ptInter2)
{
double EPS = 0.00001;
ptInter1.x = ptInter2.x = 65536.0f;
ptInter2.y = ptInter2.y = 65536.0f;
float fDis = (float)Math.Sqrt((ptEnd.x - ptStart.x) * (ptEnd.x - ptStart.x) + (ptEnd.y - ptStart.y) * (ptEnd.y - ptStart.y));
Point d = new Point();
d.x = (ptEnd.x - ptStart.x) / fDis;
d.y = (ptEnd.y - ptStart.y) / fDis;
Point E = new Point();
E.x = ptCenter.x - ptStart.x;
E.y = ptCenter.y - ptStart.y;
double a = E.x * d.x + E.y * d.y;
double a2 = a * a;
double e2 = E.x * E.x + E.y * E.y;
if ((Radius2 - e2 + a2) < 0)
{
return false;
}
else
{
double f = (float)Math.Sqrt(Radius2 - e2 + a2);
double t = a - f;
if (((t - 0.0) > -EPS) && (t - fDis) < EPS)
{
ptInter1.x = ptStart.x + t * d.x;
ptInter1.y = ptStart.y + t * d.y;
}
t = a + f;
if (((t - 0.0) > -EPS) && (t - fDis) < EPS)
{
ptInter2.x = ptStart.x + t * d.x;
ptInter2.y = ptStart.y + t * d.y;
}
return true;
}
}
public static double GetAngle(double startPointX, double startPointY, double centerPointX, double centerPointY, double endPointX, double endPointY)
{
double acosValue = ((endPointX - centerPointX) * (startPointX - centerPointX) +
(endPointY - centerPointY) * (startPointY - centerPointY))
/ Common.Sqrt(Common.Pow((endPointX - centerPointX), 2) + Common.Pow((endPointY - centerPointY), 2))
/ Common.Sqrt(Common.Pow((startPointX - centerPointX), 2) + Common.Pow((startPointY - centerPointY), 2));
if (acosValue < -1)
{
acosValue = -1;
}
if (acosValue > 1)
{
acosValue = 1;
}
return Acos(acosValue) * 180.0 / Math.PI;
}
public static double GetAngle(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
{
// 线段的向量表示形式
double v1x = x2 - x1, v1y = y2 - y1;
double v2x = x4 - x3, v2y = y4 - y3;
// 向量点积
double dotProduct = v1x * v2x + v1y * v2y;
// 向量模长
double v1Length = Common.Sqrt(v1x * v1x + v1y * v1y);
double v2Length = Common.Sqrt(v2x * v2x + v2y * v2y);
// 计算夹角的余弦值
double cosAngle = dotProduct / (v1Length * v2Length);
// 计算夹角的角度值
return Acos(cosAngle) * 180.0 / Math.PI;
}
}
}