加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2017-05-08 22:39:59)
标签:

3b代码

j计数长度

圆弧

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

http://s14/mw690/006bdz5Hzy7aV5tSmkJ1d&690

基本思路:
1. 计算的长度是如图所示的各段圆弧在轴上的投影,圆弧投影与上图中的弦长投影是一样的。
2. 找出各段弧的弦长。
3. 将起点A,终点B,以及各坐标轴与圆的交点进行排序,处于A,B之间的所有点进行连线,解算出各个弦长向量。
4. 各个弦长向量在坐标轴上的投影绝对值之和,便是圆弧的计数长度。

附伪代码如下:
        class ArcProject
        {
            struct PosInfo
            {
                PosInfo(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);
            }
        };

--- 完 ---


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有