明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: StartMe

如何隐藏计算过程中生成的辅助线?

  [复制链接]
发表于 2007-3-28 00:51:00 | 显示全部楼层
本帖最后由 作者 于 2007-3-28 10:15:19 编辑

首先是你算法问题,你解析几何功底不够,很多信息不用做辅助线直接凭借解析几何可以运算出来的。可以说,任何几何问题可以用代数问题解决。

如果没有好的办法的话。但是有个办法一定能够实现。

1、设立辅助线层

Public Sub New_layer()
Dim OBJlayer As AcadLayer
Dim layer As AcadLayers
    Set layer = ThisDrawing.Layers
    Set OBJlayer = ThisDrawing.Layers.add("辅助线层")
    OBJlayer.color = 8 '设立层颜色为灰色这种不明显色
    OBJlayer.LayerOn = False '默认关闭图层
End Sub

2、给每个生成的辅助线放入辅助线层。

每次生成辅助线以后,增加如下代码

    Lineobj.layer = "辅助线层"

3、开关辅助线层。

如果计算中要选中辅助线,可以使用代码中先打开辅助线层,使用完毕以后关闭图层,这样,在整个运算以前与以后,辅助线层始终不会显示。

Public Sub OpenAndCloselayer(OC)
Dim OBJlayer As AcadLayer
    For Each OBJlayer In ThisDrawing.Layers
        If OBJlayer.Name = "辅助线层" Then
            If OC = 1 Then OBJlayer.LayerOn = True
            If OC = 0 Then OBJlayer.LayerOn = False
        End If
    Next
End Sub

 楼主| 发表于 2007-3-30 23:03:00 | 显示全部楼层

呵呵,楼上说得有理。谢谢指正。

我没有用很多的辅助线,只是最后一步仅用了一个辅助线而已。

但是由于要不停的搜索,所以最后一步的辅助线总是有闪烁。

我计算的是与两条线(直线或多段线或弧线)均相切的圆心坐标。

详见下贴:

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=58743

这个问题我还没解决呢,不知有没有高手指点一下可行的途径。

这里先谢谢了。

发表于 2007-3-31 11:41:00 | 显示全部楼层

你是用画法几何方法解决的?

你可以直接通过计算得到的,虽然复杂一点,但可以试试:)

 楼主| 发表于 2007-3-31 20:54:00 | 显示全部楼层

我就是单纯靠计算得到的圆心坐标,只是最后算出圆心后做出了这个圆(这就是我说的辅助线),然后利用IntersectWith判断这个圆是否确实与两线都相交了。

我的计算无误,应该为结果的圆心我已经计算出了(而且过后检查时发现这个圆与两线的Trim命令都可以正常截断),但是最后利用IntersectWith判断这个圆是否与连线相交时却返回交点数为-1,所以正确结果被pase了,结果是得不到符合条件的圆。这就是计算的误差吧。

不知判断算出的圆是否与连线实际相交有没有其它途径,不用IntersectWith能解决也行。

我也试过从计算出的圆心向两线做垂线,然后判断其与圆的交点是否与其与线的垂足是同一点,结果还是不是同一点,这是否说明我计算出的圆心坐标有误差,但它都能满足了trim命令了,难道还不行么?

发表于 2007-3-31 21:09:00 | 显示全部楼层

画法几何方便,过程会慢一些,还有些副作用的。

我都尽量不用,

 楼主| 发表于 2007-3-31 21:24:00 | 显示全部楼层

就是画法几何的方法我也没想到该怎么做,能保证这个功能的计算确实无误。

我用计算的方法就是大部分可以得到正确结果,有些却不行。

发表于 2007-3-31 21:47:00 | 显示全部楼层
本帖最后由 作者 于 2007-3-31 22:04:13 编辑

你不是求出圆心了吗?不用做辅助线就可以判断是否相切。思路如下:

求被判断点与直线的距离,以及与圆弧的距离。判断这两个距离是否相差很小就判断通过。

1、要排除精度上的误差:定义   

    Dim pi As Double
    pi = Atn(1) * 4

这样不会造成尽量减少精度问题,不会因为你输入错一位pi而出错。

只要判断距离相对误差为小于10^-10则通过。diouble型函数为16位精度,一般误差在最后两位上,如果多次运算,误差会放大,取10^-10差不多了。这样运算出来,应该满足要求了。

2、以下是我工程用到的公用函数,里面有求点与直线距离函数。纯数学的。

今晚忙,没有给你推公式出来,你修改一下就可以用。

Public Function UPDown(X1, Y1, x2, y2, x3, y3)
'求点(X3,y3)在直线12的上方还是下方.
'直线方程AX+BY+C=0 变为Y=KX+t
Dim A, B, C, x4, y4 As Double
If x2 <> X1 Then

'两点式转化会斜切式
    A = (y2 - Y1) / (x2 - X1)
    C = (Y1 * x2 - X1 * y2) / (x2 - X1)
    B = -1 

'对称点坐标,你可以运算出点与直线距离了。我没有直接给出。
    x4 = ((b ^ 2 - A ^ 2) * x3 - 2 * A * b * y3 - 2 * A * C) / (A ^ 2 + b ^ 2)
    y4 = ((A ^ 2 - b ^ 2) * y3 - 2 * A * b * x3 - 2 * b * C) / (A ^ 2 + b ^ 2) '点关于直线的对称点。

else

      'else 自己写。

end if

end sub

同样,你也可以运算出点与圆弧距离,圆弧可以求出圆心,圆心与点距离公式可以直接求出。

以下,估计你会可能用到的。

Private Function ABJD(X1, x2, x3, x4, Y1, y2, y3, y4) 
'公用函数,返回两线交点,1,2为一直线,3,4 为一直线
If (y2 - Y1) * (x4 - x3) - (y4 - y3) * (x2 - X1) = 0 Then
ABJD(0) = 0
ABJD(1) = 0
Else
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))
Y = (y2 - Y1) * (X - x2) / (x2 - X1) + y2
ABJD(0) = X
ABJD(1) = Y
End If
End Function

Public Function Distance(X1, x2, Y1, y2)
'公用函数,求两点距离
Distance = Sqr((X1 - x2) ^ 2 + (Y1 - y2) ^ 2)
End Function

发表于 2007-3-31 22:03:00 | 显示全部楼层
如果确实需要使用辅助线来简化你的程序,也可以使用与底色一样颜色的线条来画。
 楼主| 发表于 2007-4-1 22:49:00 | 显示全部楼层

谢谢42272846的热心帮助。谢谢明总。

非常感谢。

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-22 16:30 , Processed in 0.161585 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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