Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Вращения эллипса вокруг точки


Автор: mamyx 8.7.2002, 22:45
Ребят, срочно надо сабж.Вобщем так. Дан эллипс, с фиксированой точкой, т.е. как-будто его гвоздем прибили, надо написать кусок проги, чтобы он вокруг этой точки вращался. Заранее спасибо.

Автор: Mikel 9.7.2002, 08:33
А точка это центр?(было бы попроще)

Автор: Mikel 9.7.2002, 11:02
Сначала получилось красиво, но не совсем то, что надо.
Код
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;

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

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

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

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

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

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

Автор: mamyx 9.7.2002, 15:07
Ребят, я вас еще напрягу..только плз. не откажите...счет - на часы...даже минуты...В общем даны 2 эллипса, вращающиеся в разные стороны...их фиксированые точки находяться на одной горизонтальной прямой, угловые скорости не равны...надо таким образом как выше написать программу, иллюстрирующую их движение.На рисунке к задаче, они пересекаются в точке, которая тоже лежит на линии соед. точки вокруг которых идут вращения. Надо чтобы корректно происходило пересечение эллипсов при вращении. Заранее спасибо...

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

Автор: mamyx 9.7.2002, 17:47
Я понимаю, что деньги платить надо...я даже готов =) А мне впринципе пофиг - через Canvas или нет...лишь бы работало все правильно..И кста, с деньгами из Ростова к тебе......геморно...хотя...

Автор: Mikel 9.7.2002, 17:50
А банки на что? Через DirectX пойдет(человеческий вид будет: без мигания). Давай все поподробнее на mikel@smtp.ru
Люди! Клиента не отбивать! :hehe

Автор: ILA 4.10.2002, 02:11
Цитата(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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)