| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Геометрия. Принадлежность точки дуге

DwgRuLispLib: Геометрия. Принадлежность точки дуге

Ответ
Поиск в этой теме
Непрочитано 07.12.2007, 18:42 #1
DwgRuLispLib: Геометрия. Принадлежность точки дуге
VVA
 
Инженер LISP
 
Минск
Регистрация: 11.05.2005
Сообщений: 6,990

Код:
[Выделить все]
;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * dwgru-geom-point-on-arc
;;; *
;;; * 07/12/2007 Версия 0001.Редакция Владимир Азарко (VVA)
;;; ************************************************************************
(defun dwgru-geom-point-on-arc (P P1 P2 Pc / Ang Ang1 AngN)
;;; Принадлежность точки дуге (все точки в одной плоскости!!!)
;;; Математическое решение
;;;---------------------------------------------------------
;;;Параметры:
;;; P — проверяемая точка
;;; P1, P2 — конечные точки дуги
;;;Pc — центральная точка дуги
;;;Возвращает t, если точка лежит на дуге
;;;  
 (or (equal P P1 1e-6)
     (equal P P2 1e-6)
     (and (equal (distance P1 Pc) (distance P Pc) 1e-6)
          (progn
           (setq AngN (angle Pc P1)   Ang (- (angle Pc P2) AngN)   Ang1 (- (angle Pc P) AngN))
     (if (or (< (abs Ang) 1e-6) (equal (abs Ang) (* 2 PI) 1e-6)) (setq Ang 0.0))
     (if (or (< (abs Ang1) 1e-6) (equal (abs Ang1) (* 2 PI) 1e-6)) (setq Ang1 0.0))
           (> (+ (if (minusp Ang) (+ Ang (* 2 PI)) Ang) 1e-6) (if (minusp Ang1) (+ Ang1 (* 2 PI)) Ang1))
    )
     )
 )
)
__________________
Как использовать код на Лиспе читаем здесь
Просмотров: 19142
 
Автор темы   Непрочитано 07.12.2007, 18:43
#2
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Пример
Код:
[Выделить все]
(defun C:TEST()
  (and
    (princ "\nВыберите дугу ")
    (setq ss nil ss (ssget "_:S:E" '((0 . "ARC"))))
    (setq arc1 (ssname ss 0))
    (setq Pc (cdr(assoc 10 (entget arc1)))) ;_Центр дуги
    (setq R (cdr(assoc 40 (entget arc1))))  ;_Радиус
    (setq P1 (polar Pc (cdr(assoc 50 (entget arc1))) R)) ;_1-я конечная точка дуги
    (setq P2 (polar Pc (cdr(assoc 51 (entget arc1))) R)) ;_2-я конечная точка дуги
    (setq Pc (trans Pc 0 1))
    (setq P1 (trans P1 0 1))
    (setq P2 (trans P2 0 1))
   (while (setq Pt (getpoint "\nУкажите точку <выход>: "))
     (if (dwgru-geom-point-on-arc Pt P1 P2 Pc)
       (princ " ** на дуге **")
       (princ " ** мимо **")
       )
     )
   )
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 08.12.2007, 06:32
#3
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Редакционные замечания:

1. Лучше именам функциям давать более логичные имена. Например, функция проверяющая какое-то условие, должна включать is.

dwgru-geom-is-point-on-arc

2. Аргументы именовать более понятно:

Код:
[Выделить все]
 
;;; Аргументы:
;;; point — проверяемая точка
;;; arc_start_point - начальная точка дуги,
;;; arc_end_point - конечная точка дуги
;;; arc_center_point - центральная точка дуги
;;; Возвращает t, если точка лежит на дуге, иначе NIL
3. 1e-6 лучше вынести в служебную функцию, которая будет возвращать требуемую точность. Это понадобится тысячи раз, но изменить значение можно будет только в одном месте, не меняя тысячи других функций и программ.

Лучше бы сначала завершить с правилами. Функций можно накидать быстро и много, но потом долго придется их систематизировать.
ShaggyDoc вне форума  
 
Непрочитано 10.12.2007, 12:41
#4
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


С вашего позволения, тоже отмечусь в библиотеке..
Выкладываю свою старенькую программу, только немного адаптировал под ваше оформление. Хочу добавить, что мой код, как и у Владимира, подходит только для 2D. Другими словами, все точки должны лежать на плоскости XY.
Код:
[Выделить все]
(defun dwgru-geom-is-point-on-arc (P P1 P2 P3 fuzz)
 ;; ************************************************************************
 ;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
 ;; 
 ;; * dwgru-geom-is-point-on-arc
 ;; 
 ;; * 07/12/2007 Версия 0001.Редакция Владимир Азарко (VVA)
 ;;
 ;; * 10/12/2007 Версия 0002.Редакция Елпанов Евгений (ElpanovEvgeniy)
 ;;    По мотивам личных библиотек 06.2004
 ;; ************************************************************************
 ;; Принадлежность точки дуге (все точки в одной плоскости!!!)
 ;; Математическое решение
 ;;---------------------------------------------------------
 ;; Аргументы:
 ;; P — проверяемая точка
 ;; P1, P3 — конечные точки дуги порядок не важен
 ;; P2 — любая точка между концами дуги
 ;; fuzz - необходимая точность
 ;; Возвращает T, если точка лежит на дуге, иначе NIL
 ;; ************************************************************************
 (or (equal p p1 fuzz)
     (equal p p3 fuzz)
     (equal (- (angle p2 p3) (angle p1 p2)) (- (angle p p3) (angle p1 p)) fuzz)
 )
)
Елпанов Евгений вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Геометрия. Принадлежность точки дуге

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DwgRuLispLib: Геометрия. Принадлежность точки отрезку VVA Библиотека функций 1 07.12.2007 18:35
DwgRuLispLib: Геометрия. Треугольник VVA Библиотека функций 1 07.12.2007 18:18
Принадлежность точки объекту Тим Боль Программирование 4 19.10.2007 16:59