线切割3B代码中圆弧计数长度J的计算
2017-05-08 22:39阅读:
最近一周看线切割中3B代码的自动生成,最麻烦的就是圆弧计数长度的计算,网上资料很多,但所查资料均是手工如何计算。那么如何编程实现自动计算呢?

基本思路:
1. 计算的长度是如图所示的各段圆弧在轴上的投影,圆弧投影与上图中的弦长投影是一样的。
2. 找出各段弧的弦长。
3. 将起点A,终点B,以及各坐标轴与圆的交点进行排序,处于A,B之间的所有点进行连线,解算出各个弦长向量。
4. 各个弦长向量在坐标轴上的投影绝对值之和,便是圆弧的计数长度。
附伪代码如下:
class
ArcProject
{
struct PosInfo
{
P
osInfo(IPoint2D pt, double angle = 0)
{
m_point =
pt;
m_angle =
angle;
}
bool operator < (const
PosInfo& info) const
{
return
m_angle < info.m_angle;
}
IPoint2D m_point;
double
m_angle;
};
public:
int GetProject(DPoint2D startPos, DPoint2D endPos, DPoint2D
center, bool cw)
{
IPoint2D projAxis = abs(endPos.x())
> abs(endPos.y()) ? IPoint(0, 1) : IPoint(1, 0);
if (cw) {
std::swap(startPos, endPos);
}
//计算整形的点和半径
DPoint2D startVect = (startPos -
center)*1000;
DPoint2D endVect = (endPos -
center)*1000;
double dr =
(startVect.Mag() + endVect.Mag()) / 2.0;
IPoint2D
iStartVect(Round(startVect.x()), Round(startVect.y()));
IPoint2D
iEndVect(Round(endVect.x()), Round(endVect.y()));
int
r = TToInteger::Round(dr);
//生成可能的点
std::vector infos;
infos.push_back(iStartVect);
infos.push_back(iEndVect);
infos.push_back(IPoint2D(r,
0));
infos.push_back(IPoint2D(0,
r));
infos.push_back(IPoint2D(-r,
0));
infos.push_back(IPoint2D(0,
-r));
//计算角度
infos[0].m_angle = 0;
IPoint2D baseVect =
infos[0].m_point;
for (int i = 1; i < 6;
++i)
{
double
angle = baseVect.AngleTo(infos[i].m_point);
angle =
angle < 0 ? angle + 2*TMathTool::PI() : angle;
infos[i].m_angle = angle;
}
//排序
std::sort(infos.begin(),
infos.end());
int lastPos = 0;
for (int i = 1; i < 6;
++i)
{
if
(infos[i].m_point == iEndVect)
{
lastPos = i;
break;
}
}
int i = 1;
double sum = 0;
for(int i=1; i<=lastPos;
++i)
{
IPoint vect
= infos[i].m_point - infos[i-1].m_point;
double dist
= vect.DotProduct(projAxis);
sum +=
abs(dist);
}
return
TToInteger::Round(sum);
}
};
--- 完 ---