找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2661|回复: 1

[研讨] 决定PL线偏移方向的正逆时针问题

[复制链接]
发表于 2014-6-16 10:50:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
CAD中规定PL线在Offset时,逆时针时偏移量正值时为放大。那么程序首先需要判断该PL线的方向,网上有一个算法如下:
  1. Public Function GE_WhatPoly(ByVal oPLine As Object) As Integer
  2. '   1   顺时针
  3. '  -1   逆时针
  4. '   0   无法判断
  5.     Dim i As Integer
  6.     Dim intHigh As Integer
  7.     Dim dblArea As Double
  8.     Dim arrPts() As Double
  9.     arrPts = oPLine.Coordinates
  10.     intHigh = UBound(arrPts)
  11.     For i = 0 To intHigh - 2 Step 2
  12.         dblArea = dblArea + (arrPts((i + 2) Mod (intHigh + 1)) - arrPts(i)) * (arrPts((i + 3) Mod (intHigh + 1)) + arrPts(i + 1))
  13.     Next i
  14.     GE_WhatPoly = IIf(dblArea > 0, 1, -1)
  15.     If dblArea = 0 Then GE_WhatPoly = 0
  16. End Function
经过测试大部分时候可以有效判断,但也有个别例外失效了。如附件:
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:示例.zip 
下载次数:12  文件大小:9.1 KB 
下载权限: 不限 以上  [免费赚D豆]


测试代码:
  1. Public Function GE_WhatPoly(ByVal oPLine As Object) As Integer
  2. '   1   顺时针
  3. '  -1   逆时针
  4. '   0   无法判断
  5.     Dim i As Integer
  6.     Dim intHigh As Integer
  7.     Dim dblArea As Double
  8.     Dim arrPts() As Double
  9.     arrPts = oPLine.Coordinates
  10.     intHigh = UBound(arrPts)
  11.     For i = 0 To intHigh - 2 Step 2
  12.         dblArea = dblArea + (arrPts((i + 2) Mod (intHigh + 1)) - arrPts(i)) * (arrPts((i + 3) Mod (intHigh + 1)) + arrPts(i + 1))
  13.     Next i
  14.     GE_WhatPoly = IIf(dblArea > 0, 1, -1)
  15.     If dblArea = 0 Then GE_WhatPoly = 0
  16. End Function

  17. Public Sub a1()
  18.     Dim GetEnt As Object
  19.     Dim picPnt
  20.     ThisDrawing.Utility.GetEntity GetEnt, picPnt, vbCr & _
  21.             "  >>请拾取PL线:"
  22.     If Err.Number = "-2147352567" Then  'ESC or 没选中 or Enter
  23.         ThisDrawing.Utility.Prompt vbCr & _
  24.             "  >>结束!"
  25.         Exit Sub
  26.     Else
  27.         Dim Temp As String
  28.         Temp = IIf(GE_WhatPoly(GetEnt), "顺时针", "逆时针")
  29.         MsgBox Temp
  30.     End If
  31. End Sub

  32. Public Sub a2()         'PL线偏移(放大)300
  33.     Dim GetEnt As Object
  34.     Dim picPnt
  35.     ThisDrawing.Utility.GetEntity GetEnt, picPnt, vbCr & _
  36.             "  >>请拾取PL线:"
  37.     If Err.Number = "-2147352567" Then  'ESC or 没选中 or Enter
  38.         ThisDrawing.Utility.Prompt vbCr & _
  39.             "  >>结束!"
  40.         Exit Sub
  41.     Else
  42.         GetEnt.Offset GE_WhatPoly(GetEnt) * -300
  43.     End If
  44. End Sub
图中两根线实际测试时出错了。请高手来完善一下算法。
我现在用偏移之后的面积比较来区分实际偏移方向。



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2014-12-12 15:16:09 | 显示全部楼层
学习学习!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-29 03:24 , Processed in 0.300419 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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