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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Проблема с определением центроида

Проблема с определением центроида

Ответ
Поиск в этой теме
Непрочитано 11.04.2022, 13:16 #1
Проблема с определением центроида
Browning Zed
 
Регистрация: 17.01.2014
Сообщений: 97

Всем привет. Возможно, нижеописанная ситуация является багом, возможно - нет, но разобраться с этим я не смог. Суть: пытаюсь определить центр тяжести полилинии (код привожу ниже), в данном случае маркируя центроид точкой. Обычно все работает как нужно, но в некоторых обстоятельствах вычисление ценроида начинает определяться некорректно.
И тут всплывает главное - проблема кроется не в коде, а в файле! То есть, в dwg-файле при обстоятельствах, мною невыясненных, геометрия объекта в части определения центроида, начинает оцениваться некорректно. Я не смог определить, что может влиять на этот процесс. В таком файле центр тяжести полилинии неверно определится не только LISP-кодом, но и самим Автокадом, - это не сложно проверить активировав привязку "геометрический центр". В чем может заключаться проблема? Отмечу, также, что случай не единичный, и регулярно всплывает в моей практике.
Файл прикладываю.

Код:
[Выделить все]
 (defun c:test ( / ss )
    (if
        (setq ss
            (ssget "_+.:E:S:L"
               '(
                    (0 . "LWPOLYLINE")
                    (-4 . "&=")
                    (70 . 1)
                    (-4 . "<NOT")
                    (-4 . "<>")
                    (42 . 0.0)
                    (-4 . "NOT>")
                )
            )
        )
        (entmake (list '(0 . "POINT") (cons 10 (LM:PolyCentroid (ssname ss 0)))))
    )
    (princ)
)

;; Polygon Centroid  -  Lee Mac
;; Returns the WCS Centroid of an LWPolyline Polygon Entity

(defun LM:PolyCentroid ( e / l )
    (foreach x (setq e (entget e))
        (if (= 10 (car x)) (setq l (cons (cdr x) l)))
    )
    (
        (lambda ( a )
            (if (not (equal 0.0 a 1e-8))
                (trans
                    (mapcar '/
                        (apply 'mapcar
                            (cons '+
                                (mapcar
                                    (function
                                        (lambda ( a b )
                                            (
                                                (lambda ( m )
                                                    (mapcar
                                                        (function
                                                            (lambda ( c d ) (* (+ c d) m))
                                                        )
                                                        a b
                                                    )
                                                )
                                                (- (* (car a) (cadr b)) (* (car b) (cadr a)))
                                            )
                                        )
                                    )
                                    l (cons (last l) l)
                                )
                            )
                        )
                        (list a a)
                    )
                    (cdr (assoc 210 e)) 0
                )
            )
        )
        (* 3.0
            (apply '+
                (mapcar
                    (function
                        (lambda ( a b )
                            (- (* (car a) (cadr b)) (* (car b) (cadr a)))
                        )
                    )
                    l (cons (last l) l)
                )
            )
        )
    )
)

Вложения
Тип файла: dwg
DWG 2018
Тест.dwg (41.7 Кб, 9 просмотров)


Последний раз редактировалось Browning Zed, 11.04.2022 в 13:23.
Просмотров: 4245
 
Непрочитано 11.04.2022, 13:35
#2
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


ошибка округления координат - слишком много цифр
trir вне форума  
 
Автор темы   Непрочитано 11.04.2022, 13:57
#3
Browning Zed


 
Регистрация: 17.01.2014
Сообщений: 97


Ок. Выставляю LUPREC = 0, ошибка повторяется. В какую сторону копать?
Browning Zed вне форума  
 
Непрочитано 11.04.2022, 14:12
#4
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


https://ru.wikipedia.org/wiki/%D0%94...B8%D0%BA%D0%B0
или считать от первой точки

Последний раз редактировалось trir, 11.04.2022 в 14:18.
trir вне форума  
 
Автор темы   Непрочитано 11.04.2022, 14:20
#5
Browning Zed


 
Регистрация: 17.01.2014
Сообщений: 97


То есть проблема, при значительном удалении от начала системы координат, становится не решаемой в принципе?
Browning Zed вне форума  
 
Непрочитано 11.04.2022, 14:38
1 | #6
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


у тебя циферки в переменную не умещаются
возьми первую точку за ноль и вычитай её значение из всех остальных, потом прибавь к результату
trir вне форума  
 
Автор темы   Непрочитано 11.04.2022, 14:47
#7
Browning Zed


 
Регистрация: 17.01.2014
Сообщений: 97


Ок, спасибо.
Browning Zed вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Проблема с определением центроида

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с распечаткой растра из автокад - ступенчатость линий и границ mechos AutoCAD 20 22.08.2022 12:47
Проблема с Удлиннением отрезка rtyu AutoCAD 24 24.07.2012 16:28
AutoCAD 2008: Проблема при печати файла с неизвестным форматом листа Fredyk AutoCAD 3 12.07.2012 12:26
Редактор блоков, проблема при двойном клике Klim007 AutoCAD 4 22.11.2011 16:43
Проблема с ксероксом Canon PC860 _Oleg_ Разное 5 26.12.2007 10:18