乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 66|回复: 3

相交方法给出错误的结果

[复制链接]

3

主题

11

帖子

1

银币

初来乍到

Rank: 1

铜币
23
发表于 2008-10-19 17:30:52 | 显示全部楼层 |阅读模式
再次向您问好
我有一个外部参照,它是一个分解的多面网格,因此由三角形面组成。我正在编写代码,用网格中的三角形计算一条线上的高度。我已经写了一个版本,它可以工作,但速度很慢——对于折线上的每个点,它会遍历网格中的每个三角形,直到找到该点所在的三角形,然后对其进行插值。所以我想我可以通过减少要循环的三角形数量来加快速度,通过找出哪些三角形与折线相交,然后我只需要循环这些三角形。问题是我的代码不起作用——它说网格中的每个三角形都与直线相交。
代码如下(这只是用来过滤三角形的位,而不是插值位):
  1. Sub LevelFromTria2()
  2.     Dim objPLine As AcadLWPolyline
  3.     Dim objTria As Acad3DFace
  4.     Dim varCoords As Variant  '
  5.     Dim objBlock As AcadBlock
  6.     Dim lngCount As Long
  7.     Dim objTriaSides As AcadLWPolyline
  8.     Dim varIntPoints As Variant
  9.     Dim dblTriaSidesCoords(0 To 5) As Double
  10.     Dim varPnt As Variant
  11.    
  12.    
  13.     On Error Resume Next '* Do so that if layer exists no error
  14.     ThisDrawing.Layers.Add ("Temp Triangles")
  15.     On Error GoTo 0
  16.     ThisDrawing.Utility.GetEntity objPLine, varPnt, "Select polyline: "
  17.     Set objBlock = ThisDrawing.Blocks("draw tria exploded")
  18.    
  19.     '* Go through all the items in the xref
  20.     For lngCount = 0 To objBlock.Count - 1
  21.    
  22.         '* See if the item is a 3d face
  23.         If objBlock.Item(lngCount).ObjectName = "AcDbFace" Then
  24.             '* If it is get the face element
  25.             Set objTria = objBlock.Item(lngCount)
  26.             '* See if the face intersects with the polyline
  27.             varIntPoints = objTria.IntersectWith(objPLine, acExtendNone)
  28.             
  29.             '* If it does, draw the triangle - TEMP MEASURE TO SEE IF IT IS FINDING THE RIGHT TRIANGLES
  30.             If VarType(varIntPoints)  vbEmpty Then
  31.                 '* Get co-ords of the 3d face
  32.                 varCoords = objTria.Coordinates
  33.                 '* Set up 2d coords for the triangle edge
  34.                 dblTriaSidesCoords(0) = varCoords(0)
  35.                 dblTriaSidesCoords(1) = varCoords(1)
  36.                 dblTriaSidesCoords(2) = varCoords(3)
  37.                 dblTriaSidesCoords(3) = varCoords(4)
  38.                 dblTriaSidesCoords(4) = varCoords(6)
  39.                 dblTriaSidesCoords(5) = varCoords(7)
  40.                 '* Add a LW polyline to show the triangle which intersects with the polyline
  41.                 Set objTriaSides = ThisDrawing.ModelSpace.AddLightWeightPolyline(dblTriaSidesCoords)
  42.                 objTriaSides.Closed = True
  43.                 objTriaSides.Layer = "Temp Triangles"
  44.                 objTriaSides.color = acMagenta
  45.                 objTriaSides.Update
  46.             End If
  47.             
  48.         End If
  49.    
  50.     Next lngCount
  51.                         
  52. End Sub

附件是我正在测试的图纸。我试图得到水平的线是黄线,所以当提示时选择这个。
我想我的intersect方法有问题。除了使用面本身,我还试着用它做了一条LW折线,但是也不行。
对于如何实现上述功能,我们将非常感谢您的任何建议。(或者,如果你有另一个概念来加速它从三角测量到直线上的方式,我也很想听听!)
谢谢
乔恩

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

3

主题

11

帖子

1

银币

初来乍到

Rank: 1

铜币
23
发表于 2008-10-20 02:47:26 | 显示全部楼层
PS:在这个例子中,这条线位于许多三角形的边上,这在我所迎合的情况下可能会发生很多。我不知道这是否抛出了我正在做的测试,但奇怪的是为什么它选择了所有的三角形?
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-10-21 01:17:33 | 显示全部楼层
如果 VarType(varIntPoints)  vbEmpty 不能作为 -1 的计数(无交集)不起作用,则不是 vbempty
回复

使用道具 举报

3

主题

11

帖子

1

银币

初来乍到

Rank: 1

铜币
23
发表于 2008-10-21 03:13:33 | 显示全部楼层
谢谢布莱科。我在Autodesk论坛上找到了类似的答案。我只是在看帮助文件-这是错误的!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-4 00:56 , Processed in 1.251795 second(s), 65 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表