Я сначала полиномами аппроксимировать пытался , но там например точки , расположенные по кругу нельзя ....
Безье - там ввообще гладкая кривая только для 4 точек ...
Так что ищу пока способ. Ведь делают же.
Основная идея для меня - алгоритм проведения гладкой кривой через множество точек, неизвестно как расположенных ( раскиданных по плоскости ). Пример - ключевые точки , задающие дорогу на карте. Дорога идет как ей угодно (возможно пересекаясь сама с собой) ... Надо провести гладкую кривую ...
Нужен исходник по сплайнам , т.е. проведение гладкой кривой через несколько точек на плоскости ...
Хорошо бы на C++ ... Но разберусь и в инородных исходниках...
Идею ухватить просто пока не смог ...
[pasca] offtopic: народ ! кто сам писал алгоритм ... 11.05.01 16:22 Автор: Dr.Golova Статус: Незарегистрированный пользователь
> Нужен исходник по сплайнам , т.е. проведение гладкой кривой > через несколько точек на плоскости ... > Хорошо бы на C++ ... Но разберусь и в инородных > исходниках... > Идею ухватить просто пока не смог ...
program Spline_Draw;
uses crt, graph;
type TPoint = record
X, Y : Real;
end;
const NP = 5;
Res = 50;
var PMas : array [-1..NP+2] of TPoint;
GrDrv, GrMod : Integer;
MaxX, MaxY : Integer;
i, j : Integer;
c : Char;
procedure MakePolinom (C1,C2,C3,C4 : TPoint; T,D : Real; var X,Y : Real);
var T2, T3 : Real;
begin
T2 := Sqr(T);
T3 := T2 * T;
X := ( C1.X*T3 + C2.X*T2 + C3.X*T + C4.X ) / D;
Y := ( C1.Y*T3 + C2.Y*T2 + C3.Y*T + C4.Y ) / D;
end;
procedure DrawBSpline(N, Resolution : Integer);
var i, j : Integer;
X1, Y1, X2, Y2 : Real;
C1, C2, C3, C4 : TPoint;
begin
PMas[-1] := PMas[1];
PMas[0] := PMas[1];
PMas[N+1] := PMas[N];
PMas[N+2] := PMas[N];
for i := 0 to N do
begin
CalcBSpline(i, C1, C2, C3, C4);
MakePolinom(C1, C2, C3, C4, 0, 6, X2, Y2);
for j := 1 to Resolution do
begin
MakePolinom(C1, C2, C3, C4, j/Resolution, 6, X1, Y1);
Line(Round(X2), Round(Y2), Round(X1), Round(Y1));
X2 := X1; Y2 := Y1;
end;
end;
end;
procedure DrawCatmullSpline(N, Resolution : Integer);
var i, j : Integer;
X1, Y1, X2, Y2 : Real;
C1, C2, C3, C4 : TPoint;
begin
PMas[0] := PMas[1];
PMas[N+1] := PMas[N];
for i := 1 to N-1 do
begin
CalcCatmullSpline(i, C1, C2, C3, C4);
MakePolinom(C1, C2, C3, C4, 0, 2, X2, Y2);
for j := 1 to Resolution do
begin
MakePolinom(C1, C2, C3, C4, j/Resolution, 2, X1, Y1);
Line(Round(X1), Round(Y1), Round(X2), Round(Y2));
X2 := X1; Y2 := Y1;
end;
end;
end;
procedure DrawX;
var i : Integer;
begin
for i := 1 to NP do
begin
Line(Round(PMas[i].X-3), Round(PMas[i].Y),
Round(PMas[i].X+3), Round(PMas[i].Y));
Line(Round(PMas[i].X), Round(PMas[i].Y-3),
Round(PMas[i].X), Round(PMas[i].Y+3));
end;
end;
begin
Randomize;
GrDrv := Detect;
InitGraph(GrDrv, GrMod, ''); { }
if GraphResult <> GrOk then
begin
Writeln(#10#13, 'Error initializing graphics !');
Writeln('egavga.bgi must be in current dir !', #10#13);
Halt(0);
end;
MaxX := GetMaxX; MaxY := GetMaxY;
repeat
for i := 1 to NP do
begin
PMas[i].X := Random(MaxX);
PMas[i].Y := Random(MaxY);
end;
> Нужен исходник по сплайнам , т.е. проведение гладкой кривой > через несколько точек на плоскости ... > Идею ухватить просто пока не смог ... возьми учебник по численным методам и прочитай пару страниц.
еще есть неплохая книга по сплайнам, автор Шикин.
идея сплайнов примитивная до безобразия. разберешься за полчаса.
удачи!
йцукенг
Спасибо , разобрался ... Действительно все просто ... Да и в С++ встроенная фишка есть - PolyBezier...12.05.01 12:59 Автор: Shadow Walker Статус: Незарегистрированный пользователь
Я 2 года бьюсь, пока не добился. Задача такая: как провести через произвольное количество точек кривую, непрерывную или из кусочков, с заданием касательных на входе и выходе, главное, чтобы была плавной и без выбросов. Полином Лагранжа не подходит - он дает непредсказуемые выбросы, кроме того у него нельзя задать касательные. Безье - то же, тут другой геморрой: как задать направляющие вектора? Примитивные решения, типа равны по модулю, смотрят в разные стороны и параллельны прямой, соединяющей 2 соседние точки дают весма непрезентабельный результат. Из всего, что я видел, самый лучший сплайн строит Автокад, но кто знает, какой алгоритм он использует?
[C++] Не так все просто15.05.01 22:04 Автор: Paskal Статус: Незарегистрированный пользователь
Да всё не сложно, просто не надо путать полиномы со сплайнами. Для соответствующего сплайна не сложно задать и условия на концах.
> Я 2 года бьюсь, пока не добился. Задача такая: как провести > через произвольное количество точек кривую, непрерывную или > из кусочков, с заданием касательных на входе и выходе, > главное, чтобы была плавной и без выбросов. Полином > Лагранжа не подходит - он дает непредсказуемые выбросы, > кроме того у него нельзя задать касательные. Безье - то же, > тут другой геморрой: как задать направляющие вектора? > Примитивные решения, типа равны по модулю, смотрят в разные > стороны и параллельны прямой, соединяющей 2 соседние точки > дают весма непрезентабельный результат. Из всего, что я > видел, самый лучший сплайн строит Автокад, но кто знает, > какой алгоритм он использует?
Я сначала полиномами аппроксимировать пытался , но там например точки , расположенные по кругу нельзя ....
Безье - там ввообще гладкая кривая только для 4 точек ...
Так что ищу пока способ. Ведь делают же.
Основная идея для меня - алгоритм проведения гладкой кривой через множество точек, неизвестно как расположенных ( раскиданных по плоскости ). Пример - ключевые точки , задающие дорогу на карте. Дорога идет как ей угодно (возможно пересекаясь сама с собой) ... Надо провести гладкую кривую ...
Пока не знаю как ...
Численные методы ... они самые...16.05.01 02:07 Автор: Torq Статус: Незарегистрированный пользователь
Вообще говоря сплайн строится кубический и по четырём точкам, только все сплайны в промежуточных точках склеивают условием совпадения касательной, а условия на краях выбирают произвольно или наклаюывают условие естественности. Получается достаточно гладкая кривая, проходяшая через все точки. Условия сшития рассчитываются прогонкой.