iCAx开思网

标题: 请问在LISP中如何判断一条直线与一段圆弧或椭圆弧的交点? [打印本页]

作者: SageShen    时间: 2005-11-29 15:00
标题: 请问在LISP中如何判断一条直线与一段圆弧或椭圆弧的交点?
请问在LISP中如何判断一条直线与一段圆弧或椭圆弧的交点?

[ 本帖最后由 SageShen 于 2005-11-29 07:38 编辑 ]
作者: Andyes    时间: 2005-11-29 16:36
info:
https://www.mjtd.com/bbs/dispbbs ... ;ID=8719&page=1

;;
;; Get all nodes of the LWPolyline, Polyline.
;;
(defun GetListOfPline (EntityName / SSE_Pline N newEntityName)
  (setq SSE_Pline (entget EntityName))
  (setq LastList nil)
  (if (= (cdr (assoc 0 SSE_Pline)) "LWPOLYLINE")
      (progn
        (setq LastList (LIST (LIST 0 0)))
        (setq N 0)
        (while (/= (nth N SSE_Pline) nil)
               (if (= (car (nth N SSE_Pline)) 10)
                   (setq LastList (append LastList (list (list (cadr (nth N SSE_Pline)) (caddr (nth N SSE_Pline)) )) ))
               )
               (setq N (+ N 1))
        )
        (setq LastList (cdr LastList))
      )
  )
  (if (= (cdr (ASSOC 0 SSE_Pline)) "POLYLINE")
      (PROGN
        (setq LastList (list (list 0 0)))
        (setq newEntityName (entnext EntityName))
        (while (= (cdr (assoc 0 (entget newEntityName))) "VERTEX")
               (setq LastList (append LastList (list (list (cadr (assoc 10 (entget newEntityName))) (caddr (assoc 10 (entget newEntityName))) ))))
               (setq newEntityName (entnext newEntityName))
        )
        (setq LastList (cdr LastList))
      )
  )
  (setq LastList LastList)
);_defun

;;
;; main function
;;
(defun c:getInsPtOfPl ( / ent_name1 pt_list1 ent_name2 pt_list2 i j pta0 pta1 ins_pt pt_ins_list)
  (setq ent_name1 (car (entsel "\nSelect first entity:")))
  (setq pt_list1 (GetListOfPline ent_name1))
  (setq ent_name2 (car (entsel "\nSecond entity:")))
  (setq pt_list2 (GetListOfPline ent_name2))

  (setq i 1 j 1)
  (setq pta0 (nth 0 pt_list1))
  (while (setq pta1 (nth i pt_list1))
    (setq ptb0 (nth 0 pt_list2))
    (while (setq ptb1 (nth j pt_list2))
      (if (and (setq ins_pt (inters pta0 pta1 ptb0 ptb1 t))
        (not (member ins_pt pt_ins_list))
   )
(progn
   (setq pt_ins_list (append pt_ins_list (list ins_pt)))
)
      );_if
      (setq ptb0 ptb1)
      (setq j (+ j 1))
    );_while
    (setq j 1)
    (setq pta0 pta1)
    (setq i (+ i 1))
  );_while
  pt_ins_list
);_defun




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3