找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1261|回复: 4

[文章]:已知一段弧的起点和终点以及其凸度,求其圆心

[复制链接]
发表于 2003-7-29 15:56:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
已知一段弧的起点和终点以及其凸度,求其圆心  

int getCenter(ads_point startPoint,ads_point endPoint,double bulge,ads_point& center)
{
  if (bulge==0.0)
  {
    ads_point_set(startPoint,center);
    return 0;
  }
  ads_point startPt,endPt;
  if (bulge<0.0)
  {
    ads_point_set(endPoint,startPt);
    ads_point_set(startPoint,endPt);
    bulge=bulge*(-1.0);
  }
  else
  {
    ads_point_set(startPoint,startPt);
    ads_point_set(endPoint,endPt);
  }
  double distStartToEnd,distX,distY,radius;
  distStartToEnd=ads_distance(startPt,endPt);
  distX=distStartToEnd/2.0;
  distY=bulge*distX;
  radius=((distX*distX)+(distY*distY))/(2.0*distY);

  double tmpAng;
  ads_point tmpPt;

  tmpAng=ads_angle(startPt,endPt);
  ads_polar(startPt,tmpAng,distX,tmpPt);
  ads_polar(tmpPt,(tmpAng+(_PI/2.0)),(radius-distY),center);
  return 1;

};
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-7-29 19:29:51 | 显示全部楼层

Re: [文章]:已知一段弧的起点和终点以及其凸度,求其圆心

最初由 godking311 发布
[B]已知一段弧的起点和终点以及其凸度,求其圆心  

