明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 12177|回复: 51

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

  [复制链接]
发表于 2011-11-6 10:59 | 显示全部楼层 |阅读模式
  上一季大挑战中的圆周率吸引了不少人的关注,但是参与者很少。到目前为止,也只有高飞鸟的程序最高效。可能是由于太偏理论了,都是数值计算,而这并不是lisp的强项,所以很多人望而却步。
  这一季的lisp大挑战是图形方面的,图形可是CAD的强项,应该能吸引不少人直接参与吧?但愿这次更火爆。
  好了,唠叨这么久,风该把题目拿出来吧。
  呵呵,本次挑战的题目是光路计算。图片中有两条光线通过透镜形成的折射光路,红色光和绿色光。
  这次要求计算任意折射曲面(一个自定义曲面,图片中是三个曲面难度大了点)的折射光路。曲面是空气和某种玻璃的分界面,假定折射率是1.33吧(这个折射率应该能在程序中设定),求空气中穿过某点(任意点)的光线(任意光线)穿过空气-玻璃分界面后形成的光路,只计算方向。最终输出结果画出光路。冠军将是生成1000条光路速度最快的那位。

  折射率的公式大家都知道吧?n=sinθ/sinφ。θ是光线的入射角,φ是光线的折射角。这个不再普及了,不清楚的就Google一下。
  祝大家好运!

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2020-12-4 08:29 | 显示全部楼层
baitang36 发表于 2020-12-4 08:16
已经够50楼了,gu版应该公布源码了。如果他不公布,你找我私聊,我发给你源码。

好的代码就像美酒一样,多少年过去,仍芬香四溢。等一个月看看顾版有空上来不,不行大侠发我邮箱,tigcat@126.com,先谢谢了。
发表于 2017-8-3 10:32 | 显示全部楼层
Gu_xl 发表于 2011-11-15 09:04
参与的人好像不是太多啊!我先发一个编译好的程序,生成1万条光路不到5秒种!希望有兴趣的积极参与!人气足 ...

G版的东西,确实不一般!
发表于 2020-12-4 08:16 | 显示全部楼层
tigcat 发表于 2020-12-1 21:09
不知道gu版说的话还有效没?现在来帮忙顶一把。

已经够50楼了,gu版应该公布源码了。如果他不公布,你找我私聊,我发给你源码。
 楼主| 发表于 2011-11-6 11:13 | 显示全部楼层
首先声明一点,风不是学光学的,从事的专业和光也没有半点关系。
发表于 2011-11-6 16:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-11-6 17:19 | 显示全部楼层
貌似,我不会.有点难,数学不好.
 楼主| 发表于 2011-11-7 07:23 | 显示全部楼层
提供思路
求入射光与曲面的交点,做曲面在交点处的法线。这样得出入射角,再根据折射定律计算折射角。有了交点和折射角,就能画出折射光线。
发表于 2011-11-7 10:05 | 显示全部楼层
我估计会无疾而终,因为。。。物理的书找不到了
 楼主| 发表于 2011-11-7 15:03 来自手机 | 显示全部楼层
这是几何光学里的,根本不需要太多的物理知识,再说,谷歌百度维基都是很好的学习平台
发表于 2011-11-7 21:52 | 显示全部楼层
本帖最后由 prolee2008 于 2011-11-7 22:00 编辑

