Угол |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Угол |
Shaienn |
Сообщение
#1
|
Гость |
Здравствуйте программеры...
Подскажите, если кто сталкивался, как реализовать в графической программе правило "Угол падения равен углу отражения"... Вот сижу, думаю, а ничего не идет.. |
Some1 |
Сообщение
#2
|
Новичок Группа: Пользователи Сообщений: 38 Репутация: 0 |
Ну что значит как реализовать задачу ? В каком виде реализовать ? Угол падения чего и куда ?
Если у тебя по условию заданы прямые, то должны быть заданы уравнения прямых. (Той, по которой идёт "луч" и той, от которой отражается)... Сообщение отредактировано: volvo - |
___ALex___ |
Сообщение
#3
|
Бывалый Группа: Пользователи Сообщений: 282 Репутация: 0 |
вот посмотри этот код.
условие задачи: две точки движутся в разных направлениях упруго отражаясь от краёв экрана при этом движется линия их соединяющая. Удачи Код program Lab2; uses Crt, Graph, Dos; type NaprType = (lup, ldown, rup, rdown); var GrDriver, GrMode, ErrCode: Integer; x1, y1, x2, y2: Integer; NaprP1, NaprP2: NaprType; h, m, s, s100, sec: Word; procedure SelectNapr(var Napr1, Napr2: NaprType); begin case Random(4) of 0: Napr1 := lup; 1: Napr1 := ldown; 2: Napr1 := rup; 3: Napr1 := rdown; end; case Random(4) of 0: Napr2 := lup; 1: Napr2 := ldown; 2: Napr2 := rup; 3: Napr2 := rdown; end; if Napr1 = Napr2 then SelectNapr(Napr1, Napr2); end; procedure MovPoint(var x, y: Integer; var Napr: NaprType); begin case Napr of lup : begin x := x - 2; y := y - 1; end; ldown : begin x := x - 2; y := y + 1; end; rup : begin x := x + 2; y := y - 1; end; rdown : begin x := x + 2; y := y + 1; end; end; if x <= 0 then begin case Napr of lup : Napr := rup; ldown: Napr := rdown; end; MovPoint(x, y, Napr); end else if y <= 0 then begin case Napr of lup: Napr := ldown; rup: Napr := rdown; end; MovPoint(x, y, Napr); end else if x >= 639 then begin case Napr of rup : Napr := lup; rdown: Napr := ldown; end; MovPoint(x, y, Napr); end else if y >= 479 then begin case Napr of ldown: Napr := lup; rdown: Napr := rup; end; MovPoint(x, y, Napr); end; end; Begin ClrScr; GrDriver := VGA; GrMode := VGAHi; InitGraph(GrDriver, GrMode, 'C:TPBGI'); ErrCode := GraphResult; if ErrCode <> grOk then begin Write('Ошибка инициализации графики: ', GraphErrorMsg(ErrCode)); repeat until KeyPressed; Halt(0); end; Randomize; x1 := Random(GetMaxX + 1); y1 := Random(GetMaxY + 1); x2 := Random(GetMaxX + 1); y2 := Random(GetMaxY + 1); SelectNapr(NaprP1, NaprP2); GetTime(h, m, s, s100); sec := s; SetColor(Random(GetMaxColor) + 1); SetWriteMode(XorPut); repeat GetTime(h, m, s, s100); if sec <> s then begin sec := s; SetColor(Random(GetMaxColor) + 1); end; Line(x1, y1, x2, y2); Delay(50); Line(x1, y1, x2, y2); MovPoint(x1, y1, NaprP1); MovPoint(x2, y2, NaprP2); until KeyPressed; CloseGraph; End. Сообщение отредактировано: volvo - |
Shaienn |
Сообщение
#4
|
Гость |
Вы меня маленько не поняли...
Задача такая, летит шарик, ударяется о стенку и отражается... Под каким углом ударился, под таким и отражается и летит до другой стенки...и т.д. Всем спасибо |
dark0ut |
Сообщение
#5
|
Пионер Группа: Пользователи Сообщений: 53 Пол: Мужской Репутация: 0 |
Ну это вот так:
здесь даже цвет менять можно Код uses crt,graph; var gd,gm:integer; x,y,r,metod:integer; minx,miny,maxx,maxy:integer; ch:char; zvetm,zvetgr:integer; pause:integer; begin gd:=detect; initGraph(gd,gm,'D:bpbgi'); delay(10000); zvetgr:=1; x:=320; y:=240; metod:=0; minx:=0; miny:=0; maxx:=639; maxy:=479; r:=10; pause:=150; setcolor(zvetgr); line(minx,0,minx,480); line(maxx,0,maxx,480); line(0,miny,640,miny); line(0,maxy,640,maxy); zvetm:=14; while ch<>#27 do begin setcolor(zvetgr); line(minx,0,minx,480); line(maxx,0,maxx,480); line(0,miny,640,miny); line(0,maxy,640,maxy); setcolor(zvetm); circle(x,y,r); delay(pause); setcolor(0); circle(x,y,r); if (metod=0) then begin x:=x+1; y:=y+1; end; if (metod=1) then begin x:=x+1; y:=y-1; end; if (metod=2) then begin x:=x-1; y:=y-1; end; if (metod=3) then begin x:=x-1; y:=y+1; end; if (x<=minx+r+1) and (metod=2) then metod:=1; if (x<=minx+r+1) and (metod=3) then metod:=0; if (x>=maxx-r-1) and (metod=1) then metod:=2; if (x>=maxx-r-1) and (metod=0) then metod:=3; if (y<=miny+r+1) and (metod=1) then metod:=0; if (y<=miny+r+1) and (metod=2) then metod:=3; if (y>=maxy-r-1) and (metod=3) then metod:=2; if (y>=maxy-r-1) and (metod=0) then metod:=1; if keypressed then ch:=readkey; if (ch='+') and (r<230) and ((2*r)<(maxx-minx-5)) and ((2*r)<(maxy-miny-10)) then begin r:=r+5; ch:=#0; end; if (ch='-') and (r>10) and ((2*r)<(maxx-minx)) and ((2*r)<(maxy-miny-10)) then begin r:=r-5; ch:=#0; end; if (ch='a') and ((minx+10)<maxx) and ((2*r)<(maxx-minx-10)) and (minx<640-2*r) and ((x-r)>minx+10) then begin setcolor(0); line(minx,0,minx,480); minx:=minx+10; setcolor(zvetgr); line(minx,0,minx,480); ch:=#0; end; if (ch='d') and ((maxx-10)>minx) and ((2*r)<(maxx-minx-10)) and (maxx>2*r) and ((x+r)<maxx-10) then begin setcolor(0); line(maxx,0,maxx,480); maxx:=maxx-10; setcolor(zvetgr); line(maxx,0,maxx,480); ch:=#0; end; if (ch='w') and ((miny+10)<maxy) and ((2*r)<(maxy-miny-10)) and (miny<480-2*r) and ((y-r)>miny+10) then begin setcolor(0); line(0,miny,640,miny); miny:=miny+10; setcolor(zvetgr); line(0,miny,640,miny); ch:=#0; end; if (ch='x') and ((maxy-10)>miny) and ((2*r)<(maxy-miny-10)) and (maxy>2*r) and ((y+r)<maxy-10) then begin setcolor(0); line(0,maxy,640,maxy); maxy:=maxy-10; setcolor(zvetgr); line(0,maxy,640,maxy); ch:=#0; end; if (ch='8') and (miny>0) then begin setcolor(0); line(0,miny,640,miny); miny:=miny-10; setcolor(zvetgr); line(0,miny,640,miny); ch:=#0; end; if (ch='2') and (maxy<470) then begin setcolor(0); line(0,maxy,640,maxy); maxy:=maxy+10; setcolor(zvetgr); line(0,maxy,640,maxy); ch:=#0; end; if (ch='4') and (minx>0) then begin setcolor(0); line(minx,0,minx,480); minx:=minx-10; setcolor(zvetgr); line(minx,0,minx,480); ch:=#0; end; if (ch='6') and (maxx<630) then begin setcolor(0); line(maxx,0,maxx,480); maxx:=maxx+10; setcolor(zvetgr); line(maxx,0,maxx,480); ch:=#0; end; if (ch=']') and (zvetm<14) then begin zvetm:=zvetm+1; ch:=#0; end; if (ch='[') and (zvetm>1) then begin zvetm:=zvetm-1; ch:=#0; end; if (ch=',') and (pause>10) then begin pause:=pause-10; ch:=#0; end; if (ch='.') and (pause<1000) then begin pause:=pause+10; ch:=#0; end; end; closegraph; end. Сообщение отредактировано: volvo - -------------------- Админ StudCity.RU
|
Some1 |
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 38 Репутация: 0 |
Может ему нужна более математическая выкладка.. не только частный случай, когда угол падения равен 45o, а и при других углах.
Тогда надо читать мой первый пост. У тебя есть две прямые - одна - по какой летит шарик. Другая - об которую он должен удариться. Т.е. фактически прямых у тебя может и не быть. Нужны не прямые а их формулы. Формулу прямой можно найти скажем по двум точкам. (через две точки ведь можно провести прямую). Следовательно, скажем достаточно взять две точки из пути твоего шарика, и по ним вычислить формулу одной прямой. Но лучше вычислить её исходя из коэфициентов, которые ты прибавляешь к координатам шарика. Потом взять две точки поверхности, об которую будет ударяться шарик, и вычислить формулу второй прямой. После этого найти их точку пересечения A(x,y) и угол между ними Alpha. И, наконец, вычислить формулу другой прямой, угол между которой и прямой об которую ударяется шарик будет иметь противоположный знак угла Alpha, и которая тоже будет проходить через точку A(x,y). Исходя из найденой формулы прямой можно будет вычислить коофициенты, которые надо будет прибавлять к координатам шарика, чтобы двигать его по найденой прямой. Если тебе всё это кажется запутанным, я могу разжевать... |
dark0ut |
Сообщение
#7
|
Пионер Группа: Пользователи Сообщений: 53 Пол: Мужской Репутация: 0 |
ты лучше мне разжуй ;D
-------------------- Админ StudCity.RU
|
Ricoshet |
Сообщение
#8
|
Гость |
Короче как сделать отскок: ты задаешь движение не
x:=x+1 а x:=x+j и y:=y+j1 . А потом обрабатываешь условия при касании каждой стенки:при касании боковой стенки меняешь j:=-j а верхней на j1:=-j1. Если че брось сообщение в форум исходник пришлю |
Some1 |
Сообщение
#9
|
Новичок Группа: Пользователи Сообщений: 38 Репутация: 0 |
Ну это тоже частный случай - для отскока от горизонтальновертикальных прямых. От косых такое работать не будет.
|
___ALex___ |
Сообщение
#10
|
Бывалый Группа: Пользователи Сообщений: 282 Репутация: 0 |
чё вы тут фигню какую-то развели?
парню надо было зеркальное отражение)то бишь угол падения равен углу отражения)луч падает при этом на горизонталь(границы экрана) зачем ему отражения от других "поверхностей"?! |
___ALex___ |
Сообщение
#11
|
Бывалый Группа: Пользователи Сообщений: 282 Репутация: 0 |
отражение при падении на горизонать/вертикаль конечно просто в нете пишу и поэтому тороплюсь...
|
Some1 |
Сообщение
#12
|
Новичок Группа: Пользователи Сообщений: 38 Репутация: 0 |
Цитата ...луч падает при этом на горизонталь(границы экрана) Это ты с чего такое взял ? он что, написал так ?зачем ему отражения от других "поверхностей"? Вопрос звучал в общем, я пытаюсь ответить в общем для всех случаев. Ну если от горизонталь/вертикали, то конечно всё просто. Тут я и не спорю З.Ы. Может он пишет нетривиальный арканоид, с отражениями от наклонных поверхностей ? |
Текстовая версия | 15.09.2024 20:01 |