int getCenter(ads_point startPoint,ads_point endPoint,double bulge,ads_point& center)
{
  if (bulge==0.0)
  {
    ads_point_set(startPoint,center);
... [/B]


典型的ADS写代码的方法,其实利用AcGe Helper 类的AcGeCircArc2d类,可以非常方便的得到,以后大家在求对象的几何性质的时候,不放多利用下AcGe Helper类

  1. [font=courier]
  2. AcGeCircArc2d(

  3. const AcGePoint2d& startPoint,

  4. const AcGePoint2d& endPoint,

  5. double bulge,

  6. Adesk::Boolean bulgeFlag = Adesk::kTrue);

  7. startPoint Input start point of arc
  8. endPoint Input endpoint of arc
  9. bulge Input bulge distance
  10. bulgeFlag Input how to interpret bulge distance for arc calculation

  11. Constructs an arc with the specified start and endpoints. If a line is drawn
  12. between startPoint and endPoint, then the distance between this line

  13. and the midpoint of the constructed arc is equal to the bulge distance.

  14. The direction of the constructed arc is always counterclockwise.
  15. startPoint must be different than endPoint. This constructor always
  16. constructs a bounded arc and cannot be used to construct a full circle. If
  17. bulgeFlag is Adesk::kTrue, then bulge is interpreted to be the maximum
  18. distance between the arc and the chord between the two input points. If
  19. bulgeFlag is Adesk::kFalse, then bulge is interpreted to be the tangent of
  20. 1/4 the included angle (tan(ang/4)), where ang is the angle of the arc
  21. segment between the two input points.


  22. [/font]
复制代码


所以你上面的代码可以简单的写成:

  1. [font=courier]
  2. AcGeCircArc2d mArc(startPt,endPt,bulge); //利用构造函数得到几何圆弧数学模型
  3. AcGePoint2d cenPt=mArc.center(); //得到圆心。
  4. [/font]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-30 11:33:35 | 显示全部楼层
向你敬礼!请多指教
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-8-2 23:17:44 | 显示全部楼层
//多义线的圆弧插补数据输出
void arxtestccarc(AcDbPolyline *pPline,int num)
{
        double cbulge;
        ads_real len,rad,bu,angle1,L_angle,steplen,symbolK,symbolU,symbolV,deltaX,deltaY,distXY;
        ads_point cpt1,cpt2,centerpt,intpt1,intpt2;//centerpt为圆心坐标,rad为半径,intpt为插补点
        AcGePoint2d basept1,basept2;//点的类型转换
        char cptbuffer[50];

        pPline->getBulgeAt(0,cbulge);
//        acutPrintf ("\nBulge.%f",bulge);
        pPline->getPointAt(num,basept1);
        pPline->getPointAt((num+1),basept2);
//        pPline->close();

        cpt1[X]=basept1.x;
        cpt1[Y]=basept1.y;
        cpt2[X]=basept2.x;
        cpt2[Y]=basept2.y;
        cpt1[Z]=cpt2[Z]=0;
        len=acutDistance(cpt1,cpt2);
        //acutPrintf ("\nlen.%f",len);
        bu=fabs(cbulge);
        //acutPrintf ("\nbu.%f",bu);
        rad=(bu+1/bu)*len/4;
        //acutPrintf ("\nrad.%f",rad);
        angle1=acutAngle(cpt1,cpt2);
        //acutPrintf ("\nangle1.%f",angle1);
        //angle1=acutAngle(pt2,pt1);//试验pt1和pt2的次序影响
        //acutPrintf ("\nangle2.%f",angle1);
        L_angle=angle1+atan(1/(2*cbulge) - cbulge/2);

        //acutPrintf ("\nL_angle.%f",L_angle);
        centerpt[X]=cpt1[X]+rad*cos(L_angle);
        centerpt[Y]=cpt1[Y]+rad*sin(L_angle);
        //acutPrintf ("\ncenter:%f",centerpt[X]);
        //acutPrintf ("\ncenter:%f",centerpt[Y]);

        steplen=2*pow((2*rad*tolerance-tolerance*tolerance),0.5);
        symbolK=steplen/rad;
        symbolU=pow(symbolK,2)/2;
        symbolV=symbolK*pow((1-symbolK*symbolK/4),0.5);
       
        intpt1[X]=cpt1[X]-centerpt[X];//pt1x坐标平移
        intpt1[Y]=cpt1[Y]-centerpt[Y];//pt1y坐标平移
        intpt2[X]=cpt2[X]-centerpt[X];//pt2x坐标平移
        intpt2[Y]=cpt2[Y]-centerpt[Y];//pt2y坐标平移

                if(cbulge>0)//逆圆弧,在这里判断了,那么主程序中就无需判断了,只要分成是否等于零两类即可
                {
                                //distXY=tolerance+1;//设置插补距离起始标志
                        for(distXY=steplen+1;distXY>steplen;)  ////计算下一个点的循环程序,循环条件就是终点判断
                        {
                                deltaX=symbolU*intpt1[X]+symbolV*intpt1[Y];//求增量x
                                deltaY=symbolV*intpt1[X]-symbolU*intpt1[Y];//求增量y
                               
                                intpt1[X]=intpt1[X]-deltaX;
                                intpt1[Y]=intpt1[Y]+deltaY;
                               
                                distXY=acutDistance(intpt2,intpt1);//判断终点的计算
                               
                                //将x坐标平移还原化成字符串
                               
                                //将y坐标平移还原化成字符串
                       
                                                        _ltoa((long)((intpt1[X]+centerpt[X])*39.37),  cptbuffer,10 );//x
                                                        str=cptbuffer;
                                                        str="X"+str;
                                                        writedata(str,path);
                                                        _ltoa((long)((intpt1[Y]+centerpt[Y])*39.37),  cptbuffer,10 );//y
                                                        str=cptbuffer;
                                                        str="Y"+str+"*";
                                                        writedata(str,path);

                        }
                        //写入pt2


                }

                if(cbulge<0)//顺圆弧
                {       
                        //        distXY=tolerance+1;//设置插补距离起始标志
                        for(distXY=steplen+1;distXY>steplen;)  ////计算下一个点的循环程序,循环条件就是终点判断
                        {
                                deltaX=symbolV*intpt1[Y]-symbolU*intpt1[X];//求增量x
                                deltaY=symbolV*intpt1[X]+symbolU*intpt1[Y];//求增量y
                               
                                intpt1[X]=intpt1[X]+deltaX;
                                intpt1[Y]=intpt1[Y]-deltaY;

                                //判断终点的计算
                               
                                distXY=acutDistance(intpt2,intpt1);
                               
                                //将x坐标平移还原化成字符串
               
                                //将y坐标平移还原化成字符串
                       
                                                        _ltoa((long)((intpt1[X]+centerpt[X])*39.37),  cptbuffer,10 );//x
                                                        str=cptbuffer;
                                                        str="X"+str;
                                                        writedata(str,path);
                                                        _ltoa((long)((intpt1[Y]+centerpt[Y])*39.37),  cptbuffer,10 );//y
                                                        str=cptbuffer;
                                                        str="Y"+str+"*";
                                                        writedata(str,path);
                        }
                        //写入pt2
               
                }

        // TODO: Implement the command

}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-10-24 12:43:37 | 显示全部楼层
有一个弧度,怎么计算它的bugle. 我怎么总是算错。555.
不是 tan((pArc->endAngle()-pArc->startAngle())/4)吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 08:00 , Processed in 0.194593 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表