lanwpbj 发表于 2010-8-26 13:05:00

我的画圆角的方法,请指正

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于在CAD平台上的开发,本人是个新手,前段时间想画一个带圆角的矩形,在网上找了好几天也没找到答案,本论坛中也有不少想求此解的朋友。后来看了张帆的教程,受到启发,终于得解,现分享一下。</p>
<p>&nbsp;&nbsp;&nbsp; 我用的主要的函数是AcDbPolyline,其下有个addVertexAt(unsigned int index,const AcGePoint2d&amp; pt,double bulge = 0.,double startWidth = -1.,double endWidth = -1);</p>
<p>我们向其输入一系列的点,以及点与点之间的凸度,至于后面两个参数,可以不理会它。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 下面我把代码贴出来。说明一下,我是要在一块板四角打四个孔,图纸只给出了孔间距a、 b,以及孔径。板的边尺寸和圆角半径自己看着办,这里不牵涉打孔问题,只要知道孔中心位置即可,设圆角半径设为r。 需要用人工方法算出圆角与直线连接点的坐标,共八个点(从右下角开始按逆时针方向):</p>
<p>AcGePoint2d vertex;</p>
<p>&nbsp;&nbsp;&nbsp; vertex = AcGePoint2d(a/2-r, -b/2); </p>
<p>&nbsp;&nbsp;&nbsp; vertex = AcGePoint2d(a/2, -b/2+r); </p>
<p>&nbsp;&nbsp;&nbsp; vertex = AcGePoint2d(a/2, b/2-r); </p>
<p>&nbsp;&nbsp;&nbsp; vertex = AcGePoint2d(a/2-r, b/2); </p>
<p>&nbsp;&nbsp;&nbsp; vertex = AcGePoint2d(-a/2+r, b/2); </p>
<p>&nbsp;&nbsp;&nbsp; vertex = AcGePoint2d(-a/2, b/2-r); </p>
<p>&nbsp;&nbsp;&nbsp; vertex = AcGePoint2d(-a/2, -b/2+r); </p>
<p>&nbsp;&nbsp;&nbsp; vertex = AcGePoint2d(-a/2+r, -b/2); </p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; AcGePoint2dArray points; </p>
<p>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt;= 7; i++) </p>
<p>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; points.append(vertex); </p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>//生成圆角矩形</p>
<p>&nbsp;&nbsp;&nbsp; AcDbPolyline *pPoly= new AcDbPolyline(8);</p>
<p>&nbsp;&nbsp;&nbsp; pPoly-&gt;addVertexAt(0,points.at(0),0.5);</p>
<p>&nbsp;&nbsp;&nbsp; pPoly-&gt;addVertexAt(1,points.at(1),0);</p>
<p>&nbsp;&nbsp;&nbsp; pPoly-&gt;addVertexAt(2,points.at(2),0.5);</p>
<p>&nbsp;&nbsp;&nbsp; pPoly-&gt;addVertexAt(3,points.at(3),0);</p>
<p>&nbsp;&nbsp;&nbsp; pPoly-&gt;addVertexAt(4,points.at(4),0.5);</p>
<p>&nbsp;&nbsp;&nbsp; pPoly-&gt;addVertexAt(5,points.at(5),0);</p>
<p>&nbsp;&nbsp;&nbsp; pPoly-&gt;addVertexAt(6,points.at(6),0.5);</p>
<p>&nbsp;&nbsp;&nbsp; pPoly-&gt;addVertexAt(7,points.at(7),0);</p>
<p>&nbsp;&nbsp;&nbsp; pPoly-&gt;setClosed(Adesk::kTrue);//将其闭合</p>
<p>&nbsp;&nbsp;&nbsp; AcDbObjectId polyId;</p>
<p>&nbsp;&nbsp;&nbsp; polyId=PostToModelSpace(pPoly);</p>
<p>&nbsp;&nbsp;&nbsp; pPoly-&gt;close();</p>
<p><br/>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 上面的0.5是凸度,90度。我的八个点坐标是按逆时针顺序的,如果顺时针,那么凸度就是负值。&nbsp; </p>
<p>也可以用一个结构体,将points和凸度存在一起,那么生成矩形就可以用一个循环来完成。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 上面所说的是矩形,如果是梯形、三角形等非直角情况,则要计算出角度,而连接点的坐标算法也会复杂得多。如果算出夹角为alfa,那么凸度就应为1-alfa/pi&nbsp;&nbsp;&nbsp; pi指圆周率。</p>
<p align="left">上面是用AcDbPolyline函数,但是AcDb2dPolyline和AcDb3dPolyline都找不到类似的方法。特别是AcDb3dPolyline的构造函数(AcDb::Poly3dType unnamed,AcGePoint3dArray&amp; vertices,Adesk::Boolean closed = Adesk::kFalse);&nbsp; 我想要用这个函数,因为它可以定义三维坐标,但是不知道第一个参数是什么意思,它有三个选项k3dSimplePoly 、k3dQuadSplinePoly、k3dCubicSplinePoly,第一个比较明白,就是最基本的把所有点直接连起来,我在画六角螺母时就用了这个函数,但是后面两个选项就不明白了,哪位高人可以给指点一下。</p>
<p align="left">最好能够用AcDb3dPolyline来生成带圆角的图形。象我现在用AcDbPolyline生成的,如果想表现在三维空间中,还要用诸如移动、旋转等一系列操作,麻烦。</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp; 本人水平有限,代码就是直接实现功能,至于错误判断、指针释放等都不怎么会用,见笑了。</p>
页: [1]
查看完整版本: 我的画圆角的方法,请指正