Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
354 / 154 / 39
Регистрация: 11.07.2013
Сообщений: 828
1

Кривая Безье и DXF-файл

19.05.2017, 13:30. Просмотров 1557. Ответов 11
Метки нет (Все метки)

Здравствуйте!
В DXF-файле (AutoCAD) для постороения кривой Безье хранятся координаты узлов и контрольных точек на кривой. Построение кривой взял отсюда: Кривая Безье. Когда даны 4 узла проблем не возникает. Когда, например 6 узлов, то между 3 и 4 узлами устанавливаю дополнительный узел и строю две кривые (эта методика описана в Прстроение кривых.pdf). Контрольные точки, конечно идеально не попадают на кривую, но получаются довольно-таки близко (с этим можно мириться). А вот когда 5 точек, то рекомендуется добавить точку между 3 и 4 узлами и в конце добавить 6-ю точку с координатами 5-й.
Точки узлов в DXF-файле: (100,100), (260,330), (540,740), (660,300), (710,110), контрольные точки: (100,100), (530, 520), (710,110). Согласно выше приведённой методике я добавил точку сопряжения и строю две кривые: (100,100), (260,330), (540,740), (600,520) и (600,520), (660,300), (710,110), (710,110).
Средняя контрольная точка при этом на кривую не попадает:
Кривая Безье и DXF-файл

А вот так это выглядет в AutoCAD-е:
Кривая Безье и DXF-файл

Посоветуйте, как можно решить эту проблему.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2017, 13:30
Ответы с готовыми решениями:

кривая безье
формула вторая праизводна для кривой безье хач у

Кривая Безье
Привет всем. Если не трудно помогите решыть одну задачу. Есть кривая Безье, из нее нужно сделать...

Кривая Безье
Много гуглил по ним, но досконального и простого кода так и не нашёл. Да, я перекопал много кодов....

Кривая Безье из 7 точек
Здравствуйте! По заданию необходимо сделать Кривую Безье из 7 точек в Borland Delphi. За основу...

11
4355 / 3613 / 1220
Регистрация: 14.04.2014
Сообщений: 17,032
Записей в блоге: 17
19.05.2017, 14:33 2
не очень понятно, контрольные точки безье - они ведь не должны лежать на кривой ?
0
354 / 154 / 39
Регистрация: 11.07.2013
Сообщений: 828
19.05.2017, 14:51  [ТС] 3
krapotkin, спасибо, что отозвались.
Прилагаю спецификацию DXF-формата DXF Reference.pdf. На стр. 130 обозначаются как "10" и "20" узлы, по которым строится линия Безье, а "11" и "21" точки на кривой Безье, т.е. где был сделан щелчок мышкой. В файле "Безье.dxf" Безье.rar описание линии Безье начинается со строчки 2300, а точки, лежащие на кривой на строчках 2381-2396.
0
4355 / 3613 / 1220
Регистрация: 14.04.2014
Сообщений: 17,032
Записей в блоге: 17
19.05.2017, 15:15 4
раньше вечера сб даже взглянуть не смогу )
0
354 / 154 / 39
Регистрация: 11.07.2013
Сообщений: 828
20.05.2017, 09:53  [ТС] 5
Дело здесь оказывается значительно сложнее, чем представлялось на первый взгляд. В AutoCAD-е и в других графических программах (соответственно и в DXF-файле) используется не линия Безье, а B-сплайн (NURBS), построение которого определяется не всеми точками, а тремя соседними. Кроме того точки имеют свои весовые коэффициенты. Математический аппарат расчёта сложный. Описание его есть в книге Роджерса и Адамса "Математические основы машинной графики". Готовых примеров на Паскале или С найти не удалось. Встретил на эту тему пару фраз, что для расчёта сплайнов может использоваться библиотека "alglib", но какого сплайна не известно.
Этот сплайн используется так же в OpenGL и в библиоетеке "glu" содержится ряд определений. Но моя задача не только нарисовать кривую на экране, но получить точки её апроксимации.
Судя по количеству полученных ответов вряд ли кто этим занимался, но надежда "умирает последней..."

