明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: cabinsummer

[【风之影】] [风之影][Lisp大挑战第二季]光路计算

  [复制链接]
发表于 2011-11-15 09:04:29 | 显示全部楼层
本帖最后由 Gu_xl 于 2011-11-24 16:28 编辑

参与的人好像不是太多啊!我先发一个编译好的程序,生成1万条光路不到5秒种!希望有兴趣的积极参与!人气足够多时再放源码!请楼主测试下程序是否符合题意!
2011.11.24更新 加了反射线效果,并优化了代码,速度更快,生成1万条反射光线和1万条折射光线不到2秒!

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
cabinsummer + 1 赞一个!

查看全部评分

 楼主| 发表于 2011-11-15 18:42:19 | 显示全部楼层
Gu_xl 发表于 2011-11-15 09:04
参与的人好像不是太多啊!我先发一个编译好的程序,生成1万条光路不到5秒种!希望有兴趣的积极参与!人气足 ...

感谢G版的大力支持。程序的效果和速度令人叹为观止。直线圆弧样条线作为分界面都没有问题,即使光线与曲线的交点不止一处时,折射点也会自动找到最近点。不过有点小小的瑕疵。见图片:
用多义线做折射面(图中紫色圆弧组成的一个整体透镜)时,折射光线的方向反了。一开始我还以为G版连反射都做出了,后来一量角度,发现不是反射线。不过,除了对多义线有点不足,其它部分十分完美。期待公布源码。
如果G版有兴趣,可以挑战一个稍微复杂一点得光线追踪,就是给定光线的长度,无论经过多少次的折射,总长度不变,折射面也不一定就是一个了,每个折射面的折射率也不一定是一样了。
再次感谢G版支持。

本帖子中包含更多资源

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

x

点评

21楼程序已更新,修正了bug!请再测试!期待更多人参与,要不然也没啥意思!源码在50楼后放吧!  发表于 2011-11-15 23:00
发表于 2011-11-20 21:26:54 | 显示全部楼层
为了源码,顶起
 楼主| 发表于 2011-11-20 21:48:09 | 显示全部楼层
trjrtj 发表于 2011-11-20 21:26
为了源码,顶起

再多找一些人,一起顶
发表于 2011-11-20 22:44:03 | 显示全部楼层
再顶一次算否?
 楼主| 发表于 2011-11-21 07:07:03 | 显示全部楼层
trjrtj 发表于 2011-11-20 22:44
再顶一次算否?

当然算。盖满50楼,gu版共享源码。所以要号召大家一起顶
发表于 2011-11-21 08:02:27 | 显示全部楼层
cabinsummer 发表于 2011-11-21 07:07
当然算。盖满50楼,gu版共享源码。所以要号召大家一起顶

反对没有实质内容的顶帖
 楼主| 发表于 2011-11-21 19:47:23 | 显示全部楼层
x_s_s_1 发表于 2011-11-21 08:02
反对没有实质内容的顶帖

大侠可以尝试一下挑战,看大侠的程序确实很精彩
发表于 2011-11-23 10:39:49 | 显示全部楼层
本帖最后由 qjchen 于 2011-11-24 17:20 编辑

