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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

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

Доброго времени суток .
В моей задаче необходимо "вращать" колесо паровоза, то есть просто перерисовывать спицы.
Я пока ещё только на начальной стадии решения - просто хочу заполнить круг всевозможнами радиусами, но у меня где-то ошибка. Чтобы определить координату очередной точки, в которую следует провести радиус, я вычисляю длину хорды , которая стягивает дугу размерностью q радиан.
Для этого я использую формулу d=2Rsin(q/2).
Когда длина хорды известна можно вычислить смещение x и смещение y , умножив длину хорды на cos((180-q)/2)) и на sin((180-q)/2)) , соответственно. (изначально радиус параллельно оси x , смещение происходит по часовой стрелке.)
вот код-
Код:
procedure TForm1.Button1Click(Sender: TObject);
var q,a,b,x0,y0,m,n,dx,dy:integer;
  horda: real;
begin
  q:=0;
  canvas.Pen.Width:= 1;
  form1.canvas.Ellipse(150,150,250,250);
  form1.canvas.Ellipse(195,195,205,205);
  canvas.Pen.Width:= 1;
  form1.Canvas.MoveTo(200,200);
  X0:=150;
  y0:=200;
  for q := 1 to 100 do
  begin
    form1.Canvas.MoveTo(200,200);
    horda:=100*sin(q/2); {эта формула вычиления длины хорды
    которая стянута дугой в q радиан и имеет радиус 50 пикселей}
    a:=x0+round(horda*cos((180-q)/2)) ;// вычисляем новый x
    b:=y0-round(horda*sin((180-q)/2)) ;// вычисляем новый y
    form1.Canvas.LineTo(a,b);
  end;

end;
к сожалению , не могу прикрепить картинку со схемой, но надеюсь, идея понятна.
Работает алгоритм неправильно (прикрепляю исходник), причём начиная с первого же смещения. Не пойму почему.
P.S. Вообще, канечно, сложно здесь сразу вникнуть в суть моего вопроса - но я создал эту тему в надежде, что кто-то просто уже сталкивался с подобной проблемой.
Вложения
Тип файла: zip Колесо паровоза.zip (158.1 Кб, 16 просмотров)
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось vedro-compota; 08.06.2010 в 12:40.
vedro-compota вне форума Ответить с цитированием
Старый 08.06.2010, 13:09   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) если угол в радианах, то откуда берётся 180-q ?!

2) посмотрите темку
Нарисовать на экране катящееся по горизонтали колесо с четырьмя спицами.

p.s. Ваши исходник в приложении не смотрел... не разберётесь, тогда я вечерком гляну...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.06.2010, 13:22   #3
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Сообщений: 411
По умолчанию

Быстро набросал примерчик. Посмотрите. Попробуйте менять координаты.
Вложения
Тип файла: rar 123.rar (341.3 Кб, 28 просмотров)
S@fer вне форума Ответить с цитированием
Старый 08.06.2010, 13:26   #4
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

Дело в том, что треугольник, который образуют два радиуса и хорда - равносторонний))
цитирую вас,Serge_Bliznykov, в другой теме -
Цитата:
умножая радиус на cos и sin угла получите нужные координаты по осям..
собственно то решение достаточно. Просто вместе "тамошних " Getmaxx div 2;
и Getmaxy div 2; следует поставить необходимые координаты центра.
Сейчас посмотрю тему "про колесо с четырьмя спицами" . Спасибо ))
S@fer, благодарю. Сейчас буду смотреть.
против абортов=за + жизнь;.фкн вгу;_______________________мойблг

Последний раз редактировалось vedro-compota; 08.06.2010 в 13:29.
vedro-compota вне форума Ответить с цитированием
Старый 08.06.2010, 13:35   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предлагаю такое:
Код:
procedure TForm1.FormPaint(Sender: TObject);
const q=10;
var x,y,ang:Double;i,x0,y0:integer;
begin
 ang:=0;
  form1.canvas.Ellipse(150,150,250,250);
  form1.canvas.Ellipse(195,195,205,205);
  canvas.Pen.Width:= 1;
  form1.Canvas.MoveTo(200,200);
   X0:=150+50;
   y0:=200;

 for i:=1 to q do begin
   canvas.moveto(X0,y0);
    x:=X0+50*cos(ang);
    y:=y0+50*sin(ang);
   canvas.LineTo(Round(x),round(y));
   ang:=ang+(2*pi/q);
 end;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.06.2010, 14:01   #6
Snejnaya
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 219
По умолчанию

А зачем "отталкиваться" от хорд? Отталкиваться, ИМХО, нужно от угла. К примеру, есть система координат ОХУ с началом координат в центре окружности. Радиус окружности нам известен. Координаты любой точки этой окружности
по х - R*Cos(alpha);
по у - R*Sin(alpha)
где alpha - угол между положительным направлением оси ОХ и радиусом.
А дальше, меняя угол, можно крутить-вертеть спицы, как душе угодно и задать любое их количество.

... не заметила, когда писала, что Stilet уже предложил этот вариант
Snejnaya вне форума Ответить с цитированием
Старый 08.06.2010, 14:09   #7
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию

да-да )) просто отталкивать от хорд я придумал путём "непосильных усилий" )) но там какая-то муть получилась...
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 08.06.2010, 14:19   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не заметила, когда писала, что Stilet уже предложил этот вариант
А я не заметил пост Сафера, так что мы в расчете
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Координаты точки в Delphi Владимир_король Помощь студентам 1 29.04.2010 11:48
Вращение точки по окружности BloodMaX Помощь студентам 4 21.12.2009 17:37
Имеются координаты точки. Как проверить какого цвета соседние точки на форме? Rin Мультимедиа в Delphi 2 10.11.2009 22:47
даны две точки. организовать движение из точки А в точку Б окружности! Wi1D Помощь студентам 6 23.05.2009 19:55
Движение точки по окружности somwan Общие вопросы C/C++ 4 17.03.2009 16:30