Добавлено через 36 минут
Нашёл боле-менее толковую статью на эту тему: http://masters.donntu.org/2003... urvrus.htm.
0
случайный прохожий
1486 / 967 / 372
Регистрация: 20.07.2013
Сообщений: 2,833
20.05.2017, 13:08 6
Я же давал ссылку на тему В-сплайновые кривые здесь: Кривая Безье
0
354 / 154 / 39
Регистрация: 11.07.2013
Сообщений: 828
20.05.2017, 19:14  [ТС] 7
gunslinger, а не подскажите, какие значения должны принимать
C++
1
2
3
const count = 7, m = 10;
TPoint point[count];
double tmin = 0, tmax = 1, t[m+1] = {tmin, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, tmax};
m и массив t, если, например количество точек (count) я буду брать не 7, а 10?
И второе. Я понял так, что вы приводите пример с B-сплайном. Я не исключаю, что именно он используется в AutoCAD-е (пока не проверил совпадение точек на кривой). но, вполне возможно, что там используется NURBS, т.е. помимо всего точки должны характеризоваться весом. В DXF-файле есть такие параметры:
71 (степень кривой сплайна) = 3 (всегда).
72 (число узлов) = 9 (что это не знаю).
73 (число контрольных пунктов)=5 (контрольные точки для построения кривой, т.е. наши "point")
74 (число пригодных точек)=3 (точки, которые были указаны мышкой, т.е. лежат на линии сплайна).
41 (вес), но этого параметра нет, т.е. на NURBS уже не похоже.
40 (значения узлов) и здесь приводятся 9 чисел, которые никак не похожы на весовые коэффициенты для NURBS: 0.0 _ 0.0 _ 0.0 _ 0.0 _ 60.0 _ 105.0 _ 105.0 _ 105.0 _ 105.0 Что это может быть?
0
случайный прохожий
1486 / 967 / 372
Регистрация: 20.07.2013
Сообщений: 2,833
20.05.2017, 22:55 8
Я давно это делал и сейчас мало чем смогу помочь, лучше почитать ту тему и имеющуюся там (или еще где) теорию.
0
354 / 154 / 39
Регистрация: 11.07.2013
Сообщений: 828
21.05.2017, 17:53  [ТС] 9
gunslinger, воспользовался вашим кодом с небольшими изменениями под Лазарус и посмотрел ссылки. При наличии 5 контрольных точек в B-сплайне всё прекрасно совпадает с AutoCAD-овским DXF-файлом:
Кривая Безье и DXF-файл

Однако, при увеличении количества контрольных точек начинаются расхождения:
Кривая Безье и DXF-файл

Во всяком случае - B-сплайн отображается, а вот, что там в AutoCAD-е используется, придётся ещё разбираться. Буду благодарен за любую помощь (высшую математику я изучал 40 лет назад, поэтому довольно-таки с трудом всё это вспоминается).
Прилагаю код построения B-сплайна, адаптированный под Лазарус: Bspline.rar.
0
354 / 154 / 39
Регистрация: 11.07.2013
Сообщений: 828
21.05.2017, 17:59  [ТС] 10
Вообще формат DXF вызывает массу вопросов. Сплайн на NURBS не похож (количество узлов не соответствует количеству контрольных точек, а если их значения использовать в качестве узлов (у меня tt[]), то получается вообще какая-то ерунда.
0
354 / 154 / 39
Регистрация: 11.07.2013
Сообщений: 828
21.05.2017, 21:53  [ТС] 11
Вот здесь на 5-й странице есть описание DXF_Bombasaro.pdf, но ничего у меня опять не получается...
0
354 / 154 / 39
Регистрация: 11.07.2013
Сообщений: 828
24.05.2017, 11:04  [ТС] 12
Цитата Сообщение от shyub Посмотреть сообщение
а если их значения использовать в качестве узлов (у меня tt[])
Именно так и поступил. Нашёл максимальное значение, принял его за 1, пропорционально уменьшил остальные tt[].
Вот результат:

Кривая Безье и DXF-файл

Кривая Безье и DXF-файл

Кривая Безье и DXF-файл


Вопрос можно считать закрытым.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2017, 11:04

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

Кривая Безье - ошибка
Доброго времени суток! Пытаюсь построить кривую Безье по точкам (без использования стандартной...

Кривая Безье для любого количества точек
Здравствуйте. Есть несколько точек. Нужно построить кривую Безье по ним. Слышал, что вроде...

Кривая Безье, добавить возможность задания координат мышью
Есть программа, которая рисует кривую Безье по заданным в Edit'ах координатах. Подскажите,...

Кривая Безье в сплайн Безье
Здравствуйте. Я по специальности программист и мне нужно генерировать замкнутую кривую не...

Кривая Безье
Здравствуйте, мне нужна помощь, а именно нужно откорректировать код, чтобы кривая рисовалась из 2...

Кривая Безье
Вооружился статейкой на википедии...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.