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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2010, 16:07   #1
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию Колесо почему-то не крутится....ошибка в анимации.

Приветствую программистов ))
я вроде бы реализовал вращение колеса, но оно не вращается. вот код-
Код:
procedure TForm1.Button1Click(Sender: TObject);
var q,a,b,x0,y0,m,n,dx,dy,f,i:integer;
  horda: real;
  mv: array [0..7,0..1] of integer;
begin
  Canvas.Brush.Style := bsClear;
  m:=1;
  f:=0;
 while m>0 do
  begin
    self.Repaint;
    canvas.Pen.Width:= 15;
    form1.canvas.Ellipse(150,150,250,250);
    form1.canvas.Ellipse(195,195,205,205);
    canvas.Pen.Width:= 7;
    form1.Canvas.MoveTo(200,200);
    q:=0;
    for i := 0 to 7 do
    {присваиваем концам спиц ,
     которые прилегают к ободу колеса
     ,учитывая смещение ,новые координаты}
    begin
      mv[i,0]:=Round(50*cos(q+f))+200;
      mv[i,1]:=Round(50*sin(q+f))+200;
      q:=q+round(45*pi/180);
    end;
    f:=f+round(10*pi/180);  // увеличиваем угол смещения спиц на 10 градусов
    if f>=360 then  f:=0;
    for i:= 0 to 7 do
    begin
      form1.Canvas.MoveTo(200,200);
      form1.Canvas.LineTo(mv[i,0],mv[i,1]); // рисуем спицы и рычаг.
      if i=0 then
      begin
        canvas.Pen.Width:= 10;
        form1.Canvas.MoveTo(mv[i,0],mv[i,1]);
        form1.Canvas.LineTo(mv[i,0]-200,mv[i,1]);
        form1.canvas.Ellipse(mv[i,0]-3,mv[i,1]-3,mv[i,0]+3,mv[i,1]+3);
        canvas.Pen.Width:= 7;
      end;
    end;
    Sleep(1000);   // задержка
  end;


end;
Там несколько проблем, которые я не знаю как решить-
1) Расстояние между спицами почему-то не равно 45 градусам.
2) Не знаю как корректно завершить цикл
и Самое главное - несмотря на то, что я переопределяю величину смещения f , колесо не вращается!
Если кто знает в чём ошибка- подскажите, пожалуйста.
Вложения
Тип файла: zip Колесо паровоза.zip (79.6 Кб, 28 просмотров)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 08.06.2010, 17:39   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Для начала реализуй движение точки по кругу, а там глядишь разберешься как колесо вращать. Или за тебя еще и отлаживать код?

p.s. Угол должен быть в радианах.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 08.06.2010 в 17:42.
mutabor вне форума Ответить с цитированием
Старый 08.06.2010, 17:41   #3
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

по кругу движится.....точнее должно.
вот ведь здесь есть смещение, которое увеличивается
Код:
 mv[i,0]:=Round(50*cos(q+f))+200;
q при каждом проходе внешнего цикла изменяется на одну и ту же величину, а вот f- наращивается, пока не станет равно 360 .
Код:
 if f>=360 then  f:=0;
(это чтобы выход за диапазон integer не произошёл)
вроде как каждый раз точка смещается на 10 градусов-
Код:
 f:=f+round(10*pi/180);
-------------------------------------------------------------------------------
Цитата:
p.s. Угол должен быть в радианах.
а это ? -
Код:
round(10*pi/180)
не радианы? (вроде как 10 градусов перевожу в радианы).
Попробую ещё раз с точкой.
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось vedro-compota; 08.06.2010 в 17:50.
vedro-compota вне форума Ответить с цитированием
Старый 08.06.2010, 17:47   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Вот как строить эллипс, этот код можно легко переделать в движение точки по эллипсу, а там уже остальные палки пририсовать не проблема
http://www.programmersforum.ru/showp...4&postcount=19
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 08.06.2010, 18:08   #5
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Всем кто зайдёт на этот славный форум завтра, через неделю и через тысячу лет-никогда не делайте так-
Код:
round(10*pi/180)
потому что округляя таким образом вы никогда не получите смещения менее чем на 180 градусов.
в этот то и была моя ошибка.

mutabor, скажите пожалуйста- как можно прервать анимацию во время её выполнения в любой момент, не прибегая к правой кнопке мыши и команде "Завершить сейчас" ))
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось Stilet; 09.06.2010 в 07:56.
vedro-compota вне форума Ответить с цитированием
Старый 08.06.2010, 18:15   #6
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Переменная m начально задана равной 1. Условие цикла while m > 0 , но в цикле m не изменяется. Получаем бесконечный цикл, который не завершается и не имеет доступа внешнего управления (прогу нельзя даже закрыть).
По поводу анимации - общий принцип получения движения : нарисовать(вывести) рисунок (кадр), через задержку уничтожить рисунок и вывести в новых координатах и т.д. Это тоже не наблюдается в коде.
Вот замечания при поверхностном рассмотрении кода.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 08.06.2010, 18:17   #7
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Код:
 self.Repaint;
- уничтожил
Код:
 for i := 0 to 7 do
    {присваиваем концам спиц ,
     которые прилегают к ободу колеса
     ,учитывая смещение ,новые координаты}
    begin
      mv[i,0]:=Round(50*cos(q+f))+200;
      mv[i,1]:=Round(50*sin(q+f))+200;
      q:=q+round(45*pi/180);
