明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4624|回复: 10

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

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

经常看到这种问题:)

可以描述下在什么情况下需要么?

另外可以试下把DbCurve转换成GeCurve去做复杂的拓扑计算

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

置顶贴有一个这样的代码吧,走向不一样有两种方式解决

1/计算,象置顶贴类似的

2/转成Ge曲线,Ge曲线有倒置曲线的方法

另外:如果Cad2010的话DB曲线提供了倒置曲线的方法

发表于 2009-6-12 12:34:00 | 显示全部楼层
下面是一个办法,不过估计楼主没必要去判断POLYLINE的走向是顺时针还是逆时针
  1.     /// <summary>
  2.     /// 判断轻型多义性的时钟走向
  3.     /// Version : 2008.11.14
  4.     /// </summary>
  5.     /// <param name="pline">轻型多义性</param>
  6.     /// <returns>顺时针返回-1,逆时针返回1</returns>
  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.     }

发表于 2010-12-30 19:09:35 | 显示全部楼层
使用多段线的1,2 最后一个点三个点创建一个Plane,根据Plane的法向量判断?
发表于 2011-1-2 17:11:38 | 显示全部楼层
学习了。。。
发表于 2011-2-11 21:53:23 | 显示全部楼层
  1.     <CommandMethod("test")> _
  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 Is > JingDu
  22.                     Message = "第2点在第1点的顺时针方向"
  23.                 Case Else
  24.                     Message = "此两点连线通过原点"
  25.             End Select
  26.             ed.WriteMessage(Message)
  27.         End Using
  28.     End Sub
发表于 2011-2-11 22:20:34 | 显示全部楼层
本帖最后由 ywlm 于 2011-2-11 22:21 编辑

这样比较简练一点
  1. <CommandMethod("test")> _
  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 Is > JingDu
  20.                     Message = "第2点在第1点的顺时针方向"
  21.                 Case Else
  22.                     Message = "此两点连线通过原点"
  23.             End Select
  24.             ed.WriteMessage(Message)
  25.         End Using
  26.     End Sub

评分

参与人数 1明经币 +2 收起 理由
雪山飞狐_lzh + 2

查看全部评分

发表于 2011-2-11 22:48:41 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 22:50 , Processed in 0.192526 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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