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

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

Как сделать аппроксимацию дуги в 3х координатах?

Ответ
Поиск в этой теме
Непрочитано 26.01.2014, 01:19 #1
Как сделать аппроксимацию дуги в 3х координатах?
amyskin
 
Регистрация: 16.01.2014
Сообщений: 6

Даны три точки - центр дуги и начало и конец дуги
Как построить дугу отрезками (сделать нужно например 10 шагов)?

Когда две координаты, то:

{x0, y0} - координаты центра
{x1, y1} и {x2, y2} - координаты начала и конца
a1 = Math.atan2 (y2 - y0, x2 - x0) * 180 / Math.PI
a2= Math.atan2 (y1 - y0, x1 - x0) * 180 / Math.PI
r = Math.sqrt ((x2 - x0) * (x2 - x0) + (y2 - y0) * (y2 - y0))
a= a2 - a1
step = 10
as = a / step

for i = 0 to step
u = (a1 + as * i) * Math.PI / 180
x = x0 + r * Math.cos (u)
y = y0 + r * Math.sin (u)
next i



а вот когда их три как быть?
Просмотров: 3904
 
Непрочитано 26.01.2014, 06:42
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


А что мешает рисовать в нужной Вам плоскости?
Boxa вне форума  
 
Непрочитано 26.01.2014, 09:48
#3
Кулик Алексей aka kpblc
Moderator

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


amyskin, ты бы хоть язык обозначил, да и остальные подробности - для AutoCAD пишешь или как...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.01.2014, 11:51
#4
trir


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


все равно плоская, в АкАд'е есть СК объекта. Получается надо нарисовать дугу на плоскости и разместить эту плоскость в пространстве
trir вне форума  
 
Автор темы   Непрочитано 26.01.2014, 13:38
#5
amyskin


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
amyskin, ты бы хоть язык обозначил, да и остальные подробности - для AutoCAD пишешь или как...
Язык тут не особо важен, мне нужно понять принцип. Пишу на VB net и не для Autocad.
Нужно взять дугу в autocad и передать в нужную программу уже координаты апроксимации (x,y,z)
amyskin вне форума  
 
Непрочитано 26.01.2014, 14:44
#6
hexD

КМД
 
Регистрация: 26.03.2013
Я ЖЫВУ В РОССИИ.
Сообщений: 506
<phrase 1=


1. по трем точкам определить плоскость (A,B,C,D),
2. задать начало координат в этой пл-ти (взять одну из точек)
3. найти координаты в пл-ти двух других точек.
4. в этой плоскости по местным координатам построить то что вы умеете в 2D
5. перейти обратно в 3D - по двум локальным координатам любой точки и смещения локального начала координат отн. глобального найти третью координату (подставить в ур-ие по п1).
6. передать что надо куда надо...
hexD вне форума  
 
Непрочитано 26.01.2014, 15:04
#7
aTBepTKa


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


Когда-то на C# писал программу, где надо было построить дугу по трем точкам. Выход нашел при помощи уравнения параболы (квадратное уравнение): y=ax^2+bx+c. Коэффициенты a, b, c рассчитываются по формулам, которые можно найти в википедии (пункт Расчёт коэффициентов квадратного уравнения).
http://ru.wikipedia.org/wiki/%D0%9F%...BE%D0%BB%D0%B0

----- добавлено через 36 сек. -----
Если как-то поможет, могу поделиться кодом.
aTBepTKa вне форума  
 
Непрочитано 26.01.2014, 17:35
#8
gomer

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


У каждой кривой, а дуга - это кривая, есть параметр и длина. В лиспе все решается просто, с помощью функций vlax-curve-get-***. В дотнет должен быть аналог, по идее...
gomer вне форума  
 
Непрочитано 26.01.2014, 19:22
#9
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Даны три точки - центр дуги и начало и конец дуги
Под эти исходные данные подойдут 2 дуги. Также возможен случай когда точки лежат на прямой -> бесконечно много дуг

>>а вот когда их три как быть?

как уже сказали - дуга плоский примитив и лежит в локальной системе координат на плоскости z=0
Я бы в данном случае делал так:
Посчитал угол дуги (назову его A), это угол между (P2-P0) и (P1-P0).
Посчитал нормаль дуги (ось 0Z) это нормализованное векторное произведение (P1-P0)*(P2-P0) если A<pi и (P2-P0)*(P1-P0) если A>pi
За ось 0X дуги принял бы нормализованный вектор (P1-P0)
Посчитал ось 0Y дуги это векторное произведение 0Z*0X
По 0X,0Y,0Z и P0 построил бы матрицу перехода из системы координат дуги в мировую СК.
а дальше бы как в первом посте, с учетом того что начальный угол=0, конечный=A и домножая результат (x,y,0) на матрицу перехода
zamtmn вне форума  
 
Непрочитано 26.01.2014, 19:39
#10
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от amyskin Посмотреть сообщение
а вот когда их три как быть?
Посмотри здесь:
http://adndevblog.typepad.com/autoca...tated-ucs.html
http://adndevblog.typepad.com/autoca...ice-versa.html
может быть полезно
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 27.01.2014, 13:22
#11
amyskin


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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Под эти исходные данные подойдут 2 дуги. Также возможен случай когда точки лежат на прямой -> бесконечно много дуг
Может я не правильно выразился, но я анализирую дугу нарисованную в автокаде, соответственно есть все данные которые автокад выдает для дуги.
amyskin вне форума  
 
Непрочитано 27.01.2014, 16:15
#12
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


Цитата:
Сообщение от amyskin Посмотреть сообщение
но я анализирую дугу нарисованную в автокаде, соответственно есть все данные которые автокад выдает для дуги
Хм... а если тогда так:
Пускай автокад Вам сам все поделит и отдаст уже готовый набор точек
Код:
[Выделить все]
                            Dim PointList As New List(Of Point3d) 'Сюда пишем точку
                            Dim acPline As Curve = CType(acEnt, Curve) 'Исходная кривая
                            Dim piece As Double = 10 'На сколько делить параметр

                            Dim plStartParam As Double = acPline.StartParam
                            Dim plEndParam As Double = acPline.EndParam

                            Dim startParam As Double = plStartParam
                            Dim endParam As Double = startParam + (1 / piece)

                            While (endParam <= plEndParam)
                                Dim param As Double = startParam + ((endParam - startParam) * (1 / piece))
                                Dim pt As Point3d = acPline.GetPointAtParameter(param)
                                PointList.Add(pt)

                                startParam = endParam
                                endParam += 1 / piece
                            End While
Boxa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как сделать аппроксимацию дуги в 3х координатах?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать сопряжение в нужной точке? rtyu AutoCAD 4 08.08.2012 16:43
Из чего сделать несущие стены для индивидуального жилого дома Минька Конструкции зданий и сооружений 32 24.03.2009 11:49
Как сделать сделать заливку на растровой подложке? Особое мнение Разное 2 13.05.2008 10:30
как из ДУГИ сделать линию? ilka_t AutoCAD 6 11.10.2007 12:12
Дуги в ACAD 2k5 Iam AutoCAD 5 19.05.2005 23:32