Консультация № 188868
01.03.2016, 19:11
0.00 руб.
01.03.2016, 20:02
0 7 1
Здравствуйте! Прошу помощи в следующем вопросе:

Я написала программу на Pascal моделирования динамической системы, но она работает не полностью. Шарики выводятся, но не хотят двигаться( Не могу понять в чем ошибка... Помогите пожалуйста!!!
[code lang=pascal h=200]program Laba1_ISM;

uses
crt, graphABC;
// для отрисовки
const
sizey = 700;

const
sizex = 700;

const
r = 7;

const
size = 3;

const
v = 1;

const
k = 0.01;

const
tim = 1;

type
obj = record
m, Xo, Yo, Vo, vx, vy, Alo, dx, dy: real;
end;

var
i, j, N, Nx, Ny, l: integer;
dt, time: real;
f: file of integer;
t: text;
ob: array[1..10] of obj;
ob2: array[1..10] of obj;

function dlin(i, j: integer): real;
begin
dlin := sqrt(sqr(ob[i].xo - ob[j].xo) + sqr(ob[i].yo - ob[j].yo));
end;

function FN(i, j: integer): real;
begin
fn := abs(ob[i].m * ob[j].m) / sqr(dlin(i, j));
end;

function radian(i: real): real;
begin
radian := i * pi / 180;
end;

procedure dist;
var
i, j: integer;
alp, atx, aty, ftx, fty, fij, fx, fy, cosx, sinx: real;
a_x, a_y: real;
begin
for i := 1 to n do
begin
ob[i].xo := ob[i].dx;
ob[i].yo := ob[i].dy;
end;
if(n = 1) then
begin
ob[n].dx := ob[n].xo + ob[n].vx * dt;
ob[n].dy := ob[n].yo + ob[n].vy * dt;
end;
for i := 1 to n do
begin
fx := 0;
fy := 0;
for j := 1 to n do
if(i <> j) then
begin
sinx := (ob[j].yo - ob[i].yo) / dlin(i, j);
cosx := (ob[j].xo - ob[i].xo) / dlin(i, j);
fij := Fn(i, j);
ftx := fij * cosx;
fty := fij * sinx;
fx := fx + ftx;
fy := fy + fty;
end;

a_x := fx / ob[i].m;
a_y := fy / ob[i].m;

ob[i].dx := ob[i].xo + ob[i].vx * dt + a_x * sqr(dt) * 0.5;
ob[i].dy := ob[i].yo + ob[i].vy * dt + a_y * sqr(dt) * 0.5;

ob[i].vx := ob[i].vx + a_x * dt;
ob[i].vy := ob[i].vy + a_y * dt;

end;
end;

procedure inct;
var
i:integer;
tx: text;
begin
ASSIGN(tx, 'd:\Copybook\папка ИСМ1\Laba1ISM\input.dat');
reset(tx);
readln(tx, N);
readln(tx, dt);
readln(tx);
for i := 1 to N do
begin
readln(tx, ob[i].m, ob[i].xo, ob[i].yo, ob[i].vo, ob[i].alo);
ob[i].dx := ob[i].xo+6;
ob[i].dy := ob[i].yo;
ob[i].vx := ob[i].vo * cos(radian(ob[i].alo));
ob[i].vy := ob[i].vo * sin(radian(ob[i].alo));
end;
close(tx);
dt := v * dt;
end;

procedure window;
begin
SetWindowCaption('ИиСМ, Лабораторная работа 1');
SetWindowSize(SizeY, SizeX);
Nx := SizeX div 2;
Ny := SizeY div 2;
end;

procedure zaryad(i, q: integer);
begin
if(q = 0) then
begin
SetPenStyle(psClear);
circle(round(ob[i].xo * size) + Nx, round(-ob[i].yo * size) + Ny, (r + 2));
end
else circle(round(ob[i].dx * size) + Nx, round(-ob[i].dy * size) + Ny, r);
SetPenStyle(psSolid);
end;

procedure osi;
begin
SetPenColor(clgreen);
Line(Nx, 10, Nx, SizeY - 10);
Line(10, Ny, SizeX - 10, Ny);
Line(SizeX - 20, Ny - 5, SizeX - 10, Ny);
Line(SizeX - 20, Ny + 5, SizeX - 10, Ny);
Line(Nx - 5, 20, Nx, 10);
Line(Nx + 5, 20, Nx, 10);
end;

begin
window;
inct;
for i := 1 to n do zaryad(i, 1);
// osi;
readkey;
while(not keypressed ) do
begin
for i := 1 to n do zaryad(i, 1);
dist;
osi;
//Delay(tim);
for i := 1 to n do zaryad(i, 0);
end;
for i := 1 to n do zaryad(i, 1);
end.
[/code]

Обсуждение

давно
Мастер-Эксперт
17387
18345
01.03.2016, 20:03
общий
Прошу обратить внимание на эту консультацию, перенесённую из другого раздела.
Об авторе:
Facta loquuntur.
давно
Посетитель
7438
7205
01.03.2016, 21:17
общий
Адресаты:
Неплохо бы привести файл
d:\Copybook\папка ИСМ1\Laba1ISM\input.dat
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399586
1
01.03.2016, 22:05
общий
Да, конечно, извините...
В файле следующие данные:
4
2
3 10 0 20 0
120000 30 -10 160 90
30000 45 10 90 100
1 100 100 100 90
1 -100 -100 100 -90
давно
Старший Модератор
31795
6196
02.03.2016, 12:31
общий
02.03.2016, 13:00
Адресаты:
Вы уверенны, что формулы правильные?

[table]
[row][col] 30.00[/col][col] -10.00[/col][/row]
[row][col] 51.00[/col][col] 10.00[/col][/row]
[row][col] 95.61[/col][col] 283.49[/col][/row]
[row][col] -66.64[/col][col] -478.80[/col][/row]
[row][col][/col][col][/col][/row]
[row][col] 323.72[/col][col] 1333.54[/col][/row]
[row][col] -1684.90[/col][col] -1428.15[/col][/row]
[row][col] 11.29[/col][col] 1115.52[/col][/row]
[row][col] 1.87[/col][col] -1213.04[/col][/row]
[row][col][/col][col][/col][/row]
[row][col] 783.68[/col][col] 3226.55[/col][/row]
[row][col] -3649.70[/col][col] -3171.05[/col][/row]
[row][col] -69.99[/col][col] 1979.04[/col][/row]
[row][col] 70.01[/col][col] -1946.64[/col][/row]
[row][col][/col][col][/col][/row]
[row][col] 1243.60[/col][col] 5119.51[/col][/row]
[row][col] -5614.40[/col][col] -4913.81[/col][/row]
[row][col] -150.56[/col][col] 2844.04[/col][/row]
[row][col] 138.10[/col][col] -2680.07[/col][/row]
[row][col][/col][col][/col][/row]
[row][col] 1703.52[/col][col] 7012.45[/col][/row]
[row][col] -7579.08[/col][col] -6656.52[/col][/row]
[row][col] -230.83[/col][col] 3709.62[/col][/row]
[row][col] 206.16[/col][col] -3413.41[/col][/row]
[row][col][/col][col][/col][/row]
[row][col] 2163.42[/col][col] 8905.39[/col][/row]
[row][col] -9543.74[/col][col] -8399.21[/col][/row]
[row][col] -310.95[/col][col] 4575.53[/col][/row]
[row][col] 274.22[/col][col] -4146.71[/col][/row]
[row][col][/col][col][/col][/row]
[row][col] 2623.33[/col][col] 10798.33[/col][/row]
[row][col] -11508.38[/col][col] -10141.89[/col][/row]
[row][col] -390.96[/col][col] 5441.64[/col][/row]
[row][col] 342.27[/col][col] -4879.97[/col][/row]
[/table]
Обратите внимание на порядок чисел, много больше чем заявленные сайзы: sizey = 700; sizex = 700;
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
02.03.2016, 12:49
общий
Адресаты:
Убрав стирание и поделив координаты на 500 получил картинку
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
02.03.2016, 13:15
общий
Адресаты:
Не могли бы Вы дать методичку, в которой расписаны все используемые формулы?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
04.03.2016, 22:50
общий
это ответ
Здравствуйте, Малышка!

Цитата: Малышка
Шарики выводятся, но не хотят двигаться(

Шарики двигаются, только при сдедующем шаге они выходят за пределы отображаемой области и Вы их не видете.
Чтобы это проверить я делил расчитаные значения на 500(маштабировал), и увеличивал задержку.

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа