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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2011, 00:36   #1
pastuhdima
Немного нуб
Пользователь
 
Аватар для pastuhdima
 
Регистрация: 01.10.2011
Сообщений: 41
Печаль Не правильно исчисляются координаты.

Есть программа в которой рэндомно создаются точки в границе формы. После чего точки должны взаимодействовать друг с другом и притягиваться. Написал вродебы все правильно. Но точек не видно вообще.
Код:
unit BBT;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Menus, math;

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    Timer1: TTimer;
    N4: TMenuItem;
    N5: TMenuItem;
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure N4Click(Sender: TObject);
  end;

const n=1; m=100;
var
  Form1: TForm1;
  x,y,vx,vy,mass,dx,dy,dvx,dvy:array[n..m] of real;
  i,j,g:integer;
  sumax1,sumax2,sumay1,sumay2:real;

implementation


{$R *.dfm}
procedure TForm1.N1Click(Sender: TObject);
begin
paintbox1.canvas.Brush.Color:=clBlack;
paintbox1.canvas.FillRect(paintbox1 .canvas.ClipRect);
  if g<>1 then for i := n to m do
    begin
      x[i]:=randomrange(0,clientwidth);
      y[i]:=randomrange(0,clientheight);
      mass[i]:=randomrange(1,10);
      vx[i]:=0;
      vy[i]:=0;
      g:=1;
    end;
  for i := n to m do
    begin
      dx[i]:=x[i];
      dy[i]:=y[i];
      dvx[i]:=vx[i];
      dvy[i]:=vy[i];
    end;
  for i := n to m do
    begin
      sumax1:=0;
      sumax2:=0;
      sumay1:=0;
      sumax2:=0;
      for j := n to i-1 do
        begin
          sumax1:=sumax1+mass[j]*(dx[i]+dx[j])/sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]))*sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]))*sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]));
          sumay1:=sumay1+mass[j]*(dy[i]+dy[j])/sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]))*sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]))*sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]));
        end;
      for j := i+1 to m do
        begin
          sumax2:=sumax2+mass[j]*(dx[i]+dx[j])/sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]))*sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]))*sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]));
          sumay2:=sumay2+mass[j]*(dy[i]+dy[j])/sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]))*sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]))*sqrt(sqr(dx[i]-dx[j])+sqr(dy[i]-dy[j]));
        end;
      vx[i]:=dvx[i]+sumax1+sumax2;
      vy[i]:=dvy[i]+sumay1+sumay2;
      x[i]:=dx[i]+vx[i];
      y[i]:=dy[i]+vy[i];
    end;
  for i := n to m do
    begin
      paintbox1.Canvas.Pixels[round(x[i]),round(y[i])]:=clwhite;
    end;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
timer1.enabled:=true;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
timer1.enabled:=false;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
paintbox1.canvas.Brush.Color:=clBlack;
paintbox1.canvas.FillRect(paintbox1 .canvas.ClipRect);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
N1Click(Sender);
end;

end.
pastuhdima вне форума Ответить с цитированием
Старый 17.11.2011, 11:06   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

засунул ваш код в проект.
прогнал.
получил ошибку переполнения..
смотрите, в формулах, где Вы вычисляете summaX, summaY

например, после заполнения случайным образом X и Y
после выполнения цикла подсчёта
sumax1 равна 100782561.71
sumay1 равна 73278878.512
и, т.к.
vx[i]:=dvx[i]+sumax1+sumax2;
x[i]:=dx[i]+vx[i];
то x[1] стало равным 101347597.14
x[2] = 97114360.093
и т.д.

И где именно Вы хотите увидеть эти точки?!!


____________

p.s. а ещё Вы делаете ошибку использования генератора случайных чисел.
Его обязательно нужно иницилизировать перед использованием.
Выполняется это вызовом процедуры Randomize;

Последний раз редактировалось Serge_Bliznykov; 17.11.2011 в 11:10.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.11.2011, 16:09   #3
pastuhdima
Немного нуб
Пользователь
 
Аватар для pastuhdima
 
Регистрация: 01.10.2011
Сообщений: 41
По умолчанию

я хотел увидеть на экране... Я кажется понял что надо поменять, извините что побеспокоил
pastuhdima вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ координаты shedi Помощь студентам 3 06.03.2011 13:28
Не правильно (или правильно?) работает позиционирование в WebKit mutabor HTML и CSS 5 09.12.2010 09:54
Как правильно получить координаты по клику на ячейку таблицы? Stilet JavaScript, Ajax 3 26.08.2009 16:19
координаты Aram Общие вопросы C/C++ 5 08.06.2007 20:03