乐筑天下

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

[求助]请问在ARX里面怎样判断POLYLINE的走向是顺时针还是逆时针

[复制链接]

3

主题

5

帖子

3

银币

初来乍到

Rank: 1

铜币
17
发表于 2009-6-11 11:38:00 | 显示全部楼层 |阅读模式
求助]请问在ARX里面怎样判断POLYLINE的走向是顺时针还是逆时针
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2009-6-11 11:42:00 | 显示全部楼层
经常看到这种问题:)
可以描述下在什么情况下需要么?
另外可以试下把DbCurve转换成GeCurve去做复杂的拓扑计算
回复

使用道具 举报

3

主题

5

帖子

3

银币

初来乍到

Rank: 1

铜币
17
发表于 2009-6-11 11:47:00 | 显示全部楼层
主要是用于已取得的两条多义线的顶点形成两个LIST后,合并成一个LIST,然后反生成一条多义性,如果原来的两根多义性走向不一样,那知合并LIST会达不到预定目标
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2009-6-11 11:52:00 | 显示全部楼层
置顶贴有一个这样的代码吧,走向不一样有两种方式解决
1/计算,象置顶贴类似的
2/转成Ge曲线,Ge曲线有倒置曲线的方法
另外:如果Cad2010的话DB曲线提供了倒置曲线的方法
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2009-6-12 12:34:00 | 显示全部楼层
下面是一个办法,不过估计楼主没必要去判断POLYLINE的走向是顺时针还是逆时针
  1.     ///
  2.     /// 判断轻型多义性的时钟走向
  3.     /// Version : 2008.11.14
  4.     ///
  5.     /// 轻型多义性
  6.     /// 顺时针返回-1,逆时针返回1
  7.     static public int Clockwise(Polyline pline)
  8.     {
  9.       Polyline pline1 = (Polyline)pline.Clone();
  10.       double bulge0 = pline1.GetBulgeAt(0);
  11.       double area0 = pline1.Area;
  12.       if (bulge0 == 0.0)
  13.       {
  14.         pline1.SetBulgeAt(0, 0.5);
  15.         double area1 = pline1.Area;
  16.         if (area1 > area0)
  17.           return 1;
  18.         else
  19.           return -1;
  20.       }
  21.       else
  22.       {
  23.         pline1.SetBulgeAt(0, 0);
  24.         double area1 = pline1.Area;
  25.         if (bulge0 > 0)
  26.         {
  27.           if (area1 > area0)
  28.             return -1;
  29.           else
  30.             return 1;
  31.         }
  32.         else
  33.         {
  34.           if (area1 > area0)
  35.             return 1;
  36.           else
  37.             return -1;
  38.         }
  39.       }
  40.     }

回复

使用道具 举报

19

主题

154

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
230
发表于 2010-12-30 19:09:00 | 显示全部楼层
使用多段线的1,2 最后一个点三个点创建一个Plane,根据Plane的法向量判断?
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2011-1-2 17:11:00 | 显示全部楼层
学习了。。。
回复

使用道具 举报

8

主题

26

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
58
发表于 2011-2-11 21:53:00 | 显示全部楼层
  1.      _
  2.     Public Sub Test()
  3.         Dim optEntity As New PromptEntityOptions("选择多段线:")
  4.         With optEntity
  5.             .SetRejectMessage("所选对象不是多段线")
  6.             .AddAllowedClass(GetType(Polyline), False)
  7.             .AllowNone = True
  8.         End With
  9.         Dim resEntity As PromptEntityResult = ed.GetEntity(optEntity)
  10.         If resEntity.Status  PromptStatus.OK Then Return
  11.         Dim JingDu As Double = 0.001 '浮点值的比较精度
  12.         Using trans As Transaction = db.TransactionManager.StartTransaction
  13.             Dim ent As Polyline = trans.GetObject(resEntity.ObjectId, OpenMode.ForRead)
  14.             Dim P1 As Point2d = ent.GetPoint2dAt(0)
  15.             Dim P2 As Point2d = ent.GetPoint2dAt(1)
  16.             Dim Ji As Double = P2.X * P1.Y - P2.Y * P1.X
  17.             Dim Message As String
  18.             Select Case Ji
  19.                 Case Is  JingDu
  20.                     Message = "第2点在第1点的顺时针方向"
  21.                 Case Else
  22.                     Message = "此两点连线通过原点"
  23.             End Select
  24.             ed.WriteMessage(Message)
  25.         End Using
  26.     End Sub
回复

使用道具 举报

8

主题

26

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
58
发表于 2011-2-11 22:20:00 | 显示全部楼层

这样比较简练一点
  1. _
  2.     Public Sub Test()
  3.         Dim optEntity As New PromptEntityOptions("选择多段线:")
  4.         With optEntity
  5.             .SetRejectMessage("所选对象不是多段线")
  6.             .AddAllowedClass(GetType(Polyline), False)
  7.             .AllowNone = True
  8.         End With
  9.         Dim resEntity As PromptEntityResult = ed.GetEntity(optEntity)
  10.         If resEntity.Status  PromptStatus.OK Then Return
  11.         Dim JingDu As Double = 0.001 '浮点值的比较精度
  12.         Using trans As Transaction = db.TransactionManager.StartTransaction
  13.             Dim ent As Polyline = trans.GetObject(resEntity.ObjectId, OpenMode.ForRead)
  14.             Dim ji As Vector3d = ent.GetPoint3dAt(1).GetAsVector.CrossProduct(ent.GetPoint3dAt(0).GetAsVector)
  15.             Dim Message As String
  16.             Select Case ji.Z
  17.                 Case Is  JingDu
  18.                     Message = "第2点在第1点的顺时针方向"
  19.                 Case Else
  20.                     Message = "此两点连线通过原点"
  21.             End Select
  22.             ed.WriteMessage(Message)
  23.         End Using
  24.     End Sub
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-15 12:54 , Processed in 0.390196 second(s), 70 queries .

© 2020-2025 乐筑天下

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