找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 166|回复: 2
打印 上一主题 下一主题

[求助]请问怎么计算弧线对应的圆心角???

[复制链接]

102

主题

377

帖子

1158

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1158
跳转到指定楼层
1#
发表于 2016-4-27 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

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

x
本帖最后由 361553894 于 2016-4-27 09:57 编辑

怎么获取objType为"arc" 的弧线的圆心角???
目前做法是
Angle = axlDistance(car(seg->startEnd), cadr(seg->startEnd))/axlDistance(car(seg->startEnd), seg->xy)*180.0/3.1415926
但是怎么分辨小于半圆还是大于半圆?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏1 支持!支持! 反对!反对!

117

主题

2352

帖子

1万

积分

EDA365特邀版主

Rank: 6Rank: 6

积分
13799

最佳敬业奖

2#
发表于 2016-4-27 11:03 | 只看该作者
试下这个函数,可以区分优弧
  1. defun( GetARC_Angle (db)
  2. prog((r xy start startX startY endX endY end len pi)
  3.         len = nil
  4.         pi = 3.1415926
  5.         when(db->objType == "arc"
  6.                 r = db->radius
  7.                 xy = db->xy
  8.                 start = nth(0 db->startEnd)
  9.                 end = nth(1 db->startEnd)
  10.        
  11.                 startX = xCoord(start)-xCoord(xy)
  12.                 startY = yCoord(start)-yCoord(xy)
  13.                 endX = xCoord(end)-xCoord(xy)
  14.                 endY = yCoord(end)-yCoord(xy)
  15.                        
  16.                 startR = GetPointRadian(startX startY)
  17.                 endR = GetPointRadian(endX endY)

  18.                 if(db->isClockwise then
  19.                         if(startR>endR then
  20.                                 len = (startR-endR)*r
  21.                         else
  22.                                 len = (2*3.1415926+startR-endR)*r
  23.                         )
  24.                 else
  25.                         if(startR>endR then
  26.                                 len = (2*3.1415926+endR-startR)*r
  27.                         else
  28.                                 len = (endR-startR)*r
  29.                         )
  30.                 )
  31.         )
  32.         return((len*180)/(3.1415926*r))
  33. ))

  34. defun( GetPointRadian (x y)
  35. prog((a pi)
  36.         pi = 3.1415926
  37.         cond(
  38.                 (x==0
  39.                         cond(
  40.                                 (y==0 a=0)
  41.                                 (y>0 a=pi/2.0)
  42.                                 (t a=3.0*pi/2)
  43.                         )
  44.                 )

  45.                 (x>0
  46.                         cond(
  47.                                 (y==0 a=0)
  48.                                 (y>0 a=atan(y/x))
  49.                                 (t a=2.0*pi+atan(y/x))
  50.                         )
  51.                 )

  52.                 (t
  53.                         cond(
  54.                                 (y==0 a=pi)
  55.                                 (y>0 a=pi+atan(y/x))
  56.                                 (t a=pi+atan(y/x))
  57.                         )
  58.                 )
  59.         )
  60.         return(a)
  61. )
  62. )
  63. ;deargds
复制代码



点评

这是我写的获取角度的函数,直线直接获取起点到终点的角度,顺时针弧线获取负的旋转角度,逆时针弧线获取正的旋转角度  详情 回复 发表于 2016-5-14 09:47
谁画出这天地 又画下我和你

102

主题

377

帖子

1158

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1158
3#
 楼主| 发表于 2016-5-14 09:47 | 只看该作者
deargds 发表于 2016-4-27 11:03
试下这个函数,可以区分优弧
  1. procedure( wlGetSegAngle(@optional (seg nil))
  2. prog( (angle angle1 angle2)
  3. unless(seg
  4. axlSetFindFilter(?enabled '("noall" "linesegs" "clinesegs") ?onButtons '("noall" "linesegs" "clinesegs"))
  5. seg = car(axlGetSelSet(axlSingleSelectPoint()))
  6. )
  7. unless(seg return(nil))
  8. when(seg->objType == "line"
  9. angle = wlGetVectorAngle(car(seg->startEnd) cadr(seg->startEnd))
  10. )
  11. when(seg->objType == "arc"
  12. angle1 = wlGetVectorAngle(seg->xy car(seg->startEnd))
  13. angle2 = wlGetVectorAngle(seg->xy cadr(seg->startEnd))
  14. angle = angle2 - angle1
  15. if(seg->isClockwise then
  16. when(angle > 0 angle = angle - 360)
  17. else
  18. when(angle < 0 angle = angle + 360)
  19. )
  20. )
  21. return(angle)
  22. ))

  23. procedure( wlGetVectorAngle(start end)
  24. let( (slope angle pi)
  25. pi = 3.1415926
  26. slope = axlLineSlope(list(start end))
  27. if(slope then
  28. angle = atan(slope) * 180.0 / pi
  29. when(car(end) < car(start)
  30. angle = angle + 180.0
  31. )
  32. when(angle < 0 angle = angle + 360.0)
  33. else
  34. if(cadr(end) > cadr(start) then
  35. angle = 90.0
  36. else
  37. angle = 270.0
  38. )
  39. )
  40. angle
  41. ))
复制代码
这是我写的获取角度的函数,直线直接获取起点到终点的角度,顺时针弧线获取负的旋转角度,逆时针弧线获取正的旋转角度
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-13 08:57 , Processed in 0.060592 second(s), 37 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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