Собственно написал вот такую программу. Шарик движется линейно между точками (x[i],y[i])..
Uses Graph,Crt,My;
Const N=10;
Type
TPoint=record
x:real;
y:real;
end;
p=array[1..N] of TPoint;
Var
Dot:p;
output:text;
i:integer;
x,y:real;
procedure draw;
Var a,b,c:real;
begin
Init_graph;
for i:=1 to N do
PutPixel(round(Dot[i].x),round(Dot[i].y),red);{отмечает маршрут}
{дальше собственно "анимация"..}
for i:=1 to N-1 do
begin
x:=Dot[i].x;
if Dot[i].x<Dot[i+1].x then
begin
repeat
x:=x+1;
a:=x*Dot[i+1].y-x*Dot[i].y-Dot[i].x*Dot[i+1].y+Dot[i].x*Dot[i].y;
b:=Dot[i+1].x*Dot[i].y-Dot[i].x*Dot[i].y;
c:=Dot[i+1].x-Dot[i].x;
y:=(a+b)/c;
Drawcircle(round(x),round(y),green);
delay(2600);
Drawcircle(round(x),round(y),white);
until x>=Dot[i+1].x;
end
else
begin
repeat
x:=x-1;
a:=x*Dot[i+1].y-x*Dot[i].y-Dot[i].x*Dot[i+1].y+Dot[i].x*Dot[i].y;
b:=Dot[i+1].x*Dot[i].y-Dot[i].x*Dot[i].y;
c:=Dot[i+1].x-Dot[i].x;
y:=(a+b)/c;
Drawcircle(round(x),round(y),green);
delay(2600);
Drawcircle(round(x),round(y),white);
until x<=Dot[i+1].x;
end;
end;
readkey;
end;
{main program}
BEGIN
clrscr;
randomize;
{вводим координаты точек}
for i:=1 to N do
begin
Dot[i].x:=round(random(640));
Dot[i].y:=round(random(480));
end;
draw;
END.
http://forum.pascal.net.ru/index.php?showtopic=2706 прочитал как решать товю задачу?
Будем разбиратся..Спасибо
Просмотрите...правильно ли я всё сделал? (программа работает конечно)
Извини, а можно присоеденить модуль My? А то знаешь,компилятор то не волшебник..
xlr8, динамический список где? Массив вижу, списка здесь нет...
Вот модуль My..но он совсем не суть..
volvo, задание прийдется уточнить ...Ну а если с динам. масивом - это правильно (ну тоесть дин. масив так строится)?
И динамического массива здесь тоже нет... Понимаешь, динамический массив - это когда ты при запуске программы не знаешь его размера, и только в RunTime становится известен размер, который тебе необходим, и инициализируется массив нужного размера. А у тебя все известно - массив статический (место-то под сам массив выделяется еще на этапе компиляции). То, что сами элементы хранятся в "куче" - ничего не значит... Массив от этого не становится динамическим в полном смысле этого слова...
А задание все-таки уточни, и подкорректируй название темы соответственно, а то в названии написано одно, а ты говоришь что это - несущественно...
Вопрос: обязательно использовать массивы,
файлы, динамическме списки?
Можешь уточнить задание?
Если точки все равно задаются рандомно,
или шире-произвольно, то обязателен ли их список?
Есть один экспериментальный код, где шарик
отражается от стенок, но и сам может менять свое направление.
Выкладывается под ТВОЮ полную ответственность /Шутка /.
Задачу нужно решить применив двунаправленый список (этих самых координат)..
Если кто знает - подскажите как?
Заранее спасибо
Вот набросок:
uses crt, graph;Единственное, что надо еще сделать - это принять меры против того, что изображение точки "размывается" при проходе над ней шарика... Это просто, попробуй догадаться сам...
type
plist = ^tlist;
tlist = record
X, Y: integer;
prev, next: plist;
end;
const
R = 5;
step = 20; { <--- Можешь поиграться с этим }
var
head, tail: plist;
{
append new item to the end of list
}
procedure append_list(x, y: integer);
var p: plist;
begin
p := new(plist);
p^.x := x; p^.y := y;
p^.next := nil;
p^.prev := tail;
if head = nil then head := p
else tail^.next := p;
tail := p;
setfillstyle(solidfill, red);
fillellipse(p^.x, p^.y, R, R);
end;
var
gd, gm: integer;
i: integer;
p: plist;
cx, cy, DX, DY: real;
begin
initgraph(gd, gm, '');
setcolor(white);
head := nil; tail := nil;
for i := 1 to 10 do begin
append_list(random(getmaxx), random(getmaxy));
end;
setcolor(lightgreen);
cx := 0; cy := 0;
p := head;
while p <> nil do begin
DX := (p^.x - cx) / step;
DY := (p^.y - cy) / step;
for i := 1 to step do begin
setcolor(black);
circle(trunc(cx), trunc(cy), R);
cx := cx + DX; cy := cy + DY;
setcolor(lightgreen);
circle(trunc(cx), trunc(cy), R);
delay(25); { <--- Измени на бОльшее значение }
end;
p := p^.next;
end;
readln;
closegraph;
end.
Спасибо огромное!
procedure delete_elem(i:byte);
var
nav,p1,p2:plist;
search:boolean;
c:byte;
begin
search:=false;
c:=0;
p:=head;
while p^.next<>NIL do
begin
if c=i then
begin
search:=true;
break;
end;
p:=p^.next;
inc©;
end;
if search then
begin
writeln('Remove elem #',c,' (',p^.x,',',p^.y,')');
nav:=p;
p^.prev:=nav^.prev;
p^.next:=nav^.next;
dispose(nav);
nav:=nil;
end
else writeln('No result of search')
end;
nav:=p^.next;
p^.prev:=nav^.prev;
p^.next:=nav^.next;
dispose(nav);
nav:=nil;
nav:=p;
p^.prev:=nav^.prev;
p^.next:=nav^.next;
dispose(nav);
p^.prev:=p^.prev;
p^.next:=p^.next;
dispose(p);
nav:=p;
if p^.prev <> nil then p^.prev^.next := nav^.next;
if p^.next <> nil then p^.next^.prev := nav^.prev;
dispose(nav);