Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 27.06.2009, 18:05   #1
Reanim
Новичок
Джуниор
 
Регистрация: 26.06.2009
Сообщений: 5
По умолчанию Помогите разобраться с поворотом!

Здравствуйте уважаемые! Помогите, не могу разобраться с поворотом. Вот набросок проги. Линия должна в анимации крутиться на угол. Не могу понять как это осуществить.
Program GraphShabl;
Uses
Crt,Graph;
Var
GraphDriver,
GraphMode,x,y,x1,y1,i: integer;

Procedure DrawLine;
var x,y,x1,y1:real;
begin
i:=10;
setcolor(15);
x:=x*Cos(i)-y*Sin(i);
y:=x*Sin(i)+y*Cos(i);
x1:=x1*Cos(i)-y1*Sin(i);
y1:=x1*Sin(i)-y1*Cos(i);
delay(5000);
setcolor(0);
end;
Begin
ClrScr;
GraphDriver:=detect;
InitGraph(GraphDriver, GraphMode,'..\BGI');
setcolor(15);
circle(250,200,50);
x:=200;
y:=200;
x1:=300;
y1:=200;
Line(x,y,x1,y1);
for i:=0 to 10 do
begin
x:=x+1;
y:=y+1;
x1:=x1+1;
y1:=y1+1;
Drawline;

end;

readln;
CloseGraph;
End.
Буду признателен если все изменения объясните. Заранее спасибо.
Reanim вне форума Ответить с цитированием
Старый 27.06.2009, 18:40   #2
Gigabit
Пользователь
 
Аватар для Gigabit
 
Регистрация: 28.04.2009
Сообщений: 31
По умолчанию

В книге turbo pascal В.В. Фараонов за 2007г, на странице 243 есть оч. хороший пример, циферблата часов. Поюзай в нете книгу, а то у меня нет электронного варианта.
Чтобы наделать ошибок надо для начала уметь хоть что то делать!
Gigabit вне форума Ответить с цитированием
Старый 27.06.2009, 21:10   #3
Reanim
Новичок
Джуниор
 
Регистрация: 26.06.2009
Сообщений: 5
По умолчанию

Спасибо за ответ, дружище! Начинаю искать!
Reanim вне форума Ответить с цитированием
Старый 27.06.2009, 23:04   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,263
По умолчанию

в качестве альтернативы, предлагаю своё решение:
Код:
Uses Graph;
procedure MyDelay(HundSecond : longInt);
var
  Ticks      : LongInt  absolute 0:$46c;
begin
  HundSecond:=round(HundSecond * 0.185) +Ticks;
  repeat  until (Ticks>HundSecond);
end;

procedure DrawLine(x0, y0 : integer; Ugol : double;
                            LineLen, LineColor : integer);
var x1,y1,x2,y2 : integer;
begin
  setcolor(LineColor);
  x1 := round(x0-LineLen * cos(Ugol*pi/180));
  x2 := round(x0+LineLen * cos(Ugol*pi/180));
  y1 := round(y0-LineLen * sin(Ugol*pi/180));
  y2 := round(y0+LineLen * sin(Ugol*pi/180));
  Line(x1, y1, x2, y2);
end;

var GraphDriver, GraphMode,
   i : integer;
   x0, y0, Radius : integer;

begin
  GraphDriver := detect;
  InitGraph(GraphDriver, GraphMode, '..\BGI');
  x0 := 250;
  y0 := 200;
  Radius := 50;
  setcolor(15);
  circle(x0, y0, Radius);

  for i := 0 to 10 do
  begin
    {нарисовать линию с центром в x0,y0, 
      с углом поворота i*12 (угол в градусах!)
      Длина линии = Radius
      цвет линии = 15}
    Drawline(x0, y0, i*12, Radius, 15);
    MyDelay(100);
    {сотрём линию - просто выведем её цветом 0}  
    Drawline(x0, y0, i*12, Radius, 0);
  end;
  readln;
  CloseGraph;
end.
P.S. Reanim, кстати, не рекомендую Вам злоупотреблять использованием глобальных переменных в процедуре. Тем более, как мне показалось, Вы немножко неуверенно себя чувствуете в этой области...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.06.2009, 23:48   #5
Reanim
Новичок
Джуниор
 
Регистрация: 26.06.2009
Сообщений: 5
По умолчанию

2 Serge_Bliznykov. Не то что немножко неуверенно, а я практически чайник ещё. Спасибо за совет,учту. Хочу попросить прокоментировать момент поворота. Не понимаю что откуда взялось. Точнее процедура DrawLine прокоментируй плиз. И вот ещё пара моментиков, почему ты умножаешь I*12, и что такое LineLen и самое интересное, каким образом у тебя при использовании радиуса (ведь диаметр идет во всю окружность) получается линия во весь круг? Очень жду ответа.... Спасибо.

Последний раз редактировалось Reanim; 28.06.2009 в 00:27.
Reanim вне форума Ответить с цитированием
Старый 28.06.2009, 03:49   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,263
По умолчанию

Цитата:
почему ты умножаешь I*12
I - это переменная цикла, которая изменяется от 0 до 10
*12 - это значит, что каждый раз мы поворачиваем линию ровно на 12 градусов. Тут можно поставить любое число (поэкспериментируйте самостоятельно). Но, если это число будет больше 90 градусов, то визуально эффекта вращения не будет.
Цитата:
и что такое LineLen
Это параметр процедуры DrawLine (то, что перечисленно в описании процедуры или функции называется списком формальных параметров. когда процедура/функция вызывается, туда программист должен подставить фактические параметры.) Вот, если расмотреть процедуру, LineLen там используется как длина для получения координат начала и окончания линии (это гипотенуза, умножаем на косинус угла, получаем длину прилегающего катета - это координата X, умножаем на синус угла - получаем координату Y. А когда мы вызываем процедуру рисования линии, мы в неё передаём переменную Radius (которую мы использовали для рисования окружности). Но, так как мы полученную длину от центра X0 вычитаем, чтобы получить X1 и прибавляем? чтобы получить X2, поэтому полученная линия имеет длину 2 * LineLen= 2*Radius, что составит точно диаметр окружности.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.06.2009, 14:00   #7
Reanim
Новичок
Джуниор
 
Регистрация: 26.06.2009
Сообщений: 5
По умолчанию

2 Serge_Bliznykov Дружище, если ты не против, хотелось бы твой номер аси или что-нибудь для связи, чтобы более оперативно получать от тебя консультации. Это возможно?
Reanim вне форума Ответить с цитированием
Старый 28.06.2009, 22:51   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,263
По умолчанию

хм... не понял, какая в этом моя выгода?..
ну ладно, для затравки... в качестве "аттракциона невиданной щедрости"
вот моё мыло: sbliznykov(at)gmail.com
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.06.2009, 21:01   #9
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Делал вращающуюся стрелку в Делфи... Может пригодится...

Анимирование стрелки...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться pashka Общие вопросы C/C++ 9 31.05.2009 00:37
Помогите разобраться! Knight_PS Помощь студентам 0 07.05.2009 17:34
помогите разобраться!!!!! Даринка Microsoft Office Excel 1 25.04.2009 00:19
Помогите разобраться raxem Помощь студентам 17 14.09.2008 18:08