找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3274|回复: 40

[教学] 两面域平面夹角

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2014-11-17 17:31:34 | 显示全部楼层 |阅读模式

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

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

×
  1. (defun c:tt (/ e1 e2 r1 r2 nomal1 norml2 por z zn)
  2.   (if (and (setq e1 (ssget ":S" '((0 . "region"))))
  3.            (setq e2 (ssget ":S" '((0 . "region"))))
  4.       )
  5.     (progn
  6.       (setq r1            (vlax-ename->vla-object (ssname e1 0))
  7.             r2            (vlax-ename->vla-object (ssname e2 0))
  8.             normal1 (vlax-get r1 'normal)
  9.             normal2 (vlax-get r2 'normal)
  10.             por            '(0.0 0.0 0.0)
  11.             z            (c:cal "nor(normal1,por,normal2)")
  12.             an            (c:cal "ang(por,normal1,normal2,z)")
  13.       )
  14.       (princ an)
  15.     )
  16.   )
  17.   (princ)
  18. )

评分

参与人数 2D豆 +5 贡献 +2 收起 理由
xshrimp + 5 + 1 很给力!经验;技术要点;资料分享奖!
Highflybird + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-11-17 17:50:01 | 显示全部楼层
如果是两个3dface呢?

点评

cal有三点计算normal方法  详情 回复 发表于 2014-11-17 17:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-11-17 17:51:59 来自手机 | 显示全部楼层
Highflybird 发表于 2014-11-17 17:50
如果是两个3dface呢?


cal有三点计算normal方法
3dface有210吧

点评

3dface没有210。  详情 回复 发表于 2014-11-17 17:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-11-17 17:57:50 | 显示全部楼层
csharp 发表于 2014-11-17 17:51
cal有三点计算normal方法
3dface有210吧

3dface没有210。

点评

把ssget过滤加上3dface不行?  详情 回复 发表于 2014-11-17 17:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-11-17 17:59:55 来自手机 | 显示全部楼层
Highflybird 发表于 2014-11-17 17:57
3dface没有210。

把ssget过滤加上3dface不行?

点评

不是,我的意思是想说,如果要求3dface,该如何计算。  详情 回复 发表于 2014-11-17 18:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-11-17 18:06:49 | 显示全部楼层
csharp 发表于 2014-11-17 17:59
把ssget过滤加上3dface不行?

不是,我的意思是想说,如果要求3dface,该如何计算。

点评

用ARX方法就是三点定面,面求NORMAL (setq plane (xdge::constructor "kPlane" p1 p2 p3)) (setq normal (xdge::getproeprtyvalue plane "normal")) 测试: 命令: !p1 (1826.3 2667.95 10.0) 命令: !p  详情 回复 发表于 2014-11-17 19:12
3点求NORMAL  详情 回复 发表于 2014-11-17 19:07
3dFace如果计算 Normal 和绘制的方向有关,这样是 3D 模型中为什么有些面 “反向” 的原因,正常计算这样  详情 回复 发表于 2014-11-17 18:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2014-11-17 18:35:34 | 显示全部楼层
Highflybird 发表于 2014-11-17 18:06
不是,我的意思是想说,如果要求3dface,该如何计算。

3dFace如果计算 Normal 和绘制的方向有关,这也是 3D 模型渲染时 为什么有些面 “反向” 的原因,正常计算这样
  1. (defun _3dface:normal (ent / obj pts p1 p2 p3)
  2.   (setq        obj (vlax-ename->vla-object ent)
  3.         pts (vlax-get obj 'coordinates)
  4.         p1  (list (car pts) (cadr pts) (caddr pts))
  5.         p2  (list (nth 3 pts) (nth 4 pts) (nth 5 pts))
  6.         p3  (list (nth 6 pts) (nth 7 pts) (nth 8 pts))
  7.   )
  8.   (c:cal "nor(p1,p2,p3)")
  9. )

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-17 19:07:54 | 显示全部楼层
Highflybird 发表于 2014-11-17 18:06
不是,我的意思是想说,如果要求3dface,该如何计算。

3点求NORMAL
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-17 19:12:24 | 显示全部楼层
本帖最后由 newer 于 2014-11-17 19:15 编辑
Highflybird 发表于 2014-11-17 18:06
不是,我的意思是想说,如果要求3dface,该如何计算。

用ARX方法就是三点定面,面求NORMAL

(setq plane (xdge::constructor "kPlane" p1 p2 p3))
(setq normal (xdge::getproeprtyvalue plane "normal"))

测试:

命令: !p1
(1826.3 2667.95 10.0)

命令: !p2
(2667.95 828.713 20.0)

命令: !p3
(2289.34 1201.57 30.0)

命令: (setq plane (xdge::constructor "kPlane" p1 p2 p3))
<图元名: ccd4aa0>

命令: (setq normal (xdge::getpropertyvalue plane "normal"))
(0.0577015 0.0318299 0.997826)

API直接的函数求:
命令: (xdrx_points_normal p2 p1 p3)
(0.0577015 0.0318299 0.997826)


点评

1 2 3 变成 3 2 1就是负向量  详情 回复 发表于 2014-11-17 19:17
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-11-17 19:17:46 来自手机 | 显示全部楼层
newer 发表于 2014-11-17 19:12
用ARX方法就是三点定面,面求NORMAL

(setq plane (xdge::constructor "kPlane" p1 p2 p3))

1 2 3 变成 3 2 1就是负向量

点评

构造平面和原点有关。 原点不同,NORMAL不同。  详情 回复 发表于 2014-11-17 19:32
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

发表于 2014-11-17 19:30:37 | 显示全部楼层
弱弱说问一句, CAD2011开始,不是可以拾取三维对象了么?

点评

一直都可以拾取啊!  详情 回复 发表于 2014-11-17 19:32
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2014-11-17 19:32:21 来自手机 | 显示全部楼层
lucas3 发表于 2014-11-17 19:30
弱弱说问一句, CAD2011开始,不是可以拾取三维对象了么?

一直都可以拾取啊!

点评

说错了,我是指三维捕捉  发表于 2014-11-17 19:53
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-17 19:32:54 | 显示全部楼层
csharp 发表于 2014-11-17 19:17
1 2 3 变成 3 2 1就是负向量

构造平面和原点有关。 原点不同,NORMAL不同。

点评

三点的法向是右手定则,拇指指向 Z  详情 回复 发表于 2014-11-17 19:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2014-11-17 19:35:23 来自手机 | 显示全部楼层
newer 发表于 2014-11-17 19:32
构造平面和原点有关。 原点不同,NORMAL不同。

三点的法向是右手定则,拇指指向 Z
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-11-17 20:31:47 | 显示全部楼层
本帖最后由 Highflybird 于 2014-11-17 20:35 编辑

给出一个LISP算法:
  1. ;;;----------------------------------------------------;
  2. ;;;功能: 获取平面的法向矢量                            ;
  3. ;;;输入: P1 P2 P3三点决定的平面                        ;
  4. ;;;输出: 该平面的法线矢量                              ;
  5. ;;;----------------------------------------------------;
  6. (defun PLANE:NORMAL (p1 p2 p3 / v1 v2)
  7.   (setq v1 (mapcar '- p2 p1))
  8.   (setq v2 (mapcar '- p3 p1))
  9.   (list
  10.     (- (* (cadr  v1) (caddr v2)) (* (caddr v1) (cadr  v2)))
  11.     (- (* (caddr v1) (car   v2)) (* (car   v1) (caddr v2)))
  12.     (- (* (car   v1) (cadr  v2)) (* (cadr  v1) (car   v2)))
  13.   )
  14. )

  15. ;;;----------------------------------------------------;
  16. ;;;功能: 获取两个平面的夹角                            ;
  17. ;;;输入: P1 P2 P3三点决定的平面                        ;
  18. ;;;输出: 该平面的的夹角                          ;
  19. ;;;----------------------------------------------------;
  20. (defun PLANE:ANGLE (plane1 plane2 / cosang sinang retang iszero)
  21.   (setq plane1 (apply 'PLANE:NORMAL plane1))
  22.   (setq plane2 (apply 'PLANE:NORMAL plane2))
  23.   (setq isZero (* (distance '(0 0 0) plane1) (distance '(0 0 0) plane2)))
  24.   (if (equal isZero 0 1e-8)
  25.     0
  26.     (setq cosang (/ (apply '+ (mapcar '* plane1 plane2)) isZero)
  27.           sinang (sqrt (* (1+ cosang) (- 1 cosang)))
  28.           retang (atan sinang cosang)
  29.     )
  30.   )
  31. )


用法示例:
  1. (defun c:test()
  2.   (setq sel (ssget '((0 . "3DFACE"))))
  3.   (if (and sel (> (sslength sel) 1))
  4.     (progn
  5.       (setq en1 (ssname sel 0))
  6.       (setq en2 (ssname sel 1))
  7.       (setq d1  (entget en1))
  8.       (setq d2  (entget en2))
  9.       (setq plane1 (mapcar 'assoc '(10 11 12) (list d1 d1 d1)))
  10.       (setq plane2 (mapcar 'assoc '(10 11 12) (list d2 d2 d2)))
  11.       (setq plane1 (mapcar 'cdr plane1))
  12.       (setq plane2 (mapcar 'cdr plane2))
  13.       (setq ang (plane:angle plane1 plane2))
  14.       (princ "\n两平面的夹角是:")
  15.       (princ ang)
  16.     )
  17.   )
  18.   (princ)
  19. )
法向矢量跟位置没关系,只是取决平面三点的走向。
这个题实际是求两个法向矢量的夹角。


点评

这些计算把cal看懂了就不需要到处找  详情 回复 发表于 2014-11-17 20:45
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 18:48 , Processed in 0.528910 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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