Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2010, 13:12   #1
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
По умолчанию вращение отрезка в дельфи

Привет всем.

Изучаю графику в Делфи. Пытаюсь сделать вращене отрезка.
Сделать хочу так, чтобы изображение выводилось на компонент PaintBox, и будет одна кнопка, при нажатии на нее, должно появиться изображение вращающегося отрезка.
В общем, в книжке дан алгоритм, но нет примера, чтобы посмотреть, как это сделать.
Ну вот в книжке такие рекомендации:

Цитата:
Перерисовку изображений производить в обработчике OnTimer с использованием однородных координат и матриц переноса и поворота.
Включить в программу типы Vector, Matrix и процедуры умножения вектора на матрицу и матрицы на матрицу.
Алгоритм вывода отрезка:
1. Закрасить текущее изображение цветом фона.
2. Повернуть объект на малый угол Dj (умножить векторы однородных координат концов отрезка на композицию матриц переноса и поворота).
3. Вывести изображение объекта в новом положении
Я тут запуталась со всем этим.
Может есть у кого-то пример-исходник такой программы.
diliana вне форума Ответить с цитированием
Старый 13.03.2010, 16:21   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Ну, вот так получилось. В колледже вращали еще и через центр, но уже не помню как. У таймера интервал "1".
Код:
  private
    XCenter, YCenter: Integer;
    Rnd: Real;
    { Private declarations }
  end;

const
  Len = 100;

procedure TForm1.Button1Click(Sender: TObject);
begin
  XCenter := Round(PaintBox1.Width / 2);
  YCenter := Round(PaintBox1.Height / 2);
  PaintBox1.Canvas.Brush.Color := clWhite;
  PaintBox1.Canvas.FillRect(Rect(0, 0, 353, 353));
  Rnd := 0.0;
  Timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  XTo, YTo: Integer;
begin
  XTo := Round(Sin(Rnd)*Len);
  YTo := Round(Cos(Rnd)*Len);
  PaintBox1.Canvas.MoveTo(XCenter, YCenter);
  PaintBox1.Canvas.Pen.Color := clWhite;
  PaintBox1.Canvas.LineTo(XTo + XCenter, YTo + YCenter);

  Rnd := Rnd + 0.01;

  XTo := Round(Sin(Rnd)*Len);
  YTo := Round(Cos(Rnd)*Len);
  PaintBox1.Canvas.MoveTo(XCenter, YCenter);
  PaintBox1.Canvas.Pen.Color := clBlack;
  PaintBox1.Canvas.LineTo(XTo + XCenter, YTo + Ycenter);
end;
psycho-coder вне форума Ответить с цитированием
Старый 13.03.2010, 18:34   #3
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
По умолчанию

psycho-coder

спасибо за ответ, но к сожалению не все так просто...

вот видите
Цитата:
Включить в программу типы Vector, Matrix и процедуры умножения вектора на матрицу и матрицы на матрицу.
то есть точки задаются 3 координатами (т.е. в пространстве) - x, y, z

то есть следует предварительно обьявлять типы Vector, Matrix
очевидно, вот так
Код:
vector = array [1..3,1..3] of real;
matrix = array [1..3,1..3] of real;
может у кого-нибудь найдется пример такой программы?
diliana вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
пересечение отрезка с треуголником korolvit Фриланс 8 02.03.2010 08:58
Найдите длину наибольшего отрезка cosa nostra Помощь студентам 2 07.01.2010 19:38
Метод деления отрезка пополам Delphi lordve Помощь студентам 0 06.12.2009 23:57
3 отрезка и 3 треугольника Айдар Помощь студентам 8 10.09.2009 22:45
Движение окружности и отрезка. Ev@ngel Компоненты Delphi 0 18.04.2008 22:16