42272846 发表于 2007-3-28 00:51:00

本帖最后由 作者 于 2007-3-28 10:15:19 编辑 <br /><br /> <p>首先是你算法问题,你解析几何功底不够,很多信息不用做辅助线直接凭借解析几何可以运算出来的。可以说,任何几何问题可以用代数问题解决。</p><p>如果没有好的办法的话。但是有个办法一定能够实现。</p><p>1、设立辅助线层</p><p>Public Sub New_layer()<br/>Dim OBJlayer As AcadLayer<br/>Dim layer As AcadLayers<br/>&nbsp;&nbsp;&nbsp; Set layer = ThisDrawing.Layers<br/>&nbsp;&nbsp;&nbsp; Set OBJlayer = ThisDrawing.Layers.add("辅助线层")<br/>&nbsp;&nbsp;&nbsp; OBJlayer.color = 8 '设立层颜色为灰色这种不明显色<br/>&nbsp;&nbsp;&nbsp; OBJlayer.LayerOn = False '默认关闭图层<br/>End Sub</p><p>2、给每个生成的辅助线放入辅助线层。</p><p>每次生成辅助线以后,增加如下代码</p><p>&nbsp;&nbsp;&nbsp; Lineobj.layer = "辅助线层"</p><p>3、开关辅助线层。</p><p>如果计算中要选中辅助线,可以使用代码中先打开辅助线层,使用完毕以后关闭图层,这样,在整个运算以前与以后,辅助线层始终不会显示。</p><p>Public Sub OpenAndCloselayer(OC)<br/>Dim OBJlayer As AcadLayer<br/>&nbsp;&nbsp;&nbsp; For Each OBJlayer In ThisDrawing.Layers<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If OBJlayer.Name = "辅助线层" Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If OC = 1 Then OBJlayer.LayerOn = True<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If OC = 0 Then OBJlayer.LayerOn = False<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Next<br/>End Sub</p>

StartMe 发表于 2007-3-30 23:03:00

<p>呵呵,楼上说得有理。谢谢指正。</p><p>我没有用很多的辅助线,只是最后一步仅用了一个辅助线而已。</p><p>但是由于要不停的搜索,所以最后一步的辅助线总是有闪烁。</p><p>我计算的是与两条线(直线或多段线或弧线)均相切的圆心坐标。</p><p>详见下贴:</p><p>http://bbs.mjtd.com/forum.php?mod=viewthread&tid=58743</p><p>这个问题我还没解决呢,不知有没有高手指点一下可行的途径。</p><p>这里先谢谢了。</p>

雪山飞狐_lzh 发表于 2007-3-31 11:41:00

<p>你是用画法几何方法解决的?</p><p>你可以直接通过计算得到的,虽然复杂一点,但可以试试:)</p>

StartMe 发表于 2007-3-31 20:54:00

<p>我就是单纯靠计算得到的圆心坐标,只是最后算出圆心后做出了这个圆(这就是我说的辅助线),然后利用IntersectWith判断这个圆是否确实与两线都相交了。</p><p>我的计算无误,应该为结果的圆心我已经计算出了(而且过后检查时发现这个圆与两线的Trim命令都可以正常截断),但是最后利用IntersectWith判断这个圆是否与连线相交时却返回交点数为-1,所以正确结果被pase了,结果是得不到符合条件的圆。这就是计算的误差吧。</p><p>不知判断算出的圆是否与连线实际相交有没有其它途径,不用IntersectWith能解决也行。</p><p>我也试过从计算出的圆心向两线做垂线,然后判断其与圆的交点是否与其与线的垂足是同一点,结果还是不是同一点,这是否说明我计算出的圆心坐标有误差,但它都能满足了trim命令了,难道还不行么?</p><p></p>

42272846 发表于 2007-3-31 21:09:00

<p>画法几何方便,过程会慢一些,还有些副作用的。</p><p>我都尽量不用,</p>

StartMe 发表于 2007-3-31 21:24:00

<p>就是画法几何的方法我也没想到该怎么做,能保证这个功能的计算确实无误。</p><p>我用计算的方法就是大部分可以得到正确结果,有些却不行。</p>

