Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[100.28.231.85] |
|
Сообщ.
#1
,
|
|
|
Имеется наклонная плоскость, как по ней спустить изображение? По какой формуле будут меняться координаты? если угол равен 45, тогда просто делаем inc(x) inc(y), а если, н-р, угол равен 30???
|
Сообщ.
#2
,
|
|
|
inc(x) и y := tan(Alfa) * x (только угол не должен быть равен 90 гр)
|
Сообщ.
#3
,
|
|
|
А точно уверен в том как изменяется y? У меня что-то так не очень хочет работать... Если прибавляю Yo, тоже не получается....
|
Сообщ.
#4
,
|
|
|
Забыл y := Trunc(....)
А так алгоритм из школьного курса 4 класс tg = y/x |
Сообщ.
#5
,
|
|
|
To AlexDulub:
Давай уясним кое-что... Вот ты говоришь "спустить изображение" и сам при этом пишешь, что для 45 градусов достаточно inc(x) inc(y)... Почему inc? Если ты берешь не ст.геометрическую систему координат, а например, как принято в комп., где т.(0:0) -- в верхнем левом углу, то тогда, действительно inc(x) inc(y), но тогда укажи откуда ты углы меряешь! 30 градусов -- это как? Если от оси X по часовой стрелке, то Was -- все правильно написал. Если от оси Y против часовой стрелки, то: y = tan(90-Alfa)*x и т.д. Никаких Yo прибавлять не надо! Ты просто высчитываешь координату Y из текущей координаты X. |
Сообщ.
#6
,
|
|
|
2AlexDulub:
еще напомню, что тригонометрические ф-ции в языках програмирования используют радианы AlphaR := (Pi * AlphaG)/180 |
Сообщ.
#7
,
|
|
|
Да это все понятно...
Вот мой кусок кода: RepaintForm(height,ugol); with Form1.Canvas do Begin if Figure=0 then begin xx:=115; yy:=147; for i:=1 to 100 do Begin xx:=xx+1; yy:=trunc(sin(-ugol*pi/180)/cos(-ugol*pi/180)*xx) ; sleep(10); kube[0].X:=trunc((31)*sin(-ugol*pi/180)+1*cos(-ugol*pi/180))+xx; kube[0].Y:=trunc((31)*cos(-ugol*pi/180)-1*sin(-ugol*pi/180))+height-h-yy; kube[1].X:=trunc((1)*sin(-ugol*pi/180)+1*cos(-ugol*pi/180))+xx; kube[1].Y:=trunc((1)*cos(-ugol*pi/180)-1*sin(-ugol*pi/180))+height-h-yy; kube[2].X:=trunc((1)*sin(-ugol*pi/180)+31*cos(-ugol*pi/180))+xx; kube[2].Y:=trunc((1)*cos(-ugol*pi/180)-31*sin(-ugol*pi/180))+height-h-yy; kube[3].X:=trunc((31)*sin(-ugol*pi/180)+31*cos(-ugol*pi/180))+xx; kube[3].Y:=trunc((31)*cos(-ugol*pi/180)-31*sin(-ugol*pi/180))+height-h-yy; kube[4].X:=trunc((31)*sin(-ugol*pi/180)+1*cos(-ugol*pi/180))+xx; kube[4].Y:=trunc((31)*cos(-ugol*pi/180)-1*sin(-ugol*pi/180))+height-h-yy; Polygon(kube); end; end; End; У меня квадрат съезжает под правильным углом, только ниже... Если добавляю Yo, тогда едет более менее по наклонной плоскости, только с другим углом, и при этом еще прыгает на один пиксель... |
Сообщ.
#8
,
|
|
|
Цитата procedure TForm1.Button1Click(Sender: TObject); var i, xx, yy : integer; Ugol : Real; Cube : array [0..3] of TPoint; procedure Prepare_Cube(Side : integer; Alpha : Real); var KC, KS : Double; begin KC := Side * ABS(Cos(Alpha)); KS := Side * ABS(Sin(Alpha)); Cube[0].X := Trunc(KS); Cube[0].Y := 0; Cube[1].X := Trunc(KC + KS); Cube[1].Y := Trunc(KS); Cube[2].X := Trunc(KC); Cube[2].Y := Trunc(KS + KC); Cube[3].X := 0; Cube[3].Y := Trunc(KC); end; function Culc_Y(X : integer; Alpha : Real) : integer; begin Result := Trunc(X * ABS(Sin(Alpha)/Cos(Alpha))); end; procedure PaintCube(ACanvas : TCanvas; X, Y : integer; ACube : array of TPoint); var n : integer; begin n := 0; while n < length(ACube) do begin ACube[n].X := ACube[n].X + X; ACube[n].Y := ACube[n].Y + Y; inc(n); end; ACanvas.Refresh; ACanvas.Brush.Color := clGreen; ACanvas.Polygon(ACube); end; begin Ugol := 20; Prepare_Cube(20, Ugol * Pi/180); xx := 50; yy := 50; for i := 1 to 100 do begin Sleep(10); inc(xx); yy := Culc_Y(xx, Ugol * Pi/180); PaintCube(Canvas, xx, yy, Cube); Application.ProcessMessages; end; end; |
Сообщ.
#9
,
|
|
|
я специально оставил трек.
для затирания предыдущего изображения перед PaintCube надо Refresh; Код на вскидку по быстому, но у меня работает |