Как реализовать точку, движущуюся в заданном прямоугольнике(rectangle(x1,y1,x2,y2) ), чтобы она отскакивала от краев? Начинает движение под углом A.
Что непонятно, алгоритм отражения? Угол падения равен углу отражения (они рядом лежат через перпендикуляр к отражающей поверхности)
дворд он не про это, это он курсач пишет, сто пудов))) я по такой же теме в том году писал. чувак, у те должна быть методичка смори как реализовывать граф. а так те нужно к математикам обращаться, уравнение получить
>>движущуюся в заданном прямоугольнике(rectangle(x1,y1,x2,y2) ) при ударе об боковые стенки координата х меняется на противоположную, при ударе об нижнюю или верхнюю стенку y. >>дворд он не про это, это он курсач пишет, сто пудов))) я по такой же теме в том >>году писал. чувак, у те должна быть методичка смори как реализовывать граф. а так >>те нужно к математикам обращаться, уравнение получить а при чем тут графы?
ГЫ. Херасебе курсовые... у меня на первом курсе надо было написать язык прогграммирования, со сходными паскалю командами - тоесть полностью поддержка ООП, обращение к памяти... пришлось пас выучить досконально. На самом деле все действительно очень просто - выводишь уравнение движения(по х и по у), и потом выделяя целую часть из каждой координыты строишь точку. уравнения можно взять из линейной алгебры, если незнаешь как )))
Lexx, расскажи пожалуйста что у тебя за институт и факультет. Если стесняешься, можно в приватные сообщения.
У меня Белорусский государственный университет, факультет радиофизики и электроники. Специальность компьютерная безопасность. Кстати если есть желание - где то на bsu.by можно скачать электронные конспекты почти по всем предметам - линейная алгебра - 1 курс Березкина Л.Л. там ооочень хорошо распиана вся линейка и аналитическая геометрия.
Спасибо мне на самом деле было бы очень интересно почитать официальный сайт, если на нем размещены курсы учебных планов например и какие-то конспекты
Слово означает название модуля, позволяющего формировать изображения.. Ну в идеале я ожидал хотя бы пару строк кода.. А тема ушла в обсуждение "какой я крутой, а ты лох". То что угол падения равен углу отражения это я и так знаю("от старшего брата"), пишу я не курсовую. Спасибо за напоминание. Спасибо за ответы.
угу с графом на первом курсе в своё время веселились(хотя задание веселое попалось, реализовать посадку спутника на планету, увеличивая уменьшая тягу), ну это поофтопил чутка... я раньше на с+ писал подобное, но доделланый код затерялся. С точкой сделать проще, чем с кругом. Как и написал ZaCo, меняешь x и y на противоположный.Например есть шаги dx и dy, вначале они равны по 1, при достигании максимому по например x2-1(так как точка будет иметь радиус=1), меняем dx=-1,это если по прямой летает, если под углом, то и соответствующий dy. Только в таком случае, фигурка летает под углом 45 градусов, а для разноообразного начала движения, использовал рандомное значения dx и dy (-1 или 1 для каждого)
G1yuK ответил наиболее правильно. Просто определяешь dx и dy dx:=sin(угол)*скорость; dy:=cos(угол)*скорость; а потом в цикле прибавляешь их к x и y x:=x+dx; y:=y+dy; if ((x<rect.left) or (x>rect.right)) then dx:=-dx; if ((y<rect.top) or (y>rect.bottom)) then dy:=-dy; и перерисовываешь точку That's it!
Ну вот что-то написал, может кто-нибудь поможет дописать? Очень надо =( Code: uses crt,graph; var q,p,err,det,dm,x1,y1,x2,y2,i:integer; function point(c,d:integer):integer; begin putpixel(c,d,2); delay(10000); putpixel(c,d,0); end; function lie(c,d,e,f:integer):integer; begin for i:=c to d do begin delay(1000); setcolor(5); LineTo(i,d); delay(500); setcolor(15); LineTo(i+5,d); end; for i:=d to f do begin delay(1000); setcolor(5); LineTo(e,i); delay(500); setcolor(15); LineTo(e,i+5); end; for i:=e downto c do begin delay(1000); setcolor(5); LineTo(i,f); delay(500); setcolor(15); LineTo(i-5,f); end; for i:=f downto d do begin delay(1000); setcolor(5); LineTo(c,i); delay(500); setcolor(15); LineTo(c,i-5); end; end; begin det:=detect; initgraph(det,dm,'c:\coding\bp\bgi\'); err:=graphresult; if err<>grOk then writeln(grapherrormsg(err)); readln(x1,y1,x2,y2); rectangle(x1,y1,x2,y2); {вычисление приращений для отскока} p:=x1; q:=y1; repeat p:=p+1; q:=q+2; point(p,q); if p>=x2 then p:=p-2; if q>=y2 then q:=q-4; lie(x1,y1,x2,y2); until keypressed; readkey; closegraph; end.
вот этот кусок кода Code: det:=detect; initgraph(det,dm,'c:\coding\bp\bgi\'); err:=graphresult; if err<>grOk then writeln(grapherrormsg(err)); помести после readln( у тебя включается графика, а в ней readln не работает и не может считать данные), а лучше все эти 4 координаты прямоугольника сделай константами. Легче потом в коде разбираться. Это пока явные ошибки. Ещё ты писал что точка начинает двигаться под углом А. Но у тебя нигде нет ввода угла А. Так же немного не ясно, зачем функция lie. Она вроде как рисует прямоугольник вручную?
Для угла 45гр добавь две переменные vx,vy:integer; Code: {вычисление приращений для отскока} p:=x1; vx:=+1; q:=y1; vy:=+1; repeat if ((p+vx)<x2) and ((p+vx)>x1) then p:=p+vx else if vx>0 then vx:=-1 else vx:=+1; if ((q+vy)<y2) and ((q+vy)>y1) then q:=q+vy else if vy>0 then vy:=-1 else vy:=+1; point(p,q); lie(x1,y1,x2,y2); until keypressed; Паскалей нет проверить не могу
У меня все работает, данные readln считывает. На угол мне уже пофик, лишбы двигалась точка, хотя, конечно, и угол не помешал бы. http://forum.antichat.ru/showpost.php?p=487880&postcount=61 Xserg с п а с и б о!) Переделал вот так: Code: p:=x1; vx:=trunc(sin(a))+3; q:=y1; vy:=trunc(cos(a))+3; repeat if ((p+vx)<x2) and ((p+vx)>x1) then p:=p+vx else if vx>0 then vx:=-3 else vx:=+3; if ((q+vy)<y2) and ((q+vy)>y1) then q:=q+vy else if vy>0 then vy:=-3 else vy:=+3; point(p,q); lie(x1,y1,x2,y2); until keypressed; Хм.. теперь осталось вычислить соприкасается ли Удав и точка...
Так, как я уже писал, остается вычислить соприкасается ли Удав и точка... Чтобы мне сравнить координаты точки(он же зайчек) и удава, мне нужно чтобы ф-я возвращала в программу параметры? Правильно я написал? Что-то нет у меня радостного сообщения на экране "congrats!" Code: uses crt,graph; var vx,vy,q,p,err,det,dm,x1,y1,x2,y2,i,a:integer; function point(k,l:integer):integer; begin putpixel(k,l,2); delay(9000); putpixel(k,l,0); end; [B]procedure lie(var c,d,e,f:integer);[/B] begin for i:=c to d do begin delay(1000); setcolor(5); LineTo(i,d); delay(500); setcolor(15); LineTo(i+5,d); end; for i:=d to f do begin delay(1000); setcolor(5); LineTo(e,i); delay(500); setcolor(15); LineTo(e,i+5); end; for i:=e downto c do begin delay(1000); setcolor(5); LineTo(i,f); delay(500); setcolor(15); LineTo(i-5,f); end; for i:=f downto d do begin delay(1000); setcolor(5); LineTo(c,i); delay(500); setcolor(15); LineTo(c,i-5); end; end; begin det:=detect; initgraph(det,dm,'e:\bp\bgi\'); err:=graphresult; if err<>grOk then writeln(grapherrormsg(err)); readln(x1,y1,x2,y2,a); rectangle(x1,y1,x2,y2); {вычисление приращений для отскока} p:=x1; vx:=round(sin(a)+3); q:=y1; vy:=round(cos(a)+3); repeat if ((p+vx)<=x2) and ((p+vx)>=x1) then p:=p+vx else if vx>=0 then vx:=-3 else vx:=+3; if ((q+vy)<=y2) and ((q+vy)>=y1) then q:=q+vy else if vy>=0 then vy:=-3 else vy:=+3; point(p,q); lie(x1,y1,x2,y2); [B]if ( (p=x1) or (p=x2) ) and ( (q=y1) or (q=y2) ) then[/B] begin setcolor(10); settextstyle(3,0,8); outtextxy(150,200,'CONGRATS! [B]Udav[/B] fucked the rabbit! '); end; until keypressed; readkey; closegraph; end.
Code: if (k=1) then begin clrscr; setcolor(10); settextstyle(3,0,8); outtextxy(150,200,'CONGRATS! Udav fucked the rabbit! '); delay(1000); end; немного код переписать и поставить после слов until ((keypressed) or (k=1)) и в самом начале программы k:=0; . А на место того кода при выполнении условия k:=1; У тебя даже если зайчика поймали, он продолжит рисовать поверх надписи о победе. Так же тебе надо синхронизировать передвижение зайца и удава. А то у тебя удав делает полный круг и заяц делает ход. Может хотя бы разбить те 4 цикла на 4 функции. Передвижение по нижней планке ,левой правой, верхней. И вызывать по определённому условию