新浪博客

线切割3B代码中圆弧计数长度J的计算

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


线切割3B代码中圆弧计数长度J的计算

基本思路:
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);
}
};

--- 完 ---

我的更多文章

下载客户端阅读体验更佳

APP专享