明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2960|回复: 3

[求助]如何判断一个点在圆内?

[复制链接]
发表于 2009-5-29 19:42:00 | 显示全部楼层 |阅读模式

用getpoint获得一个点,如何去判断它是不是在一个圆内?或在一个矩形内?望高手指点?

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2009-5-29 20:02:00 | 显示全部楼层

判断点在矩形内的函数已找到了,可是判断点在圆内的函数找不到,请高手指点,谢谢!

判断点在矩形内的函数:

;;;******************************************************************************
;;; No.51 判断点是否在多边形内(狂刀程序)
;;;xPt是要判断的点坐标(x y z ), Points是多边形顶点列表((x1 y1 z1) (x2 y2 z2)...)
;;;http://zml84.blog.sohu.com/82505948.html
;;;******************************************************************************
;;;测试 1:(ISPTINPM '(2 1) '((0 0)(10 0)(10 10)))
;;;测试2:(ISPTINPM  (getpoint "要判断的点:")   (list (getpoint "第一点:") (getpoint "第二点:") (getpoint "第三点:") (getpoint "第四点:")) )
(defun ISPTINPM (XPT POINTS)
(equal
pi
(abs
(apply
'+
(mapcar
'(lambda (X Y)
(rem (- (angle XPT X) (angle XPT Y)) pi)
)
(reverse (cdr (reverse (cons (last POINTS) POINTS)))
)
POINTS
)
)
)
1e-6
) ;end_equal
)


;;pt_list 为((x y z) (x y z)......(x y z))即围成多边形的表
;;pt 为要判断的点
;;自相交多边形适用,不适用于曲线
;;例:(inorout   (list (getpoint "第一点:") (getpoint "第二点:") (getpoint "第三点:") (getpoint "第四点:")) (getpoint "要判断的点:") )
;;http://www.mjtd.com/Functions/ArticleShow.asp?ArticleID=1025
(defun inorout (pt_list pt / e1 n i j va va_count)
  (setq i  0
 va_count 0
 n  (length pt_list)
 pt_list  (append pt_list (list (car pt_list)))
  )
  (repeat n
    (setq va (- (angle pt (nth i pt_list))
  (angle pt (nth (1+ i) pt_list))
      )
    )
    (cond ((> va pi) (setq va (- va pi)))
   ((< va (* -1 pi)) (setq va (+ va pi)))
    )
    (setq va_count (+ va_count va)
   i    (1+ i)
    )
  )
  (if (< (abs (- (abs va_count) pi)) 0.000001)
    't
    'nil
  )
)

发表于 2009-5-29 20:02:00 | 显示全部楼层

一个巧妙的方法求曲线内部任意一点。

http://www.xdcad.net/forum/showthread.php?s=&postid=3417552#post3417552

 楼主| 发表于 2009-5-29 20:22:00 | 显示全部楼层
ljttjl发表于2009-5-29 20:02:00一个巧妙的方法求曲线内部任意一点。http://www.xdcad.net/forum/showthread.php?s=&postid=3417552#post3417552

谢谢你,很感激,刚才在你所说的那里找到了这个函数,经测式没有什么问题:

;;; ==================================================================
;;; 判断点在曲线内与否。在曲线内,返回"in",在曲线上,返回"on"
;;; 在曲线外,返回"out".
;;例:(th-if-pt-in-curve (getpoint "要判断的点:") (car (entsel)))
(defun th-if-pt-in-curve (pt ent / count mark tmpray)
  (if (equal pt (vlax-curve-getclosestpointto ent pt) 1e-6)
    (setq mark "on")
    (progn
      (setq ent (vlax-ename->vla-object ent)
            tmpray (vlax-ename->vla-object (entmakex (list '(0 . "RAY") '
                                                           (100 . "AcDbEntity")
                                                           '(100 . "AcDbRay")
                                                           (cons 10 pt)
                                                           (cons 11
                                                                 (polar pt
                                                                        (txt-rnd-r 0 pi)
                                                                        1
                                                                 )
                                                           )
                                                     )
                                           )
                   )
            pt (vlax-3d-point pt)
            count 0
      )
      (repeat 60
        (vla-rotate tmpray pt (/ pi 30))
        (if (zerop (rem (length (vlax-invoke ent 'intersectwith tmpray 0)) 6))
          (setq count (1- count))
          (setq count (1+ count))
        )
      )
      (vla-delete tmpray)
      (if (minusp count)
        (setq mark "out")
        (setq mark "in")
      )
    )
  )
  mark
)

;;; ==================================================================
;;; 求随机数(0~1)--by 狂刀
(defun txt-rnd ()                      ; 随机数种子
  (* (rem (getvar "cputicks") 1e3) 1e-3)
)
;;; 求n个a~b随机数列表----by 狂刀
(defun txt-rnd-rlst (a b n / c lst)    ; 随机数表
  (setq c (- b a))
  (repeat n
    (setq lst (cons (+ a (* (txt-rnd) c)) lst))
  )
)
(defun txt-rnd-r (a b)                 ; 单个随机数
  (car (txt-rnd-rlst a b 1))
)

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

本版积分规则

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

GMT+8, 2025-2-24 23:21 , Processed in 0.166004 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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