明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1814|回复: 2

初试技术贴,点和线的关系判断函数编程过程,请指正

[复制链接]
发表于 2012-7-22 23:10:48 | 显示全部楼层 |阅读模式
  1. ;|
  2. 最近编程用到了二维点与线段的关系,思考了好久,一开始用的三角函
  3. 数的方法,达到了效果,但是想用向量试试,搞的自己晕头转向,感觉
  4. 还是没有吃透,下面将编程思路写下来,请大家指正。本人的几何及编程
  5. 水平有限,表达可能不准确,请包涵。|;
  6. ;;;1、点pt(x y 0),线起点pt1(x1 y1 0)终点pt2(x2 y2 0)
  7. ;;;2、我需要得到的点和线都有什么关系呢?罗列如下
  8. ;;;mode1点与线段共线
  9. ;;;mode111点在线段上与线段端点共点
  10. ;;;mode112点在线段上与线段端点不共点
  11. ;;;mode12点在线外靠近起点pt1
  12. ;;;mode13点在线外靠近终点pt2
  13. ;;;mode2点与线段不共线(点在线段所在线上的投影简称per)
  14. ;;;mode211per在线段上与线段端点共点
  15. ;;;mode212per在线段上与线段端点不共点
  16. ;;;mode22per在线外靠近起点pt1
  17. ;;;mode23per在线外靠近终点pt2
  18. ;;;3、子函数的准备
  19. ;;;研读了xxsheng 网友的帖子,此处表示感谢
  20. ;;;地址http://bbs.mjtd.com/forum.php?mod=viewthread&tid=65904
  21. ;;;关于向量准备了如下子函数
  22. ;向量的和
  23. (defun ->+ (->1 ->2 /)
  24.   (mapcar '+ ->1 ->2)
  25. )
  26. ;向量的差
  27. (defun ->- (->1 ->2 /)
  28.   (mapcar '- ->1 ->2)
  29. )
  30. ;向量的叉积(限于二维)
  31. (defun ->* (->1 ->2 /)
  32.   (- (* (car ->1) (cadr ->2)) (* (car ->2) (cadr ->1)))
  33. )
  34. ;向量的模
  35. (defun ->|| (-> / x)
  36.   (sqrt (apply '+(mapcar '(lambda (x)(expt x 2)) ->)))
  37. )
  38. ;;;计算pt到p1 p2的垂足点
  39. ;;;by Gu_xl from http://bbs.mjtd.com/
  40. (defun PerToLine (pt p1 p2 / norm)
  41.   (setq        norm (mapcar '- p2 p1)
  42.         p1   (trans p1 0 norm)
  43.         pt   (trans pt 0 norm)
  44.   )
  45.   (trans (list (car p1) (cadr p1) (caddr pt)) norm 0)
  46. )
  47. ;;;从上面可以看出mode1和mode2最终都要落到点与线段共线情况
  48. ;;;故而准备一个子函数,返回值
  49. ;;;"11"点在线段上与线段端点共点
  50. ;;;"12"点在线段上与线段端点不共点
  51. ;;;"2"点在线外靠近起点pt1
  52. ;;;"3"点在线外靠近终点pt2
  53. ;;;判断点与线段共线时点与线段关系子程序开始
  54. ;;;(setq pt (getpoint) pt1 (getpoint) pt2 (getpoint))
  55. ;;;(ptonline pt pt1 pt2)
  56. (defun ptonline (pt pt1 pt2 / mode)
  57.   (if (or (equal pt pt1 1E-6) (equal pt pt2 1E-6))
  58. ;;;判断点相同
  59.     (setq mode "11")
  60. ;;;为真时返回"11"
  61.     (if (and
  62.           (<= (min (car pt1)(car pt2)) (car pt))
  63.           (>= (max (car pt1)(car pt2)) (car pt))
  64.           (<= (min (cadr pt1)(cadr pt2)) (cadr pt))
  65.           (>= (max (cadr pt1)(cadr pt2)) (cadr pt))
  66.           )
  67. ;;;判断点在线段上
  68.       (setq mode "12")
  69. ;;;为真时返回"12"
  70.       (if (<= (->||(->- pt pt1)) (->||(->- pt pt2)))
  71. ;;;判断点不在线段上且靠近pt1
  72.         (setq mode "2")
  73. ;;;为真时返回"2"
  74.         (setq mode "3")
  75. ;;;为假时返回"3"
  76.         )
  77.       )
  78.   )
  79.   )
  80. ;;;准备工作做完了开始写主函数
  81. ;;;返回值
  82. ;;;"111"点在线段上与线段端点共点
  83. ;;;"112"点在线段上与线段端点不共点
  84. ;;;"12"点在线外靠近起点pt1
  85. ;;;"13"点在线外靠近终点pt2
  86. ;;;"2"点与线段不共线(点在线段所在线上的投影简称per)
  87. ;;;"211"per在线段上与线段端点共点
  88. ;;;"212"per在线段上与线段端点不共点
  89. ;;;"22"per在线外靠近起点pt1
  90. ;;;"23"per在线外靠近终点pt2
  91. ;;;(setq pt (getpoint) pt1 (getpoint) pt2 (getpoint))
  92. ;;;(pt&line pt pt1 pt2)
  93. (defun pt&line(pt pt1 pt2 / mode1 mode pt_per)
  94. ;;;首先要判断点与线段是否共线,共线的条件,向量差乘为0
  95. ;;;然后往下就不用注释了
  96.   (if (equal (->* (->- pt pt1) (->- pt pt2)) 0.0 1E-6)
  97.     (if (= (setq mode1 (ptonline pt pt1 pt2)) "11")
  98.       (setq mode "111")
  99.       (if (= mode1 "12")
  100.         (setq mode "112")
  101.         (if (= mode1 "2")
  102.           (setq mode "12")
  103.           (if (= mode1 "3")
  104.             (setq mode "13")
  105.             )
  106.           )
  107.         )
  108.     )
  109.     (if (= (setq mode1 (ptonline (PerToLine pt pt1 pt2) pt1 pt2)) "11")
  110.       (setq mode "211")
  111.       (if (= mode1 "12")
  112.         (setq mode "212")
  113.         (if (= mode1 "2")
  114.           (setq mode "122")
  115.           (if (= mode1 "3")
  116.             (setq mode "23")
  117.             )
  118.           )
  119.         )
  120.     )   
  121.   )
  122.   )
  123. ;;;谢谢您看完了全部的程序,累到您了,喝杯茶,然后给我指点指点
  124. ;;;帮忙优化一下,或者换个更好的思路
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-10-22 15:49:38 | 显示全部楼层
这程序还没完善的吗?
 楼主| 发表于 2012-10-22 16:13:40 | 显示全部楼层
该函数已完善,谢谢您的关注
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-26 03:20 , Processed in 0.254385 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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