Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Здравствуйте, Ильгиз. Математика - царица наук (Карл Гаусс). Изучение математики начинается с детского сада, когда нас учат считать и выполнять простые арифметические операции. Любой, даже самый простейший алгоритм будет связан с арифметическими...
Я хотел узнать математика это обязательно в программирование. Пять лет назад просто из любопытства я увлекся HTML потом изучил CSS и JvaScript потом изучил PHP и Java. Как то не задумывался и начал смотреть форумы и узнал что без математики не...
Все верно, но так же необходимо зайти в: Компоновщик -> Ввод -> Дополнительные зависимости Здесь необходимо нажать изменить и в Дополнительные зависимости прописать это: SDL2.lib SDL2main.lib SDL2test.lib Без этого не заработает. (MVS 2015)
Спасибо за реализацию, она действительно быстрая. Но не все линии отрисовывает в нужную сторону... Необходимо добавить проверку для случая X-линии if(y1 "<" y0) grad=-grad; и аналогично для Y-линии if(x1 "<" x0) grad=-grad; P.S. На...
Отличные уроки(учу GL по ним), только в renderScene нужно добавить очистку буфера цвета и буфера глубины. При изменении размеров треугольники размножаются)

Счетчики и рейтинг

Яндекс.Метрика Рейтинг@Mail.ru
Скриншот к примеру
Среда программирования: 
Lazarus
Статья по теме: 

По заданному количеству точек, задаваемых координатами x, y, необходимо построить кривую при помощи метода сглаживания кривой типа β-сплайна.
Создадим форму с двумя полями для ввода и кнопкой. В первое поле вводится количество точек, во второе - координаты точек. Отрицательные значения не поддерживаются. При нажатии на кнопку, поле для рисования заливается цветом clDefault для того, чтобы стереть предыдущие результаты построения(если таковые имеются) и затем строится кривая.
Используемые функции:
getCoords() - отвечает за корректное считывание координат из поля №2
setCoefficients(Index: Integer) - пересчитывает коэффициенты, необходимые для построения β-сплайна
drawSpline() - Строит сплайн, используя коэффициенты, полученные из функции setCoefficients(Index: Integer)

Код программы: 

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
    procedure getCoords();
    procedure setCoefficients(Index: Integer);
    procedure drawSpline();
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  x : array[1..30] of Double;
  y : array[1..30] of Double;
  a3,a2,a1,a0,b0,b1,b2,b3,x1,y1,t : Double;
  i,j,k,n,len : Integer;
  s1,s2 : String;
implementation
 
{$R *.lfm}
 
{ TForm1 }
// Считываем координаты
procedure TForm1.getCoords();
begin
     n:= StrToInt(Edit2.Text);
       s1:=Edit1.Text;
       i := 1;
       j:=0;
       k:=0;
       len := Length(s1);
       while j < n do
       begin
            Delete(s2,1,n);
            while (s1[i] <> ' ') and (i < len+1) do
            begin
                 if s1[i] <> ',' then
                 begin
                      s2:=s2+s1[i];
                 end;
                 i:=i+1;
            end;
            k:=k+1;
            if (k mod 2)=0 then
            begin
                 y[j]:=StrToInt(s2);
                 j:=j+1;
            end
            else
                x[j]:=StrToFloat(s2);
            i:=i+1;
       end;
end;
// Считаем коэффициенты для построения сплайна
procedure TForm1.setCoefficients(Index: Integer);
begin
     a3:= (-1*x[Index-1]+3*x[Index] - 3*x[Index+1] + x[Index+2])/6;
     a2 := (x[Index-1] - 2*x[Index] + x[Index+1])/2;
     a1 := (-1*x[Index-1] + x[Index+1])/2;
     a0 := (x[Index-1] + 4*x[Index] + x[Index+1])/6;
     b3 := (-1*y[Index-1]+3*y[Index] - 3*y[Index+1] + y[Index+2])/6;
     b2 := (y[Index-1] - 2*y[Index] + y[Index+1])/2;
     b1 := (-1*y[Index-1] + y[Index+1])/2;
     b0 := (y[Index-1] + 4*y[Index] + y[Index+1])/6;
     x1:=(((a3*t + a2)*t+a1)*t + a0)*5;
     y1:=(((b3*t + b2)*t+b1)*t + b0)*5;
end;
// Отрисовываем сплайн
procedure TForm1.drawSpline();
begin
     with PaintBox1.Canvas do
     begin
          while t<1 do
          begin
               MoveTo(round(x1), round(y1));
               x1:=(((a3*t + a2)*t+a1)*t + a0)*5;
               y1:=(((b3*t + b2)*t+b1)*t + b0)*5;
               LineTo(round(x1), round(y1));
               t := t + 0.01;
           end;
     end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  with PaintBox1.Canvas do
  begin
       Brush.Color:=clDefault;
       PaintBox1.Canvas.Rectangle(0,0, PaintBox1.Width, PaintBox1.Height);
       Brush.Color:=clBlack;
       Form1.getCoords();
       for i :=1 to n-3 do//Строим сплайн для 1-4 точек, для 2-5 точек и так далее до n-3..n
       begin
           t := 0;
           Form1.setCoefficients(i);
           Form1.drawSpline();
       end;
    end;
end;
 
end.

Прикрепленный файлРазмер
Исходные коды и исполняемый файл884.6 кб

Комментарии

nik_1 аватар
Опубликовано nik_1 в 26. Июнь 2016 - 14:04.

в коде присутствуют ошибки!
// Считываем координаты
procedure TForm1.getCoords(Sender: TObject);
var j1:longint;
begin
n:= StrToInt(Edit2.Text); //число точек
s1:=Edit1.Text;
s2:='';
i := 1;
j:=1;
k:=0;
len := Length(s1);
while j <= n do
begin
while s1[i] <> ',' do
begin
s2:=s2+s1[i];
i:=i+1;
end;
i:=i+1;
x[j]:=StrToFloat(s2);
s2:='';
while s1[i] <> ' ' do
begin
s2:=s2+s1[i];
i:=i+1;
end;
y[j]:=StrToFloat(s2);
s2:='';
j:=j+1;
end;
end;