Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

Построение кривых Безье   Найти похожие ветки 

 
NikeOLD   (2004-05-14 22:16) [0]

День добрый!
Задачка такая. В Автокаде рисуется чертеж из полилиний. Надо, прочитав полилинию из DXF отрисовать ее на канве. Все сделано, кроме отрисовки. Координаты в массиве не целые числа, кроме того их избыточно. Т.е. кривая может иметь разброс, например, по высоте всего 3 пикселя, при длине 160 пикселей или чуть больше. Т.о. у меня 160 вершин, отличающихся друг от друга на десятые доли пикселя. Рисование LineTo не подходит - слишком грубо после округления (зато правильно). Надо как-то трансформировать кривую в кривую Безье. Кроме того ни PolyLine ни PolyBezier не могут отрисовать что-либо корректное в этом случае, хотя возможно причина в трансформации мировых координат.
Быть может кто-нибудь подскажет как из всего этого хозяйства получить кривую Безье по типу как в CorelDraw или AutoCAD?


 
Goida ©   (2004-05-14 23:38) [1]

Поищи кривые без буквы Е :))
А вообще, есть сайт http://algolist.manual.ru/ может здесь что есть?


 
Goida ©   (2004-05-14 23:39) [2]

И здесь: http://alglib.manual.ru/graphics/


 
MBo ©   (2004-05-14 23:50) [3]

1. Каждая полилиния изначально (отрезками) была одной кривой Безье?
2. Какого рода кривые - явного вида (которые можно представить как однозначные функции типа y=f(x)) или произвольно-параметрические?


 
NikeOLD   (2004-05-15 00:20) [4]


> MBo ©   (14.05.04 23:50) [3]

Не то и не другое. В Автокаде полилиния всего лишь набор соединенных между собой вершин (я так понимаю из их построения, а в CorelDraw сразу видно, что кривые Безье), обладающих некоторыми характеристиками. Правда, если полилиния содержит две вершины, но отрезок между ними представлен дугой (радиус не задается), то Автокад вставляет одну или необходимое количество вершин самостоятельно и без возможности редактирования, но в конечном файле их не отличишь от остальных, хотя сам он потом все корректно распознает.
Тем не менее сути дела это не меняет. Отрисовка через LineTo дает верный результат, но слишком убого смотрится - топорно. Если начинаешь масштабировать через SetWorldTransform, вообще ни на что не похоже, а PolyLine какую-то ересь выводит, абсолютно не похожую на то, что должно быть.

Может кто-нибудь скинет ссылку на материалы по программированию векторной графики на Delphi или C++ средствами GDI, а не OpenGL. Весь и-нет перерыл, пока ничего стоящего не нашел!


 
NikeOLD   (2004-05-16 13:17) [5]

Ау!
Ну неужели абсолютно никому не интересно использование GDI для векторной графики?


 
Aldor ©   (2004-05-16 13:53) [6]

Если Вам нужна именно отрисовка кривой Безье по множеству точек, то в API реализованы готовые функции, PolyBezier, например


 
jack128 ©   (2004-05-16 15:00) [7]

Дам делетантский совет :-)

А если подать на вход PolyBezier не весь округленный массив, а только
часть точек, для которых например (frac(Points[i].x) < 0.1) and  (frac(Points[i].y) < 0.1)


 
Бином Ньютоныч   (2004-05-16 20:34) [8]

Я разбивал полилинии на составляющие объекты( метод Explode). Правда, задача была несколько иная, но может и здесь поможет. Кстати, в AutoCAD полилиния это несколько связанных простых объектов - прямая, дуга и т.д.


 
Aldor ©   (2004-05-17 00:26) [9]

Aldor ©   (16.05.04 13:53) [6]

упс, каюсь, не туда и не в тему


 
Aldor ©   (2004-05-17 00:35) [10]

Попытаюсь еще раз, в вопрос вроде вник:

 Как понимаю, проблема в том, что "дискретность" координат точек массива гораздо меньше дискретности целых чисел, которыми исчисляются пикселы.

 Решение №1 - масштабирование: растянуть изображение так, чтобы координаты точек стали с некоторой степенью близки к целым.
 Ну а если нужно это изображение поместить как раз в меньшую площадь, то НЕИЗБЕЖНА потеря качества. Тут надо поступать по всем законам растровой графики: линейная, билинейная фильтрация и им подобные (когда несколько пикселей в результате масшитабирования "сливаются" в один, значение его цвета вычисляется по значениям цветов соседних пикселей).


 
MBo ©   (2004-05-17 07:40) [11]

>в AutoCAD полилиния это несколько связанных простых объектов - прямая, дуга и т.д.

Т.е. это некий аналог структуры, которую выдает GetPath и которая используется в PolyDraw?


 
NikeOLD   (2004-05-17 10:14) [12]


> Т.е. это некий аналог структуры, которую выдает GetPath
> и которая используется в PolyDraw?

Я е могу с уверенностью сказать, что это  PolyDraw, возможно у них собственная реализация этой функции.

Вероятно моя вина еще и в некорректности вопроса, все же новой направление, вынужденное... :)
Необходим вьюер, который мог бы работать с различными системами координат, например, в AutoCAD и  иже с ним все размеры в миллиметрах, но ясно как день, что GDI на это по барабану, следовательно перед выводом необходимо преобразовывать миллиметры к пикселам экрана и/или принтера с соответсвующим разрешением.
Формулы с вас не прошу, но кажеться, благодаря всем, начинаю понимать, что делать, хотя равно могу и ошибаться :).

Спасибо, но дальнейшие предложения по прежнему жду.


 
Бином Ньютоныч   (2004-05-17 18:07) [13]

>MBo ©   (17.05.04 07:40) [11]

Я бы, пожалуй, не сказал, что здесь усматривается аналогия. Это именно набор вполне самостоятельных объектов, имеющих общие точки, причем не обязательно начало/конец. Не знаю, как они хранятся внутри, но метод Explode возвращает массив интерфейсов вполне самостоятельных объектов. Мне трудно сказать подробнее, передо мной стояла чисто конкретная задача и я ее чиста канкретна :) решил, не осоенно вникая в неотносящиеся к задаче нюансы. Так что знатоком автокада я не являюсь, сталкивался с ним всего один и, возможно, последний раз:)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.033 c
1-1085037983
MegaVolt
2004-05-20 11:26
2004.05.30
Как правильно обработать ошибку внутри класса?


7-1082712524
Zyb
2004-04-23 13:28
2004.05.30
Сервис в Win2000


1-1084977080
SMART_n
2004-05-19 18:31
2004.05.30
Консольное приложение


14-1084101378
lak
2004-05-09 15:16
2004.05.30
беда с кольцами


4-1082289411
Torin
2004-04-18 15:56
2004.05.30
Drag&amp;Drop





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский