Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вращения эллипса вокруг точки, Вращения эллипса вокруг точки 
:(
    Опции темы
mamyx
Дата 8.7.2002, 22:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ребят, срочно надо сабж.Вобщем так. Дан эллипс, с фиксированой точкой, т.е. как-будто его гвоздем прибили, надо написать кусок проги, чтобы он вокруг этой точки вращался. Заранее спасибо.
  Вверх
Mikel
Дата 9.7.2002, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: 1
Всего: 2



А точка это центр?(было бы попроще)


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
Mikel
Дата 9.7.2002, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: 1
Всего: 2



Сначала получилось красиво, но не совсем то, что надо.
Код
procedure drawrotate(can:TCanvas;rot:single;x1,y1,{x2,y2,}xr,yr:integer);
const r=100;
var i,g:single;
   mx,my:integer;
   bm:TBitmap;
   p:TPoint;
begin
mx:=0;my:=0;
bm:=TBitmap.Create;
bm.Width:=1023;
bm.Height:=1023;
i:=0;
while i<=360 do
begin
 p.x:=x1+round(r*cos(degtorad(i)));
 p.y:=y1+round(r*cos(degtorad(45+i)));
 p.x:=xr+round(abs(xr-p.x)*cos(DegToRad(i-rot)));
 p.y:=yr+round(abs(yr-p.y)*sin(DegToRad(i-rot)));
 if p.x>mx then mx:=p.x;
 if p.y>my then my:=p.y;
 if i=0 then bm.canvas.moveto(p.x,p.y)
    else bm.canvas.lineto(p.x,p.y);
 i:=i+0.1;
end;
can.CopyRect(rect(0,0,mx+1,my+1),bm.Canvas,rect(0,0,mx+1,my+1));
bm.free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
canvas.Rectangle(clientrect);
drawrotate(canvas,spinedit1.value,200,200,200,200);
end;

А вот оно
Код
procedure drawrotate(can:TCanvas;rot:single;x1,y1,{x2,y2,}xr,yr:integer);
const r=100;
var i,g,d,t:single;
   mx,my:integer;
   bm:TBitmap;
   p:TPoint;
begin
mx:=0;my:=0;
bm:=TBitmap.Create;
bm.Width:=1023;
bm.Height:=1023;
i:=0;
while i<=360 do
begin
 p.x:=x1+round(r*cos(degtorad(i)));
 p.y:=y1+round(r*cos(degtorad(45+i)));
 d:=sqrt(sqr(xr-p.x)+sqr(yr-p.y));
 if (xr-p.x=0)and(yr-p.y>0) then t:=90
 else if (xr-p.x=0)and(yr-p.y<0) then t:=270
 else
 t:=RadToDeg(arctan((yr-p.y)/(xr-p.x)));
 if ((xr-p.x)<0)then t:=t+180;
 if ((yr-p.y)<0)and((xr-p.x)>0) then t:=t+360;
 p.x:=xr+round(d*cos(DegToRad(t-rot)));
 p.y:=yr+round(d*sin(DegToRad(t-rot)));
 if p.x>mx then mx:=p.x;
 if p.y>my then my:=p.y;
 if i=0 then bm.canvas.moveto(p.x,p.y)
    else bm.canvas.lineto(p.x,p.y);
 i:=i+0.1;
end;
can.CopyRect(rect(0,0,mx+1,my+1),bm.Canvas,rect(0,0,mx+1,my+1));
bm.free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
spinedit1.Value:=spinedit1.Value+10;
if spinedit1.Value=360 then spinedit1.Value:=0;
canvas.Rectangle(clientrect);
drawrotate(canvas,spinedit1.value,200,200,230,230);
end;



--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
Fantasist
Дата 9.7.2002, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Вращать эллипс вокруг точки, это то же самое, что вращать прямоугольник, или другими словами, набор точек, каких, зависит от того как у тебя задан эллипс. Обычно в графике на машинах эллипс задается как прямоугольник, в который он вписан, то есть четыремя точками(вершинами).Можно сделать это с помощью превода в радиальные координаты и обратно или с помощью формул поворота системы координат. Оба способа были приведены на этом форуме. Где-то тут...


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Mikel
Дата 9.7.2002, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: 1
Всего: 2



В данном случае мы вращаем не всю плоскость, а только точки эллипса.


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
Fantasist
Дата 9.7.2002, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Ага. Кажись это было в старом форуме.Сейчас я это писать не буду, но пожалуй стоит это сделать, и занести наконец это дело в FAQ. Хотя формулы поворота для интересующихся...

x1=x*cos u – y*sin u
y1=x*sin u – y*cos u


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Fantasist
Дата 9.7.2002, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Цитата(Mikel @ 09.7.2002, 12:16)
В данном случае мы вращаем не всю плоскость, а только точки эллипса.

Ага. Это все равно, что в лоб, что по лбу. То ли эллипс вокруг точки, то ли точку вокруг эллипса. Самое главное, считать координаты эллипса(его контрольных точек) относительно этой "неподвижной" точки точки, ну и отображать соответсвенно так, как буд-то это точка неподвижна.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
mamyx
  Дата 9.7.2002, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.7.2002

Репутация: нет
Всего: нет



Ребят, я вас еще напрягу..только плз. не откажите...счет - на часы...даже минуты...В общем даны 2 эллипса, вращающиеся в разные стороны...их фиксированые точки находяться на одной горизонтальной прямой, угловые скорости не равны...надо таким образом как выше написать программу, иллюстрирующую их движение.На рисунке к задаче, они пересекаются в точке, которая тоже лежит на линии соед. точки вокруг которых идут вращения. Надо чтобы корректно происходило пересечение эллипсов при вращении. Заранее спасибо...
PM MAIL   Вверх
Mikel
Дата 9.7.2002, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: 1
Всего: 2



Ну за это уже деньги надо платить :D . Это же геометрия. И их повороты ты через Canvas делать будешь?


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
mamyx
Дата 9.7.2002, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.7.2002

Репутация: нет
Всего: нет



Я понимаю, что деньги платить надо...я даже готов =) А мне впринципе пофиг - через Canvas или нет...лишь бы работало все правильно..И кста, с деньгами из Ростова к тебе......геморно...хотя...
PM MAIL   Вверх
Mikel
Дата 9.7.2002, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: 1
Всего: 2



А банки на что? Через DirectX пойдет(человеческий вид будет: без мигания). Давай все поподробнее на [email protected]
Люди! Клиента не отбивать! :hehe


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
ILA
Дата 4.10.2002, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.9.2002

Репутация: нет
Всего: нет



Цитата(Fantasist @ 09.7.2002, 04:48)
Хотя формулы поворота для интересующихся...

x1=x*cos u – y*sin u
y1=x*sin u – y*cos u

правильно
x1=x*cos u – y*sin u
y1=x*sin u + y*cos u
если x,y в "повернутой" против часовой стрелки системе, а x1,x2 - в "неподвижной".
Для обратного преобразования
x= x1*cos u + y*sin u
y=-x1*sin u + y*cos u
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0946 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.