1. ;判断点在多边形的位置:内、外、线上
    2. ;返回值:内:1、外:-1、线上:0
    3. ;;方法1----射线法;
    4. ;;点是否在多边形内
    5. ;;点 P 是否在多边形 PM
    6. ;;If 'p' is in 'pm', return T.
    7. ;;'mx' is a very long distance.
    8. (defun isInorOut (p pm / i p1 p2 tf tf1 tf2 px jp ret)
    9. (setq px (list (+ 1e+100 (car p)) (cadr p))
    10. p1 (last pm)
    11. i -1
    12. )
    13. (while (and (not ret)
    14. (setq p2 (nth (setq i (1+ i)) pm))
    15. )
    16. (if (setq jp (inters px p p1 p2))
    17. (if (equal (car jp) (car p) 0.0001)
    18. (setq ret t)
    19. (setq tf2 (if (> (cadr p1) (cadr p2)) 1 0)
    20. tf (if (= tf1 tf2) tf (not tf))
    21. tf1 tf2
    22. )
    23. )
    24. (setq tf1 nil)
    25. )
    26. (setq p1 p2)
    27. )
    28. (cond
    29. (ret 0) ;线上
    30. (tf 1) ;内
    31. (t -1) ;外
    32. )
    33. )
    34. ;;方法2---角度法
    35. ;;点是否在多边形内
    36. (defun ptinpm (pt lst / i p1 p2 an anl ret)
    37. (setq i -1 p1 (last lst))
    38. (while (and (not ret)
    39. (setq p2 (nth (setq i (1+ i)) lst))
    40. )
    41. (cond
    42. ((equal p2 pt 1e-4) (setq ret t))
    43. (t
    44. (setq an (- (angle pt p1) (angle pt p2)))
    45. (if (equal pi (abs an) 1e-4)
    46. (setq ret t)
    47. (setq anl (cons (rem an PI) anl))
    48. )
    49. )
    50. )
    51. (setq p1 p2)
    52. )
    53. (cond
    54. (ret 0) ;线上;
    55. (t
    56. (if (equal PI (abs (apply '+ anl)) 1e-4)
    57. 1 ;内;
    58. -1 ;外;
    59. )
    60. )
    61. )
    62. )
    63. ;测试
    64. (DEFUN C:tt (/ Curve Pt lst a b c)
    65. (IF (SETQ Curve (CAR (ENTSEL "\n选择一条曲线:")))(progn
    66. (setq lst (MAPCAR (FUNCTION CDR)
    67. (VL-REMOVE-IF (FUNCTION (LAMBDA (x) (/= 10 (CAR x)))) (entget Curve))
    68. )
    69. )
    70. (WHILE (SETQ Pt (GETPOINT "\n点取测试点:"))
    71. (setq pt (list (car pt) (cadr pt))
    72. c 1
    73. )
    74. (setq a (ptinpm Pt lst))
    75. (princ "\nxd-point_inm:") (princ (cond ((= 0 a) "线上")
    76. ((= 1 a) "内")
    77. (t "外")))
    78. (setq a (xd-point_inm Pt lst))
    79. (princ "\nptinpm:") (princ (cond ((= 0 a) "线上")
    80. ((= 1 a) "内")
    81. (t "外")))
    82. )
    83. ))
    84. (PRINC)
    85. )