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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как апроксимировать дугу отрезками? (геометрия)

Как апроксимировать дугу отрезками? (геометрия)

Ответ
Поиск в этой теме
Непрочитано 22.03.2014, 22:15 #1
Как апроксимировать дугу отрезками? (геометрия)
iskatel111
 
Регистрация: 13.06.2012
Сообщений: 98

Пол дня убил, чтоб вывести формулу центра дуги из координат начала/конца и bulge.

Получилось вот такое:

X_centr = (y1-y2-b^2*y1+b^2*y2+2*b*x1+2*b*x2)/4*b
y_centr = (x2-x1+b^2*x1-b^2*x2+2*b*y1+2*b*y2)/4*b

(сам офигел, думал будет проще... но работает)

x1,y1 координаты начальной точки
x2,y2- конечной
b бульджа ,знак учитывается

Дальше думаю преобразовать все в полярные координаты и вычислять точки...


Может есть проще алгоритмы для апроксимации?

Единственное что напрягает - изобретаю велосипед, ибо есть в PLTOOLS.
Но если в лиспе и могу чтото понять, (хотя он какойто наоборот от обычных языков ) то с vla, на котором сделан PLTOOLS, все хуже, его исходников я не нашел

ЗЫ. на вопрос: чем не устраивают сами PLTOOLS:
задача сделать программу, где автокад только средство отображения результата...

Последний раз редактировалось iskatel111, 22.03.2014 в 22:23.
Просмотров: 4501
 
Непрочитано 22.03.2014, 22:25
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Исходники vla = практически исходники VBA
P.S. Если касаться AutoCAD, то в руки vlax-curve-* функции, там все есть.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.03.2014, 23:14
#3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Здесь в двух частях вся геометрия а картинках и формулах без vla
http://www.afralisp.net/archive/lisp/Bulges1.htm
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.03.2014, 23:34
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


я бы тоже офигел если б апроксимировал дугу окружностями... Вообще тут все довольно просто: имеем центр дуги, ее радиус, начальный и конечные углы, разбиваем дугу на n участков, получаем приращение угла на n точек, находим точки и рисуем полилинию... усе
gomer вне форума  
 
Автор темы   Непрочитано 23.03.2014, 00:02
#5
iskatel111


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Исходники vla
так я ж и пишу, что не нашел их... Было бы проще

Цитата:
Сообщение от gomer Посмотреть сообщение
Вообще тут все довольно просто: имеем центр дуги, ее радиус, начальный и конечные углы, разбиваем дугу на n участков, получаем приращение угла на n точек, находим точки и рисуем полилинию
Да, это конечно очень просто... См первый пост - там только формулы центра дуги, совсем просто... Радиус фиг с ним, легко вычисляется... А вот углы... Тут зачемто придумали квадранты, и разное поведение в них тангенса...

ЗЫ. а в школе учили, что все так легко: проводим перпендикуляр, ищем пересечение...
ЗЫЫ. на вышке - глобальная тригонометрия... горы синус_косинусов
ЗЫЫЫ. а в координатах то и не учили
iskatel111 вне форума  
 
Непрочитано 23.03.2014, 00:42
#6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от iskatel111 Посмотреть сообщение
См первый пост - там только формулы центра дуги, совсем просто...
Я так понимаю AutoCAD DXF Reference даже не открывалось?
gomer вне форума  
 
Автор темы   Непрочитано 23.03.2014, 12:54
#7
iskatel111


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


Извиняюсь, неточно выразился - имеется ввиду дуговой сегмент полилинии
iskatel111 вне форума  
 
Непрочитано 23.03.2014, 13:19
#8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от iskatel111 Посмотреть сообщение
Извиняюсь, неточно выразился - имеется ввиду дуговой сегмент полилинии
Тогда еще проще, находите точки по параметру, делаете bulge = 0, добавляете вершины
gomer вне форума  
 
Непрочитано 25.03.2014, 09:49
#9
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Посмотри здесь http://elpanov.com/index.php?id=34
__________________
Никогда не спорьте с дураками - они опустят Вас до своего уровня и победят за счет опыта
CB вне форума  
 
Непрочитано 25.03.2014, 15:36
#10
DimaVP


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


Если без Vla-, может тогда просто черчением? построить отрезки от центра до начала и конца искомой дуги, найти угол между ними, далее полярный массив одного из отрезков. По конечным точкам получившихся отрезков строишь дуги (или полилинии) и удаляешь все, что тебе не надо.
DimaVP вне форума  
 
