На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Математика и графика
    Имеется наклонная плоскость, как по ней спустить изображение? По какой формуле будут меняться координаты? если угол равен 45, тогда просто делаем inc(x) inc(y), а если, н-р, угол равен 30???
      inc(x) и  y := tan(Alfa) * x (только угол не должен быть равен 90 гр)
        А точно уверен в том как изменяется y? У меня что-то так не очень  хочет работать... Если прибавляю Yo, тоже не получается....
          Забыл y := Trunc(....)
          А так алгоритм из школьного курса 4 класс tg = y/x
            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.
              2AlexDulub:
              еще напомню, что тригонометрические ф-ции в языках програмирования используют радианы AlphaR := (Pi * AlphaG)/180
                :) Да это все понятно...
                Вот мой кусок кода:

                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, тогда едет более менее по наклонной плоскости, только с другим углом, и при этом еще прыгает на один пиксель...
                  Цитата


                  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;


                    я специально оставил трек.
                    для затирания предыдущего изображения перед PaintCube надо Refresh;
                    Код на вскидку по быстому, но у меня работает
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0522 ]   [ 15 queries used ]   [ Generated: 4.03.24, 07:28 GMT ]