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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как построить среднюю линию между непараллельными?

Как построить среднюю линию между непараллельными?

Ответ
Поиск в этой теме
Непрочитано 18.09.2003, 05:42
Как построить среднюю линию между непараллельными?
vigold
 
Сообщений: n/a

Страна, помогите! Каким образом между двумя непараллельными полилиниями для своих шкурных расчётов построить точно посередине между ними залегающую среднюю полилинию? Это две непараллельные обязательно сглаженные полилинии. Таково требование при подсчете запасов полезного ископаемого.
Двумя этими линиями указывается скажем выход пласта полезного ископаемого под наносы. Но подсчет запасов я обязан вести по средней линии между двумя этими границами. И, естественно, этих моментов довольно много, чтобы врукопашную выбирать среднюю точку. Из-за этого возникла эта проблема. Заранее благодарен.
Просмотров: 38096
 
Непрочитано 29.09.2016, 11:25
#41
VVA

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


Вот версия, скачанная мной в 2014. Проверял на 2013
Вложения
Тип файла: zip Rolling_ball.zip (39.9 Кб, 112 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.09.2016, 10:12
#42
Vassa


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


Возможно, подойдет в качестве идеи для lisp'а: использовать сеть соединения (команда П-СОЕД (RULESARF)). После построения сети (рис. 2), строим (с привязкой к середине "поперечных" ребер сети) "среднюю" линию (3). На рис. 4 результат. Плотность сети (и, соответственно, точность построения "средней") задается переменной SURFTAB1.
Миниатюры
Нажмите на изображение для увеличения
Название: П-СОЕД.png
Просмотров: 178
Размер:	43.0 Кб
ID:	177056  
__________________
В действительности все иначе, чем на самом деле.
(Антуан де Сент-Экзюпери)
Vassa вне форума  
 
Непрочитано 06.10.2016, 21:50
#43
fasadel


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


Граждане. Пока не дано определение, что такое средняя линия, обсуждение программной реализации бесполезно! Кто-то делит линии на равные сегменты и соединяет их концы (#42), кто-то катит круг (#37), кто-то вообще параллельными отрезками работает (#29). Дело не в точности того или иного построения. Результат будет получаться разный по геометрической сути.

Мне видится "правильным" вариант катящихся кругов.

Offtop: Интересно тот, кто задавал вопрос, вышел на пенсию или ещё нет?
fasadel вне форума  
 
Непрочитано 07.10.2016, 10:23
#44
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,090


Цитата:
Сообщение от fasadel Посмотреть сообщение
Пока не дано определение, что такое средняя линия, обсуждение программной реализации бесполезно!
С определением-то все просто: средняя линия - это геометрическое место точек, равноудаленных от двух заданных линий. Вопрос в другом - минимально необходимое количество и расположение ключевых точек для построения такой линии. Вариант разбиения исходных линий на равное количество мелких отрезков и поиска середин отрезков, соединяющих их вершины - не всегда адекватен.
Цитата:
Сообщение от fasadel Посмотреть сообщение
Мне видится "правильным" вариант катящихся кругов.
+1
kp+ вне форума  
 
Непрочитано 22.11.2016, 22:25
#45
Vassa


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


Цитата:
Сообщение от kp+ Посмотреть сообщение
Вариант разбиения исходных линий на равное количество мелких отрезков и поиска середин отрезков, соединяющих их вершины - не всегда адекватен.
Проверил на разных конфигурациях "непараллельных". Согласен с Вашим мнением.
Вариант "катящегося круга" дает наилучший из предложенных вариантов результат.
__________________
В действительности все иначе, чем на самом деле.
(Антуан де Сент-Экзюпери)
Vassa вне форума  
 
Непрочитано 23.11.2016, 07:00
#46
trir


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


http://doc.cgal.org/latest/Straight_...n_2/index.html
trir вне форума  
 
Непрочитано 23.11.2016, 11:26
#47
Modis


 
Регистрация: 12.06.2010
Липецк, Москва
Сообщений: 534


Цитата:
Сообщение от Vassa Посмотреть сообщение
Вариант "катящегося круга" дает наилучший из предложенных вариантов результат
Я уже писал - не дает (( Может и лучший, но не верный результат
http://forum.dwg.ru/showpost.php?p=1574882&postcount=36
Modis вне форума  
 
Непрочитано 23.11.2016, 13:13
#48
VVA

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


Цитата:
Сообщение от trir Посмотреть сообщение
http://doc.cgal.org/latest/Straight_...n_2/index.html
Еще ссылка https://neerc.ifmo.ru/wiki/index.php...aight_skeleton
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.11.2016, 17:20
#49
VVA

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


Цитата:
Сообщение от Modis Посмотреть сообщение
Я уже писал - не дает (( Может и лучший, но не верный результат
http://forum.dwg.ru/showpost.php?p=1574882&postcount=36
Версия Rolling Ball из #41 дает лучший результат, чем
Цитата:
Сообщение от Modis Посмотреть сообщение
взял код Ли Мака отсюда и вот такой результат
Только с опциями надо разобраться, а то у меня почти час работала. Правда и линии начертил от балды
Цитата:
Команда: ROLLIN
===========================================================================#
Choose the starting end of the first Polyline Boundary:
Choose the starting end of the second Polyline Boundary:
The total length of 1. border is: 53201.6156
The total length of 2. border is: 73450.952

What is the increment along the boundary to check for ball fit? <0>: Increment: 11.1741
Ball increase factor, 0.1 - 9.0 ....... [0.5/1/2/3/4/5/6/7/8/9] <8>:
Increase factor: 8
Number of Part Angles for ang. > 180° (2-100, 1 = use standard) <1>: 5
Number of Part Angles for angles > 180° : 5
Show side to draw ball/centerline with <M-left-klick>: RIGHT side
---------------------------------------------------------------------------
=> Start time..: 16:16:18
Building ball angle list ... DONE (Time: 0.503 sec.)
To do: 0 of 4870, Center points: 3814
** 7 intersection point(s) could not be corrected.
=> Elapsed time: 54 mins. 45.131 secs.
---------------------------------------------------------------------------
Do you want to remove colinear points from centerline? [Yes/No] <Y>: Y
Removing colinear pts. from list ... DONE, removed: 2906, kept: 908
---------------------------------------------------------------------------
Elapsed Time for tests: 0.316
drawing centerline ... DONE
The total length of Centerline is: 53339.5902
Do you want to GET the Circles? [Yes/No] <N>:
Do you want to GET the Circle radius lines? [Yes/No] <N>:
Миниатюры
Нажмите на изображение для увеличения
Название: rollball.png
Просмотров: 158
Размер:	30.8 Кб
ID:	179601  
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.11.2016, 23:11
#50
Vassa


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


Насколько я понимаю, начиная с #46 подразумевается та или иная конкретная программная реализация ИДЕИ "катящегося круга". Все они, по-видимому, имеют какие то недостатки, в силу чего дают такие, позвольте сказать, неприемлемые результаты. Я примерял ИДЕЮ вручную, приблизительно, но вполне допустимо, на варианте из сообщения #36. Результат, по-моему, визуально вполне приемлем.
Изображения
Тип файла: tif СРЕДНЯЯ.tif (138.5 Кб, 147 просмотров)
__________________
В действительности все иначе, чем на самом деле.
(Антуан де Сент-Экзюпери)
Vassa вне форума  
 
Непрочитано 26.09.2018, 10:31
#51
Shrainer


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


Коллеги, приветствую!
Пытаюсь запустить лисп катящегося круга - не хочет работать с полилинией.
Обе на одной отметке (нулевой).
Выбираю 1 и 2 линию, указываю параметры, задаю направление - и либо ни чего не выдает, либо выдает Internall Error.

AutoCad 2016
Shrainer вне форума  
 
Непрочитано 06.02.2019, 23:44
#52
Kaha251184


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


https://apps.autodesk.com/ACD/ru/Det...ed,desc&query=
"...Настройка 50% была бы полезна, например, для генерации центральной полилинии или средней полилинии между двумя другими полилиниями"-описание (из переводчика).
БЕСПЛАТНО

Последний раз редактировалось Kaha251184, 06.02.2019 в 23:59.
Kaha251184 вне форума  
 
Непрочитано 19.08.2021, 13:48
#53
Browning Zed


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


Апну тему. Код ниже - имхо, самый корректный вариант построения срединной линии из всех мной встреченных. В проге один, "визуальный" недочет - перед тем как средняя линия будет построена на экране на мгновение отобразятся необходимые для построения, промежуточные линии. Может умельцы подправят.
Код:
[Выделить все]
 
;;;************************ centerPline.LSP ***********************;;;
;;;                                                                ;;;
;;;                Centerline between two polyline                 ;;;
;;;                                                                ;;;
;;;                  author: Gian Paolo Cattaneo                   ;;;
;;;                                                                ;;;
;;;                  version: 1.0  -  21.12.2013                   ;;;
;;;                                                                ;;;
;;;****************************************************************;;;


(defun c:CPL ( / *error* Loft_n Loft_p Loft_u Loft_v :e1 :e2
                 e1 e2 p1 p2 D_off EL e1o e2o L1 L2 EL1 E_new
                 *pl* E_join pa pb e_del results rip)

    (defun *error* ( msg )
        (command "_.undo" "_end")
        (if Loft_n (setvar 'loftnormals Loft_n))
        (if Loft_p (setvar 'loftparam Loft_p))
        (if Loft_u (setvar 'surfu Loft_u))
        (if Loft_v (setvar 'surfv Loft_v))
        (if pl_type (setvar 'plinetype pl_type))
        (setvar 'cmdecho cmd)

        (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
            (princ (strcat "\nError: " msg))
        )
        (princ)
    )
    
    (setq cmd (getvar 'cmdecho))
    (setvar 'cmdecho 0)
    (command "_.undo" "_begin")    

    (if (null ETmsg) (check_ET))
    (check_ucs)
    (check_view)
    (check_ver)

    (setq Loft_n (getvar 'loftnormals))
    (setq Loft_p (getvar 'loftparam))
    (setq Loft_u (getvar 'surfu))
    (setq Loft_v (getvar 'surfv))
    (setq pl_type (getvar 'plinetype))

    (setvar 'loftnormals 0)
    (setvar 'loftparam 7)
    (setvar 'surfu 0)
    (setvar 'surfv 0)
    (if (= 0 (getvar 'plinetype)) (setvar 'plinetype 1))

    (if (and
            (setq :e1 (<sel> "\nSelect First Polyline"))
	    (setq p1 (cadr :e1))
	    (setq :e1 (car :e1))
            (not (redraw :e1 3))
            (setq :e2 (<sel> "\nSelect Second Polyline"))
	    (setq p2 (cadr :e2))
	    (setq :e2 (car :e2))	    
        )
        (progn
            (redraw :e1 4)
            (check_elev)
            (check_normal)
            (setq e1 (entmakex (cdr (entget :e1))))
            (setq e2 (entmakex (cdr (entget :e2))))
            (setq D_off (* (Max (MaxDist e1 e2) (MaxDist e2 e1)) 0.53))
	    
            (setq EL (entlast))
            (command "_offset" D_off e1 "_non" p2 "")
            (setq e1o (entlast))	    
            (check_offset)

            (setq EL (entlast))
            (command "_offset" D_off e2 "_non" p1 "")
            (setq e2o (entlast))
            (check_offset)   

            (command "_move" e1o e2o "" "_non" "0,0,0" "_non" (list 0.0 0.0 (* D_off 0.5)))

            (command "_loft" e1 e1o "" "")
            (setq L1 (entlast))
            (command "_loft" e2 e2o "" "")
            (setq L2 (entlast))

            (setq EL (entlast) EL1 EL)

            (command "_intersect" L1 L2 "")

            (mapcar
               '(lambda (x)
                    (if (not (vlax-erased-p x)) (entdel x))
                )
                (list e1o e2o e1 e2 L1 L2)
            )       

            (if (> (sslength (setq E_new (e_next EL "SS"))) 0)
                (progn
                    (if :ET:     
                        (acet-flatn E_new nil)
                        (progn
                            (command "_move" E_new "" "_non" "0,0,0" "_non" "0,0,1e99")
                            (command "_move" E_new "" "_non" "0,0,0" "_non" "0,0,-1e99")
                        )
                    )
                    (setq E_join (e_next EL1 "LS"))

                    (if (= "LINE" (cdr (assoc 0 (entget (car E_join)))))
                        (progn
                            (setq pa (trans (cdr (assoc 10 (entget (car E_join)))) 0 1))
                            (setq pb (trans (cdr (assoc 11 (entget (car E_join)))) 0 1))
                            (command "_pline" "_non" pa "_non" pb "")
                            (setq E_join (subst (entlast) (setq e_del (car E_join)) E_join))
                            (entdel e_del)
                        )
                    )
                    (command "_.join")
                    (apply 'command E_join)
                    (command "")
                    (setq results t)
                )
            )
        )
    )
    (setvar 'loftnormals Loft_n)
    (setvar 'loftparam Loft_p)
    (setvar 'surfu Loft_u)
    (setvar 'surfv Loft_v)
    (setvar 'plinetype pl_type)
    (command "_.undo" "_end")
    (setvar 'cmdecho cmd)
    (prompt "\n*") (prompt "\n*")(prompt "\n*")
    (if results (prompt (strcat "\nCenterline created " (if :ET: "(Polyline)." "(Spline)."))))
    (princ)
)

;****************************************************************************

(defun check_ET ()
    (if (member "acetutil.arx" (arx))
        (progn
            (or acet-flatn (load "FLATTENSUP.LSP"))
            (setq :ET: t)
        )
        (progn
            (setq :ET: nil)
            (alert
                (strcat
                    "Express Tools are not installed."
                    "\nIf there are curves the centerline is drawn with a spline."
                )
            )
	    (setq ETmsg t) 
        )
    )
)

;****************************************************************************

(defun check_ucs ()
    (or
        (and
            (zerop (caddr (getvar 'ucsxdir)))
            (zerop (caddr (getvar 'ucsydir)))
        )
        (progn
            (alert "UCS not normal to the WCS")
            (exit)
        )
    )
)
                           
;****************************************************************************

(defun check_view ()
    (or
        (and
            (zerop (car (getvar 'viewdir)))
            (zerop (cadr (getvar 'viewdir)))
            (> (caddr (getvar 'viewdir)) 0)
        )
        (progn
            (alert "View needs to be in plan (0 0 1)")
            (exit)
        )
    )
)

;****************************************************************************

(defun check_ver ()
    (if (< (atoi (substr (ver) 13)) 2011)
        (progn
            (alert "This routine require AutoCAD 2011 or higher.")
            (exit)
        )
    )
)

;****************************************************************************

(defun <sel> (<msg> / *poly* *esel* *p*)
    (while (not *poly*)
        (setvar "errno" 0)
        (setq *esel* (entsel <msg>))
        (setq *poly* (car *esel*))
        (setq *p* (cadr *esel*))
        (if (= 7 (getvar 'errno))
            (alert "No objects selected")
        )
        (if (= 'ename (type *poly*))
            (cond
                ( (null (wcmatch (cdr (assoc 0 (entget *poly*))) "LWPOLYLINE"))
                  (alert "Invalid selection, the object is not a LWPOLYLINE.")
                  (setq *poly* nil)
                )
                ( (= 1 (logand 1 (cdr (assoc 70 (entget *poly*)))))
                  (alert "Invalid selection, the polyline is not open.")
                  (setq *poly* nil)
                )
            )
        )
    )
    (list *poly* *p*)
)

;****************************************************************************

(defun check_elev ()
    (if
        (not
            (equal
                (cdr (assoc 38 (entget :e1)))
                (cdr (assoc 38 (entget :e2)))
                1e-6
            )
        )
        (progn
            (alert "Polylines have different elevation.")
            (exit)
        )
    )
)

;****************************************************************************

(defun check_normal ()
    (if
        (or
            (not (equal (cdr (assoc 210 (entget :e1))) '(0.0 0.0 1.0) ))
            (not (equal (cdr (assoc 210 (entget :e2))) '(0.0 0.0 1.0) ))
        )
        (progn
            (alert "Polyline is not normal to the WCS.")
            (exit)
        )
    )
)

;****************************************************************************

(defun e_next (entL mode / next)
    (if (= mode "SS") (setq next (ssadd)))
    (if (/= entL (entlast))
        (while (setq entL (entnext entL))
       	    (if (entget entL)
                (cond
                    ( (= mode "LS") (setq next (cons entL next)) )
                    ( (= mode "SS") (setq next (ssadd entL next)) )
                )
            )
        )
    )
    next
)

;****************************************************************************

(defun check_offset ( / o_del)
    (if rip (setq rip (1+ rip)) (setq rip 1))
    (if (> (length (setq o_del (e_next EL "LS"))) 1)
        (progn
            (entdel e1)
            (entdel e2)
            (if (= rip 2) (entdel e1o))
            (mapcar
               '(lambda (x)
                    (if (not (vlax-erased-p x)) (entdel x))
                )
                o_del
            )
            (alert
                (strcat
                    "Modeling failed."
                    "\nTry to split the polylines into more portions."
                )
            )
            (exit)
        )
    )
)

;****************************************************************************

(defun MaxDist (ent1 ent2 / :step De1 :div p_step :D Dmax)
    (setq :step (/ (setq De1 (vlax-curve-getDistAtParam ent1 (vlax-curve-getEndParam ent1))) 500))
    (setq :div :step)
    (setq Dmax 0.00)
    (while (< :div De1)
        (setq p_step (vlax-curve-getPointAtDist ent1 :div))
        (setq :D (distance p_step (vlax-curve-getClosestPointTo ent2 p_step)))
        (if (> :D Dmax) (setq Dmax :D))
        (setq :div (+ :div :step))
    )
    Dmax
)

;****************************************************************************

(vl-load-com)

(prompt "\n*") (prompt "\n*")
(princ "\nCenterline between two polyline - by Gian Paolo Cattaneo")
(princ "\ncenterPline.LSP loaded ............... Type \"CPL\" to run ")
(princ)
Browning Zed вне форума  
 
Непрочитано 10.03.2023, 23:13
#54
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Цитата:
Сообщение от VVA Посмотреть сообщение
Версия Rolling Ball из #41 дает лучший результат
Отказывается работать в 2019:
Цитата:
Command: ROLLIN
===========================================================================#
Choose the starting end of the first Polyline Boundary:
Choose the starting end of the second Polyline Boundary:
The total length of 1. border is: 22891.4711
The total length of 2. border is: 17313.6319
...
-- F:rb-ERROR --
Resetting program changes ...
Cannot invoke (command) from *error* without prior call to (*push-error-using-command*).
Converting (command) calls to (command-s) is recommended.
Цитата:
Сообщение от Browning Zed Посмотреть сообщение
Код ниже - имхо, самый корректный вариант построения срединной линии из всех мной встреченных.
Отказывается для замкнутых. Отказывается для полилиний с разным уровнем. Запустил для длинных полилиний - думает долго, все думает, снял задачу...
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как построить среднюю линию между непараллельными?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как построить следующее тело?... Shtirlitz AutoCAD 15 10.06.2013 13:09
Как из trace сделать обычную линию? Нюра AutoCAD 1 06.09.2004 17:10
Подскажите как построить кривую с помощью команды SPLiNE, к boban Программирование 1 02.11.2003 19:58
Как на LISPе автоматически выбрать линию и точку? Mikhail LISP 4 28.10.2003 10:33