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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2008, 11:19   #11
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Canvas.Ellipse(0, 0, 100, 100);
Манжосов Денис :) вне форума Ответить с цитированием
Старый 18.08.2008, 11:24   #12
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Я участвовал на олимпиаде и мне попалась задача. Написать программу которая рисует окружность обвитую синусоидой, я не справился с этой задачей, но зато потом нашел решение.
Насчет окружности.
sin a=y
cos a=x
a-это угол от 0 до pi*2
Но если вы построите окружность таким образом, то она будет в 1 пиксел радиусом.
Для того чтобы увеличить радиус нужно sin a и cos a умножить на радиус.
Тут появляется еще одна проблема, сколько нужно прибавлять к углу, чтобы все было тип топ, а нужно прибавлять 1/r.

Немного про pi. Pi измеряется в радианах, и число pi=~3,14 это пол окружности, значит pi=180 градусов, а 2pi=360 градусов.

Последний раз редактировалось Kostia; 18.08.2008 в 11:27.
Kostia вне форума Ответить с цитированием
Старый 18.08.2008, 11:34   #13
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Блиин, совершенно не понимаю как решить эту задачу. Только с Canvas. Ну вот в принципе решение которое я только смог сделать:
const
X = 100;
Y = 100;
R = 50;
Canvas.Ellipse(R,R,R+X,R+Y);
Манжосов Денис :) вне форума Ответить с цитированием
Старый 18.08.2008, 11:37   #14
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Код:
procedure circle(xc,yc,r : real);
var
  a: real;
  x,y: real;
begin
  a:=0;
  while a<=pi*2 do
  begin
    x:=cos(a)*r+xc;
    y:=sin(a)*r+yc;
    form1.Canvas.Pixels[round(x),round(y)]:=0;
    a:=a+1/r;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  circle(200,200,100);
end;
Эх, Попробую объяснить как это работает

Последний раз редактировалось Kostia; 18.08.2008 в 12:11.
Kostia вне форума Ответить с цитированием
Старый 18.08.2008, 11:45   #15
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

a-это угол, нам нужно перебрать углы всех точек на окружности и посчитать их координаты.
sin a - высчитывает координату по оси y, и значение он возвращает от -1 до 1
cos a - высчитывает координату по оси x, и значение он возвращает от -1 до 1
Мы умножаем значение sin и cos на радиус и прибавляем смещение по y и x соответственно, т.е. двигаем центр окружности в нужную точку.
А чтобы при больших радиусах не обидеть не одной точки или на оборот не расчитать одну и туже точку несколько раз, угол нужно увеличивать на 1/r
Хоть немного понятней стало?
Kostia вне форума Ответить с цитированием
Старый 18.08.2008, 11:47   #16
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

О спасибо, сейчас разбирусь.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 18.08.2008, 11:54   #17
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Есть еще такой график функции sin(x). Это синусоида, т.к. sin возвращает значение от -1 до 1, то если вместо угла указать координату x, то поручится волнистая линия:
Код:
procedure _sin();
var
  x: real;
begin
  x:=0;
  while x<=form1.Width do
  begin
    form1.Canvas.Pixels[round(x*10),round(sin(x)*10)+50]:=0; //синусоида
    form1.Canvas.Pixels[round(x*10),50]:=0; //просто линия
    x:=x+1/10;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  _sin();
end;
График получается периодический и повторяется через каждые 2pi

Последний раз редактировалось Kostia; 18.08.2008 в 12:03.
Kostia вне форума Ответить с цитированием
Старый 18.08.2008, 12:07   #18
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Можешь попробовать построить волнистую окружность. Попробуй в первом примере радиус расчитывать по синусоиде.
Kostia вне форума Ответить с цитированием
Старый 18.08.2008, 12:09   #19
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Блиииин. Простите меня за тупость, но я совершенно не пойму, как это всё делать, в код я скопировал, но блин, совершенно не могу додуматься что же делается например вот в этих строчках кода:
Код:
     form1.Canvas.Pixels[round(x*10),round(sin(x)*10)+50]:=0; //синусоида  
    form1.Canvas.Pixels[round(x*10),50]:=0; //просто линия  
     x:=x+1/10;
Совершенно не понимаю sin и cos. Занятия будут проводиться потом основываясь на этих данных?
Манжосов Денис :) вне форума Ответить с цитированием
Старый 18.08.2008, 12:20   #20
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Мы собираемся делать игры, а там это просто необходимо. Например поворот изображения, полет пули в направлении пушки, самонаводящиеся ракеты и т.д.
Нужно только понять. И это вовсе не тупость, я понимаю как это тружно, сам оказывался в похожих ситуациях, но учитель попался с хорошими нервами и все мне разживал и я не хочу быть хуже его. И постараюсь разжевать и тебе, главное чтобы у тебя терпения хватила и не убежал бы.
Kostia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Калькулятор в Delphi" в теоретические аспекты??? jenja Общие вопросы Delphi 1 25.05.2008 23:23
основные цели и задачи студенческого форума? ALEXBAZ Свободное общение 1 14.05.2008 22:24
комп. для программирования фамил Компьютерное железо 4 09.05.2008 12:11
Неделя программирования Stiker Свободное общение 2 10.02.2008 21:15