写的比较繁琐,效率也不高,大家不要笑话。先画100条,还只是一个反射面的.
  1. (defun c:zheshe(/ po_list n qiexian_list);;__LiXuDong
  2.   (vl-load-com)
  3.   (setvar "OSMODE" 0)
  4.   (setq n 1.33)
  5.   (setq curve_n1 (car (entsel)))
  6.   (setq curve_n1 (vlax-ename->vla-object curve_n1))
  7.   (setq startSpline (vlax-curve-getStartParam curve_n1))
  8.   (setq endSpline (vlax-curve-getEndParam curve_n1))
  9.   (setq po_list '())
  10.   (setq qiexian_list '())
  11.   (setq i 1)
  12.   (repeat 100
  13.     (setq po_curve (vlax-curve-getpointatparam curve_n1 (* i (/ (- endSpline startSpline) 100.))))
  14. ;    (print po_curve)
  15.     (setq po_list (cons  po_curve po_list))
  16.     (setq i (1+ i))
  17.    
  18.     )
  19.     (setq i 1)
  20.     (repeat 100
  21.     (setq po_qiexiang_curve (vlax-curve-getfirstderiv curve_n1 (* i (/ (- endSpline startSpline) 100.))))
  22.     (setq po_qiexiang_curve (mapcar '(lambda(x) (* x 1000)) po_qiexiang_curve))
  23.     (setq po_qiexiang_curve (mapcar '+ (nth (- 100 i) po_list) po_qiexiang_curve))
  24.     (setq qiexian_list (cons  po_qiexiang_curve qiexian_list))
  25.     (setq i (1+ i))
  26.       )
  27. ;(print qiexian_list)
  28.     (setq i 0)
  29.     (setq in_po (getpoint))
  30.     (repeat 100
  31.       (command "line" in_po (nth i po_list) "")
  32.       (setq i (1+ i))
  33.       )
  34.     (setq i 0)
  35.     (repeat 100
  36.       (setq angle1 (jaj in_po (nth i po_list) (nth i qiexian_list)))
  37.       (setq shurejiao (abs (- 90 angle1)))
  38.       (setq chushejiao_sin (/ (sin (* PI (/ shurejiao 180.))) n))
  39.       (setq chushejiao_cos (sqrt (- 1 (* chushejiao_sin chushejiao_sin))))
  40.       (setq chushejiao (getc chushejiao_cos))
  41.       (command "line" (nth i po_list) (nth i qiexian_list) "")
  42.       (setq obj (entlast))
  43.       (command "rotate" obj "" (nth i po_list) "0.5" "")
  44.       (setq obj_duandian(assoc 11 (entget obj)))
  45.       (setq obj_duandian (list (nth 1 obj_duandian) (nth 2 obj_duandian) (nth 3 obj_duandian)))
  46.       (setq angle2 (jaj in_po (nth i po_list) obj_duandian))
  47.       (command "undo" "1" "")
  48.       (if(< angle2 angle1)
  49.         (if(< angle1 90.)
  50.           (command "rotate" obj "" (nth i po_list) (- 270 chushejiao)"")
  51.           (command "rotate" obj "" (nth i po_list) (+ 270 chushejiao)"")
  52.          
  53.           )
  54.         (if(< angle1 90.)
  55.           (command "rotate" obj "" (nth i po_list) (+ 90 chushejiao)"")
  56.           (command "rotate" obj "" (nth i po_list) (- 90 chushejiao)"")
  57.           )
  58.         
  59.         
  60.         )
  61.       (setq i (1+ i))
  62.       
  63.       )
  64.   )
  65.   
  66.   
  67.   
  68.   (defun jaj (pt1 pt2 pt3)
  69. ;摘自modernyoung的博客
  70.   (setq a (distance pt1 pt3)
  71.          b (distance pt1 pt2)
  72.          c (distance pt2 pt3)
  73.   )
  74.   (setq cos_a (/ (- (+ (* b b) (* c c)) (* a a))
  75.    (* b c 2)
  76.    ;;求余弦
  77.        )
  78.   )
  79.   (if (= cos_a 0)
  80.       (setq jad 90)


  81.     (progn (setq jad1 (atan (/ (sqrt (- 1 (* cos_a cos_a))
  82.          ;;转换成正切
  83.           )
  84.           cos_a
  85.        )
  86.         )
  87.     )
  88.     (if (<= jad1 0)
  89.       ;;当值是负值时,转换角度

  90.       (setq jad (* (/ (+ pi jad1) pi)
  91.      180
  92.          )
  93.       )
  94.       (setq jad (* (/ jad1 pi)
  95.      180
  96.          )
  97.       )
  98.     )
  99.     )
  100.   )

  101.   jad
  102. )

  103. (defun GetC (cosc / C)

  104.   (setq C (atan (sqrt (1- (/ 1 (* cosc cosc))))))

  105.   (setq c (* 180.0 (/ C PI)))
  106.   (if(> c 90)
  107.     (setq c (- C 90)))

  108.   C

  109. )


本帖子中包含更多资源

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

x

点评

不错了已经  发表于 2015-7-16 09:16
世界上计算光路的软件有很多,但是很少有在CAD中计算光路的,prolee2008给我们展现了一个神奇的世界,让我们能看到光线是如何追踪的。  发表于 2011-11-8 07:43

评分

参与人数 2明经币 +2 收起 理由
jicqj + 1 很给力!有种美感
cabinsummer + 1 莫非是传说中的高手来了

查看全部评分

发表于 2011-11-7 22:06 | 显示全部楼层
任意曲面。

本帖子中包含更多资源

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

x
 楼主| 发表于 2011-11-7 22:50 | 显示全部楼层
prolee2008 发表于 2011-11-7 21:52
写的比较繁琐,效率也不高,大家不要笑话。先画100条,还只是一个反射面的.


先对prolee2008的程序表示赞赏,不过程序有点小小的瑕疵。在上面的图片中,曲线为折射面,入射点位于左下方,但是程序运行结果是穿过曲线找第二交点折射,这明显与我们的常识不符。希望能加以改进。不过,prolee2008的程序目前暂列挑战榜首位。

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-4-26 10:58 , Processed in 0.222360 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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