Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.15;
Скачать: CL | DM;

Вниз

Кривые   Найти похожие ветки 

 
Juk   (2005-12-24 16:24) [0]

Уважаемые мастера, подскажите как обвести несколько точек плавной линией.  Кривые Безье для этого не подходят, т.к. требуют дополнительных вычислений и некорректно себя ведут в случае наличия ровных участков.


 
MBo ©   (2005-12-24 17:57) [1]

> Кривые Безье для этого не подходят,

Других графических примитивов для рисования кривых в GDI нет

> т.к. требуют дополнительных вычислений и некорректно себя ведут в случае наличия ровных участков.

;)


 
palva ©   (2005-12-24 22:41) [2]

А почему кривые Безье некорректно себя ведут? Тем более на ровных участках. Если правильно задать параметры, то можно нарисовать хоть прямую линию.


 
Juk   (2005-12-24 23:06) [3]

2palva

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


 
palva ©   (2005-12-25 01:08) [4]

А какой здесь алгоритм? Выходим из первой точки приходим в четвертую. Из первой точки выходим по направлению ко второй точке, а в четвертую приходим по направлению из третьей точки. Если увеличивать расстояние контрольной точки от основной, то прямая при выходе будет сильнее прижиматься к отрезку проведенному из основной к контрольной. Провели одну кривую по четырем точкам, далее четвертая точка становится первой добавляются еще три точки и проводится следующая кривая и т. д. Вот закругленный угол: горизонтальный и вертикальный участок являются прямыми, между ними закругление.

procedure TForm1.Button1Click(Sender: TObject);
const
  c: array [0..9] of TPoint = (
 (X:20; Y:10), (X:10; Y:10), (X:200; Y:10),
 (X:190; Y:10), (X:200; Y:10), (X:200; Y:10),
 (X:200; Y:20), (X:200; Y:10), (X:200; Y:200),
 (X:200; Y:210));
begin
 Canvas.PolyBezier(c);
end;


 
Juk   (2005-12-25 19:14) [5]

2palva

А кто из этих точек "основные"? Дело в том, что по данному описанию построения необходимо 4+3=7 точек, а используется 10.


 
palva ©   (2005-12-25 19:56) [6]

необходимо 4+3=7 точек, а используется 10
В примере рисуется три кривых (две прямых и одно закругление). Поэтому 10 точек.


 
Думкин ©   (2005-12-26 05:42) [7]

Сплайны ( в частности и Безье) как раз и предполагают обвод нескольких точек плавной линией. Поэтому проблема - не в их недостатках.


 
Juk   (2005-12-27 02:54) [8]

2palva

К вопросу об основных точках. В описании [4] фигурирует 7 точек. В [6] говорится о трех кривых, для построения которых необходимо 2+3+2=7 точек. Значит, из указанных в [4] 10 точек 3 контрольные. Нельзя ли указать какие именно?


 
MBo ©   (2005-12-27 07:34) [9]

Кривые Безье - параметрические кубические кривые. Нужно формализовать задачу проведения "плавной кривой". Обычно это делается расчетом коэффициентов для одного из типов кубических сплайнов - например, интерполирующего, обеспечивающего гладкость второго порядка, либо простенького Кэтмулл-Рома, обеспечивающего первый порядок гладкости и т.д. Затем можно произвести переход от степенного базиса к базису полиномов Бернштейна (для Безье). В принципе, можно сразу описать нужные соотношения (минимально - согласование значений в узлах и производных)  и разрешить уравнения (систему) относительно коэффиц. Безье, однако для вышеказанных сплайнов нетрудно найти уже готовые решения.


 
palva ©   (2005-12-27 15:22) [10]

> В [6] говорится о трех кривых, для построения которых необходимо 2+3+2=7 точек.
Для построение трех кривых необходимо 10 точек. Для построения одной кривой нужно 4 точки. Кривая выходит из первой точки в четвертую, 2 и 3-я - контрольные. Если вторая кривая должна продолжать первую, то первая точка второй кривой должна совпадать с четвертой точкой первой кривой. Таким образом для определения второй кривой нужно указать три новых точки, две из них будут контрольные, а последняя - та точка в которой закончится вторая кривая. Каждая следующая кривая добавляет еще три точки. Для трех кривых нужно десять точек. Совокупная кривая будет проходить через 1, 4, 7 и 10-ю точку, остальные точки контрольные. Такой массив надо подготовить для метода PolyBezier. По размеру массива метод поймет сколько звеньев кривой требуется. Почитайте help по этому методу и поэкспериментируйте с ним.



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

Текущий архив: 2006.01.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.041 c
14-1134664936
Piter
2005-12-15 19:42
2006.01.15
Miranda ISEE


1-1134320983
SergP
2005-12-11 20:09
2006.01.15
Работа с одной переменной в нескольких потоках.


14-1134921404
Praetor
2005-12-18 18:56
2006.01.15
Воскресная задачка


3-1132220839
Baraban
2005-11-17 12:47
2006.01.15
Делфи и Mysql


11-1116939309
TKV
2005-05-24 16:55
2006.01.15
Смена курсора ввода текста в Memo