三点如何定圆心
<p>大家帮我解决一个问题,是通过三点(不在一条直线上)来确定圆心。最好能通过图示来说明,而且对于过三点形成的三角形的任意两边作中垂线求交点的方法排除在外。因为考虑的斜率的不存在需要较多的错误处理程序。谢谢大家,在此给大家提供一段程序,如果可以能给我解释一下也可以。</p><p>Dim省去了</p><p>xy=pt1(0)^2+pt1(1)^2</p><p>xyse=xy-pt3(0)^2-pt3(1)^2</p><p>xysm=xy-pt2(0)^2-pt2(1)^2</p><p>xy=(pt1(0)-pt2(0))*(pt1(1)-pt3(1))-(pt1(0)-pt3(0))*(pt1(1)-pt2(1))</p><p>ptcen(0)=(xysm*(pt1(1)-pt3(1))-xyse*(pt1(1)-pt2(1)))/(2*xy)</p><p>ptcen(1)=(xyse*(pt1(0)-pt2(0))-xysm*(pt1(0)-pt3(0)))/(2*xy)</p><p>ptcen(2)=0</p><p></p> <p>测试了一下公式是可行的,原理到网上找了半天,都是用垂线找圆心.</p><p>需要再找资料进行证明<br/>Dim pt1(0 To 2) As Double, pt2(0 To 2) As Double, pt3(0 To 2) As Double, ptcen(0 To 2) As Double<br/>pt1(0) = 10: pt1(1) = 5: pt1(2) = 20<br/>pt2(0) = 110: pt2(1) = 15: pt2(2) = 120<br/>pt3(0) = 15: pt3(1) = -15: pt3(2) = 20<br/>xy = pt1(0) ^ 2 + pt1(1) ^ 2<br/>xyse = xy - pt3(0) ^ 2 - pt3(1) ^ 2<br/>xysm = xy - pt2(0) ^ 2 - pt2(1) ^ 2<br/>xy = (pt1(0) - pt2(0)) * (pt1(1) - pt3(1)) - (pt1(0) - pt3(0)) * (pt1(1) - pt2(1))<br/>ptcen(0) = (xysm * (pt1(1) - pt3(1)) - xyse * (pt1(1) - pt2(1))) / (2 * xy)<br/>ptcen(1) = (xyse * (pt1(0) - pt2(0)) - xysm * (pt1(0) - pt3(0))) / (2 * xy)<br/>ptcen(2) = 0</p><p>Dim objLine As AcadLine<br/>Set objLine = ThisDrawing.ModelSpace.AddLine(pt1, ptcen)<br/>Set objLine = ThisDrawing.ModelSpace.AddLine(pt2, ptcen)<br/>Set objLine = ThisDrawing.ModelSpace.AddLine(pt3, ptcen)</p> <p>这个公式是根据圆心到三点的距离相等导出的.</p><p>设圆点为O(O(0)=0,O(1)=0),三点为P1(P1(0),P1(1)),P2(P2(0),P2(1)),P3(P3(0),P3(1)),所求的圆心为Pc(Pc(0),Pc(1))则根据向量运算:</p><p>|OP1-OPc|=|OP2-OPc|=|OP3-OPc| ......................(1)</p><p>式中OP1代表从圆点指向P1的向量,OP2,OP3,OPc意义相同;</p><p>| | 表示取两向量的差向量的模.</p><p></p><p>向量|OP1-OPc|的差向量的模为:</p><p>|(OP1x-OPcx)i+(OP1y-OPcy)j| ...........................(2)</p><p>其中:</p><p>OP1x表示OP1向量在X轴上的投影向量即(P1(0)-O(0))=P1(0)</p><p>OPcx=(Pc(1)-O(1))=Pc(1)</p><p>其余各项表示相同.</p><p>则由(2)式导出|(P1(0)-Pc(0))*i + (P1(1)-Pc(1))*j|.............(3)</p><p>由(3)式取模得sqrt((P1(0)-Pc(0))^2 +(P1(1)-Pc(1))^2)..........(4)</p><p>由(4)和(1)经同时平方得出:</p><p>(P1(0)-Pc(0))^2 +(P1(1)-Pc(1))^2= _</p><p>(P2(0)-Pc(0))^2 +(P2(1)-Pc(1))^2= _</p><p>(P3(0)-Pc(0))^2 +(P3(1)-Pc(1))^2 ....................(5)</p><p>由(5)式可得三方程(略).</p><p>由其中两方程:</p><p>(P1(0)-Pc(0))^2 +(P1(1)-Pc(1))^2= _</p><p>(P2(0)-Pc(0))^2 +(P2(1)-Pc(1))^2 ..................(方程1)</p><p>(P1(0)-Pc(0))^2 +(P1(1)-Pc(1))^2= _</p><p>(P3(0)-Pc(0))^2 +(P3(1)-Pc(1))^2 ..................(方程2)</p><p>解方程组即可推导得到Pc(0),Pc(1)即上面的公式(略).</p><p>用此推导方法加上点的Z方向的坐标,即可得出三维坐标下的求圆心的公式.不过推导过程更加复杂,举一方程:</p><p>(P1(0)-Pc(0))^2 +(P1(1)-Pc(1))^2 +(P1(2)-Pc(2))^2= _</p><p>(P2(0)-Pc(0))^2 +(P2(1)-Pc(1))^2 +(P2(2)-Pc(2))^2 ...........(方程1)</p><p></p> xing 如果说在AutoCAD中实现三点定圆心,最简单的方法就是通过三点画个圆,圆的圆心就是你需要的位置了。只需要一个命令。 要用VBA处理,必须要用上面的数学公式,用Sendcommand处理三点定圆解决,我更喜欢用数学公式. 我用的是中垂线相交取中心点。这个方法是没有任何问题。很好用。 <p>就是嘛`!用三点画圆不就是简单了</p> 我在考虑三个点是空间点的情况比如(1,0,0),(0,1,0)(1,1,1)三个三维点,如何绘制一个圆,谁有简洁的VBA代码
页:
[1]