42272846 发表于 2007-3-31 21:47:00

本帖最后由 作者 于 2007-3-31 22:04:13 编辑 <br /><br /> <p>你不是求出圆心了吗?不用做辅助线就可以判断是否相切。思路如下:</p><p>求被判断点与直线的距离,以及与圆弧的距离。判断这两个距离是否相差很小就判断通过。</p><p>1、要排除精度上的误差:定义&nbsp;&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp; Dim pi As Double<br/>&nbsp;&nbsp;&nbsp; pi = Atn(1) * 4</p><p>这样不会造成尽量减少精度问题,不会因为你输入错一位pi而出错。</p><p>只要判断距离相对误差为小于10^-10则通过。diouble型函数为16位精度,一般误差在最后两位上,如果多次运算,误差会放大,取10^-10差不多了。这样运算出来,应该满足要求了。</p><p>2、以下是我工程用到的公用函数,里面有求点与直线距离函数。纯数学的。</p><p>今晚忙,没有给你推公式出来,你修改一下就可以用。</p><p>Public Function UPDown(X1, Y1, x2, y2, x3, y3)<br/>'求点(X3,y3)在直线12的上方还是下方.<br/>'直线方程AX+BY+C=0 变为Y=KX+t<br/>Dim A, B, C, x4, y4 As Double<br/>If x2 &lt;&gt; X1 Then</p><p>'两点式转化会斜切式<br/>&nbsp;&nbsp;&nbsp; A = (y2 - Y1) / (x2 - X1)<br/>&nbsp;&nbsp;&nbsp; C = (Y1 * x2 - X1 * y2) / (x2 - X1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;B = -1&nbsp;</p><p>'对称点坐标,你可以运算出点与直线距离了。我没有直接给出。<br/>&nbsp;&nbsp;&nbsp; x4 = ((b ^ 2 - A ^ 2) * x3 - 2 * A * b * y3 - 2 * A * C) / (A ^ 2 + b ^ 2)<br/>&nbsp;&nbsp;&nbsp; y4 = ((A ^ 2 - b ^ 2) * y3 - 2 * A * b * x3 - 2 * b * C) / (A ^ 2 + b ^ 2) '点关于直线的对称点。</p><p>else</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'else 自己写。</p><p>end if</p><p>end sub</p><p>同样,你也可以运算出点与圆弧距离,圆弧可以求出圆心,圆心与点距离公式可以直接求出。</p><p>以下,估计你会可能用到的。</p><p>Private Function ABJD(X1, x2, x3, x4, Y1, y2, y3, y4)&nbsp;<br/>'公用函数,返回两线交点,1,2为一直线,3,4 为一直线<br/>If (y2 - Y1) * (x4 - x3) - (y4 - y3) * (x2 - X1) = 0 Then<br/>ABJD(0) = 0<br/>ABJD(1) = 0<br/>Else<br/>X = (x2 * (y2 - Y1) * (x4 - x3) - x4 * (y4 - y3) * (x2 - X1) + (y4 - y2) * (x4 - x3) * (x2 - X1)) / ((y2 - Y1) * (x4 - x3) - (y4 - y3) * (x2 - X1))<br/>Y = (y2 - Y1) * (X - x2) / (x2 - X1) + y2<br/>ABJD(0) = X<br/>ABJD(1) = Y<br/>End If<br/>End Function</p><p>Public Function Distance(X1, x2, Y1, y2)<br/>'公用函数,求两点距离<br/>Distance = Sqr((X1 - x2) ^ 2 + (Y1 - y2) ^ 2)<br/>End Function</p><p></p>

mccad 发表于 2007-3-31 22:03:00

如果确实需要使用辅助线来简化你的程序,也可以使用与底色一样颜色的线条来画。

StartMe 发表于 2007-4-1 22:49:00

<p>谢谢<strong><font face="Verdana" color="#61b713">42272846</font></strong>的热心帮助。谢谢明总。</p><p>非常感谢。</p>
页: 1 [2]
查看完整版本: 如何隐藏计算过程中生成的辅助线?