Непрочитано 25.03.2014, 17:17
#11
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Радиус дугового сегмента = (/ (длина хорды - дистанция между текущим dxf10, в котором dxf42 не 0 и следующим) 2.0 (sin (* 2 (atan (значение dxf42)))))
ciril вне форума  
 
Автор темы   Непрочитано 25.03.2014, 21:18
#12
iskatel111


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


Цитата:
Сообщение от ciril Посмотреть сообщение
Радиус дугового сегмента = (/ (длина хорды - дистанция между текущим dxf10, в котором dxf42 не 0 и следующим) 2.0 (sin (* 2 (atan (значение dxf42)))))
А Вы, батенька, шутник...

dxf10 - координата Х, дистанция между иксами вещь оч полезная в данном случае



А вообще, мож кому пригодится:

радиус = (sqrt( (x2-x1)^2 + (y2-y1)^2)) * (b^2+1)) /4b

это если вспомнить что sin (2* atan (b)) = 2b/(b^2 + 1)
iskatel111 вне форума  
 
Непрочитано 26.03.2014, 10:30
#13
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


10й dxf код - это вообще-то координата вершины А продемонстрируйте программу, которая будет вычислять радиусы по вашей формуле и выводить их, ну например, в командную строку, по моей формуле - вот:
Код:
[Выделить все]
 (defun c:extrad  (/ x00 x01 x02)
  (while (not (and (setq x00 (car (entsel "\nВыберите полилинию...")))
                   (eq "LWPOLYLINE" (cdr (assoc 0 (setq x01 (entget x00)))))))
    (princ "\nПолилиния не выбрана..."))
  (setq x00 0)
  (repeat (cdr (assoc 90 x01))
    (if (zerop (cdr (setq x02 (assoc 42 x01))))
      (setq x01 (cdr (member x02 x01)))
      (princ
        (strcat "\nR"
                (itoa (setq x00 (1+ x00)))
                " = "
                (rtos (/ (distance (cdr (assoc 10 x01)) (cdr (assoc 10 (setq x01 (cdr (member x02 x01))))))
                         (sin (* 2.0 (atan (abs (cdr x02)))))
                         2.0)
                      2
                      3)))))
  (princ))
собственно вычисление радиуса:
Код:
[Выделить все]
 (/ (distance (cdr (assoc 10 x01)) (cdr (assoc 10 (setq x01 (cdr (member x02 x01))))))
                         (sin (* 2.0 (atan (abs (cdr x02)))))
                         2.0)
----- добавлено через ~3 ч. -----
Вот код, который аппроксимирует без vla-
Код:
[Выделить все]
 (defun c:аппра  (/ x00 x01 x02 x03 x04 x05 x06 x07 x08)
  (while (not (and (setq x00 (car (entsel "\nВыберите полилинию...")))
                   (eq "LWPOLYLINE" (cdr (assoc 0 (setq x01 (entget x00)))))))
    (princ "\nПолилиния не выбрана..."))
  (initget 7)
  (setq x00 (reverse (member (assoc 39 x01) (reverse x01)))
        x02 (list)
        x03 (getint "\nВведите коэффициент сглаживания: "))
  (repeat (1- (cdr (assoc 90 x01)))
    (if (zerop (cdr (setq x04 (assoc 42 x01))))
      (setq x02 (append x02 (list (assoc 10 x01)))
            x01 (cdr (member x04 x01)))
      (progn (setq x02 (append x02 (list (setq x05 (assoc 10 x01))))
                   x07 (- (angle (setq x05 (cdr x05)) (setq x06 (cdr (assoc 10 (setq x01 (cdr (member x04 x01)))))))
                          (* 2 (setq x04 (atan (cdr x04))))) ;угол касательной к ОХ
                   x06 (/ (distance x05 x06) (sin (* 2.0 (abs x04))) 2.0) ;радиус дуги
                   x04 (/ x04 x03) ;приращение угла
                   x08 0)
             (repeat (1- (* 2 x03))
               (setq x02 (append x02
                                 (list
                                   (cons 10
                                         (polar x05 
                                                (+ x07 (setq x08 (+ x08 x04))) ;угол хорды
                                                (* x06 (sqrt (- 2 (* 2 (cos (* 2 (abs x08))))))) ;следствие теоремы косинусов для равнобедренных треугольников
                                                )))))))))
  (entmod (append (subst (cons 90 (1+ (length x02))) (assoc 90 x00) x00) x02 x01))
  (princ))

Последний раз редактировалось ciril, 26.03.2014 в 13:44.
ciril вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как апроксимировать дугу отрезками? (геометрия)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как апроксимировать дугу в набор прямых с маленьким шагом Mizeracl AutoCAD 1 22.03.2011 10:57