用矢量计算编了一下,本来希望是空间可用的,不过其中有一个矢量绕轴旋转会麻烦些,就只是采用了绕z轴旋转的方法。
没有仔细测试和gu版程序的速度差别,可能用了矢量计算会慢些。没有仔细测试vla-addLine和entmake的差别,10000根都似乎都不太慢。顺手就编了一下反射的,这个比较简单。
由于vla-intersecthwith有精度问题,在处理复杂的spline的时候会有些小问题(刚刚测试了gu版的,也似乎有这个问题),主要是应该有2个交点的被判断为只有一个交点。

  1. ;;;;vec plus
  2. (defun q:vec:+(v1 v2)
  3.   (mapcar '+ v1 v2)
  4. )
  5. ;;;;vec substract
  6. (defun q:vec:-(v1 v2)
  7.   (mapcar '- v1 v2)
  8. )
  9. ;;;;vec plus constant
  10. (defun q:vec:*c(v a)
  11.   (mapcar '(lambda(x) (* x a)) v)
  12. )
  13. ;;;;vec dot product
  14. (defun q:vec:dot*(v1 v2)
  15.   (apply '+ (mapcar '* v1 v2))
  16. )

  17. ;;;;Normalize a vec
  18. (defun q:vec:Norm(v / l) (if (not (zerop (setq l (distance '(0 0 0) v)))) (mapcar '(lambda(x) (/ x l)) v)))

  19. ;;;;rotate a vec along z axis
  20. (defun q:vec:rot90z(v) (list (- (cadr v))(car v)(caddr v)))

  21. ;;http://en.wikipedia.org/wiki/Snell%27s_law,注意,其中第二条公式网页是错误的
  22. ;;n1 是第一个介质; n2是第二个介质
  23. (defun q:refreact(l n n1 n2 / costheta1 costheta2 n12 vrefract)
  24.   (setq costheta1 (q:vec:dot* n (q:vec:*c l -1)) n12 (/ n1 n2))
  25.   (setq costheta2 (sqrt (- 1 (* (expt n12 2) (- 1 (expt costheta1 2))))))
  26.   (if (> costheta1 0)
  27.   (setq vrefract (q:vec:+ (q:vec:*c l n12)  (q:vec:*c n (- (* n12 costheta1) costheta2))))
  28.   (setq vrefract (q:vec:+ (q:vec:*c l n12)  (q:vec:*c n (- costheta2 (* -1 n12 costheta1) ))))
  29.   )
  30.   (setq vreflect (q:vec:+ l (q:vec:*c n (* 2 costheta1))))
  31.   
  32.   (list vrefract vreflect)
  33. )

  34. ;; 曲线上取点
  35. (defun q:curvedivide(curve divn / dpar endpar i res startpar)
  36. (setq startPar (vlax-curve-getStartParam curve))
  37. (setq endPar (vlax-curve-getEndParam curve))
  38. (setq i startPar dpar (/ (- endPar startPar) divn))
  39. (repeat divn (setq res (cons (vlax-curve-getPointAtParam curve i) res))(setq i (+ i dpar)))
  40. res
  41. )

  42. (defun q:entmake:line (pt1 pt2 color)
  43.   (entmake (list (cons 0 "LINE") ;***
  44.                  (cons 6 "BYLAYER") (cons 10 pt1) ;***
  45.                  (cons 11 pt2) ;***
  46.                  (cons 39 0.0) (cons 62 color) (cons 210 (list 0.0 0.0 1.0))
  47.            )
  48.   )
  49. )

  50. ;;计算两点与curve的交点,非常遗憾的是,IntersectWith存在着计算误差,在高精度时会有问题
  51. (defun q:ent:2pintersect(p1 p2 curve / tempLine pub)
  52. (setq tempLine (vla-addline mSpace (vlax-3d-point p1) (vlax-3d-point p2)))
  53. (setq pub (vlax-invoke tempLine 'IntersectWith curve acExtendOtherEntity))
  54. (vla-delete tempLine)
  55. pub
  56. )

  57. ;;;;光线折射和反射的写法
  58. (defun c:test( / a b c curve d f tan temp vec1 vec2 x x1)
  59.   ;;Vla的写法,速度也比较快,没有仔细测试和entmake的速度
  60.   (setq mSpace (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
  61.   (if @_d (if (not (setq d @_d @_d (getreal (strcat "\n折射率:<" (rtos @_d 2 2) ">:"))))(setq @_d d)) (setq @_d (getreal "\n折射率:")))
  62.   (if @_f (if (not (setq f @_f @_f (getint (strcat "\n根数:<" (rtos @_f 2 0) ">:"))))(setq @_f f)) (setq @_f (getint "\n根数:")))
  63.   (setq a (car (entsel "\n折射曲线:")))
  64.   (setq curve (vlax-ename->vla-object a))
  65.   (setq b (q:curvedivide a f))
  66.   (setq c (getpoint "\n 选择基准点:"))
  67.   (setq dis (* 0.1 (distance c (car b))))
  68.   (foreach x b
  69.     (if (= (length (setq temp (q:ent:2pintersect x c curve))) 3)
  70.       ;;;这句话是迫不得已写的,因为Intersectwith有误差问题,不过即使这样写,在spline有时候也还会出问题
  71.       (if (< (distance temp x) 1e-5)
  72.         (progn
  73.          ;(vla-addline mSpace (vlax-3D-point x) (vlax-3D-point c))
  74.          (q:entmake:line x c 1)
  75.          (setq tan (q:vec:Norm (q:vec:rot90z (vlax-curve-getFirstDeriv a  (vlax-curve-getParamAtPoint a x))) ))
  76.          (setq vec1 (q:vec:Norm (q:vec:- x c)))
  77.          (setq vec2 (q:vec:*c (car (q:refreact vec1 tan 1 d)) dis))
  78.          (setq vec3 (q:vec:*c (cadr (q:refreact vec1 tan 1 d)) dis))
  79.          (setq x2 (q:vec:+ x vec2) x3 (q:vec:+ x vec3))
  80.          ;(vla-addline mSpace (vlax-3D-point x) (vlax-3D-point x1))
  81.          (q:entmake:line x x2 2)
  82.          (q:entmake:line x x3 5)
  83.          )
  84.       )
  85.     )
  86.   )
  87. )

  88. (princ "\n By qjchen@gmail.com, 光路计算,命令test")
  89. (princ)

本帖子中包含更多资源

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

x

点评

vla-addLine会比entmake慢一点,你的程序似乎对圆弧有点问题!对于交点的判断我同样采用的是vla-intersecthwith函数,没有找到其他的好办法!不同的是我是使用trans函数来计算反射和折射线的!21楼我加上了反射线!  发表于 2011-11-24 16:12

评分

参与人数 2明经币 +2 收起 理由
Gu_xl + 1 赞一个!
cabinsummer + 1

查看全部评分

发表于 2011-11-23 11:18:06 | 显示全部楼层
为了G版的源码,顶啊!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 08:36 , Processed in 0.171927 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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