Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2011, 21:49   #1
Muaxaxa
Пользователь
 
Регистрация: 22.10.2011
Сообщений: 19
По умолчанию

Доброго времени суток.
Проблема в том , что закрашиваются не те пикселы, и получается не совсем прямая кривая. )

Код:
unit Unit1;

interface

uses
  Math, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    RadioGroup1: TRadioGroup;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Button1: TButton;
    Procedure BezierCurve();
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
    P:array of record           {Koordinati mishi}
        x,y : integer;
        end;
    B:array of real;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BezierCurve;
var i:integer;
    t:real;
    x,y,xa,ya:integer;
    n,m,nm,mc,nmc:real;
    nf,mf,nmf:real;
    t1:real;
    mp,xc,yc,z,m1:integer;
    mb:integer;
begin

  n:=(StrToInt(Edit1.Text)-1);
  m1:=(strtoint(Edit1.Text)-1);
  t:=0;
  t1:=(StrToFloat(edit2.Text));
  nf:=1;
  while n>1 do
   begin
    nf:=n*(n-1)*nf;
    n:=n-2;
   end;
while t<=1 do
begin

  mb:=0;
  m:=0;
begin
  for z:=0 to m1 do
    begin
    nmf:=1;
    mf:=1;
      n:=(StrTofloat(Edit1.Text)-1);
      nm:=n-m;

   if m<=1 then
      mf:=1
   else
    begin
      mc:=m;
        while mc>1 do
          begin
            mf:=mc*(mc-1)*mf;
            mc:=mc-2;
          end;
    end;
   if nm<=1 then
      nmf:=1
   else
    begin
      nmc:=nm;
       while (nmc)>1 do
        begin
          nmf:=(nmc)*(nmc-1)*nmf;
          nmc:=nmc-2;
        end;
    end;

            B[mb]:= ((nf)/((mf)*(nmf)))*(POWER((1-t),nm))*(Power(t,m));
        begin
        mb:=mb+1;
        m:=m+1;
        end;
  end;
end;

                  {Вроде , что -то не так с этой частью }
                 {---------------------}

      xa:=0;
      mp:=0;
      mb:=0;
      for xc:=0 to m1 do
        begin

          xa:=(Round(B[mb]*P[mp].x)+xa);
          mb:=mb+1;
          mp:=mp+1;
        end;

      ya:=0;
      mp:=0;
      mb:=0;
      for yc:=0 to m1 do
        begin

          ya:=(Round(B[mb]*P[mp].y)+ya);
          mb:=mb+1;
          mp:=mp+1;
        end;

        x:=xa;
        y:=ya;
        Image1.Canvas.Pixels[x,y]:=clBlack; 
                   {---------------------------}

        t:=t+t1;
      end;
        
        for i:=0 to m1 do      {cikls lai redzet kas notiek}
    begin

    image1.Canvas.TextOut(P[i].x,P[i].y,IntToStr(i+1));
    Image1.Canvas.Ellipse(P[i].x-3,P[i].y-3,P[i].x+3,P[i].y+3);
    end;
      
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);       { Na klik mishi activiruet okno}
                                                   { i kol-vo knopok }
begin

  P[RadioGroup1.ItemIndex].x:=x;
  P[Radiogroup1.ItemIndex].y:=y;
  Image1.Picture:=nil;{ nulle vai neeksiste}
  BezierCurve();

end;

procedure TForm1.Button1Click(Sender: TObject);
var n,i,mp,e: integer;
begin
n:=(strtoint(Edit1.Text));
SetLength(P, n);
SetLength(B, n);

n:=(strtoint(Edit1.Text)-1);
RadioGroup1.Items.Clear;
e:=1;
for i:=0 to n do
  begin
    RadioGroup1.Items.Add('Tochka');
    e:=e+1;
  end;

  Randomize;
  mp:=0;
  for i:= 0 to n do
    begin
      P[mp].x:=Random(image1.Width);
      P[mp].y:=Random(image1.Height);
      mp:=mp+1;
    end;
end;

end.


*Как спрятать код в разворот?

Ап?qwertyu

Читаем правила :
3. Не флудить. Флудом (пустой болтовней) считается все, не относящееся к теме. Здесь вам не чат, а форум серьезно увлеченных людей.
К флуду относится также:
- "апание" темы
, т.е. попытка привлечь к теме повышенное внимание за счет других, чужих тем;

Последний раз редактировалось mihali4; 27.11.2011 в 03:14.
Muaxaxa вне форума Ответить с цитированием
Старый 27.11.2011, 10:10   #2
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Цитата:
не совсем прямая кривая



Рисуйте не точками, а линиями.
При вычислении используйте Extended, и округляйте его только непосредственно перед отрисовкой.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 28.11.2011, 01:03   #3
Muaxaxa
Пользователь
 
Регистрация: 22.10.2011
Сообщений: 19
По умолчанию

Спасибо! х_х
Muaxaxa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Положение точки относительно кривых Безье Александр Кедрик Общие вопросы C/C++ 2 10.08.2011 17:36
Построение кривой безье. faustinus Помощь студентам 1 26.12.2010 18:02
Проблема с поверхностью Безье... Dima6120 Мультимедиа в Delphi 2 13.08.2010 18:12
Кривая Безье ELL Помощь студентам 4 20.05.2008 22:56
Нужен фонт, описанный Безье Oak Помощь студентам 1 30.03.2008 00:10