получил новые. всё работает.
m не изменяется специально, чтобы анимация работала.
вот у меня и вопрос как можно по нажатии на коавишу остановить выполнение анимации (лучше - по нажатии на кнопку на аформе)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось vedro-compota; 08.06.2010 в 18:19.
vedro-compota вне форума Ответить с цитированием
Старый 08.06.2010, 20:43   #8
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Вставь в цикл Application.ProcessMessages; Добавь кнопку "Стоп", в обработчике которой присваивай m:= -1 ( < 0 ). Получишь стоп цикла. m д.б. глобальной ( а лучше замени на флаг типа boolean).
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 08.06.2010, 21:02   #9
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

так и сделал)) только по нажатию на единицу ))
Код:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key in ['1'] then  m:=0;

end;
DeKot, благодарю за совет ))

вот что получилось (добавил шум и люфт оси))-
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  m:integer;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var q,a,b,x0,y0,n,dx,dy,f,i,r:integer;
  horda: real;
  mv: array [0..7,0..1] of integer;
begin
  Canvas.Brush.Style := bsClear;
  m:=1;
  f:=0;
 while m>0 do
  begin
    self.Repaint;
    if f mod 100 = 0 then  // шум. будем косить под старое кино.
    begin
    Randomize;
    a:=100+random(200);
    b:=100+Random(200);
    x0:=random(3);
    r:=random(10);
    form1.canvas.Ellipse(a-r,b-r,a+r,b+r);
    a:=100+random(200);
    b:=100+Random(200);
    r:=random(10);
    form1.canvas.Ellipse(a-r,b-r,a+r,b+r);
    a:=100+random(200);
    b:=100+Random(200);
    r:=random(5);
    form1.canvas.Ellipse(a-r,b-r,a+r,b+r);
    a:=100+random(200);
    b:=100+Random(200);
    r:=random(5);
    form1.canvas.Ellipse(a-r,b-r,a+r,b+r);
    a:=100+random(200);
    b:=100+Random(200);
    r:=random(5);
    form1.canvas.Ellipse(a-r,b-r,a+r,b+r);
    form1.canvas.Ellipse(a-r,b-r,a+r,b+r);
    a:=100+random(200);
    b:=100+Random(200);
    r:=random(5);
    form1.canvas.Ellipse(a-r,b-r,a+r,b+r);
    form1.canvas.Ellipse(a-r,b-r,a+r,b+r);
    a:=100+random(200);
    b:=100+Random(200);
    r:=random(3);
    form1.canvas.Ellipse(a-r,b-r,a+r,b+r);
    form1.canvas.Ellipse(a-r,b-r,a+r,b+r);
    a:=100+random(200);
    b:=100+Random(200);
    r:=random(3);
    form1.canvas.Ellipse(a-r,b-r,a+r,b+r);
    end;
    canvas.Pen.Width:= 15;
    form1.canvas.Ellipse(150-x0,150-x0,250-x0,250-x0);
    form1.canvas.Ellipse(195,195,205,205);
    canvas.Pen.Width:= 12;
    form1.Canvas.MoveTo(200,200);
    q:=0;
    for i := 0 to 7 do
    {присваиваем концам спиц ,
     которые прилегают к ободу колеса
     ,учитывая смещение ,новые координаты}
    begin
      mv[i,0]:=Round(50*cos((q+f)*pi/180))+200;
      mv[i,1]:=Round(50*sin((q+f)*pi/180))+200;
      q:=q+45;
    end;
    f:=f+5;  // увеличиваем угол смещения спиц на 10 градусов
    if f>=360 then  f:=0;
    for i:= 0 to 7 do
    begin
      form1.Canvas.MoveTo(200,200);
      form1.Canvas.LineTo(mv[i,0],mv[i,1]); // рисуем спицы и рычаг.
      if i=0 then
      begin
        canvas.Pen.Width:= 10;
        form1.Canvas.MoveTo(mv[i,0],mv[i,1]);
        form1.Canvas.LineTo(mv[i,0]-400,mv[i,1]);
        form1.canvas.Ellipse(mv[i,0]-3,mv[i,1]-3,mv[i,0]+3,mv[i,1]+3);
        canvas.Pen.Width:= 12;
      end;
    end;
    Sleep(10);   // задержка
    Application.ProcessMessages;
  end;


end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key in ['1'] then  m:=0;

end;

end.
прикрепляю исходник.
x0 - это и есть смещение центра обода колеса. (маленький люфт)
Текст задачи-
Цитата:
. Написать программу-мультфильм «Колеса паравоза»
вот и всё с этой темой. всем удачи. спасибо за ответы и советы ))
Вложения
Тип файла: zip Колесо паровоза.zip (188.0 Кб, 68 просмотров)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось Stilet; 09.06.2010 в 07:57.
vedro-compota вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
колесо прокрутки в RichEdit в Delphi TaYgA Компоненты Delphi 4 06.11.2009 23:04
почему ошибка??? beygul Помощь студентам 1 15.11.2008 19:46
Не работает колесо мышки в Visuale :( Slim Microsoft Office Excel 6 12.11.2007 21:20
Почему ошибка в IBDataSet? 3lander БД в Delphi 3 10.10.2007 11:38