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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2012, 21:19   #1
missg
Пользователь
 
Регистрация: 28.09.2011
Сообщений: 16
По умолчанию вращение фигуры

Здравствуйте! Помогите решить задачу: вращение фигур на 30 градусов по часовой стрелке. Может кто-нибудь знает как решить. Вот код самой программы:
Код:
program gr;

uses
    graph;

var
    g, h, i, x, y, r: integer;

begin
    g := detect;
    initgraph(g,h,'');

   line(280,10,280,300);
   line(50,140,530,140);

    rectangle(290,150,350,260);


    Ellipse(300,250,0,360,80,40);
    line (250,300,400,300);  {niz}
    line (250,300,245,255);


    line (245,253,328,235);
    line(328,235,305,185);
    line(305,185,375,155);
    line(375,155,400,300);
readln
end.
missg вне форума Ответить с цитированием
Старый 15.04.2012, 21:43   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Нужно преобразовывать координаты.
Примерно так:
x1=(x0-cx)*cos(ang)+(y0-cy)*sin(ang)+cx;
y1=(x0-cx)*sin(ang)-(y0-cy)*cos(ang)+cy;
где (x1,y1) новые координаты,
(x0,y0) старые координаты,
(cx,cy) центр вращения,
ang - угол поворота.
Овал нужно будет строить по точкам.

Пример отрисовки кубика (для 3 мерного случая):
Код:
uses crt,graph;
type
points=record
h,r,f:real;end;
var
d,m,i,t,x2,y2:integer;
c:char;
f1,f2:real;
a:array [1..8] of points;
 
 
{преобразует координаты для поворота в плоскости экрана}
procedure rotate(x1,y1:integer);
begin            
x2:=round((x1-320)*cos(f2)-(y1-240)*sin(f2))+320;
y2:=round((x1-320)*sin(f2)+(y1-240)*cos(f2))+240;
end;
 
 
{отрисовывает одну линию с правильными координатами}
procedure draw(x,y,i,j:integer;f:real);
begin
rotate(round(x+a[i].r*cos(a[i].f+f)),round(y-a[i].h+0.3*a[i].r*sin(a[i].f+f)));
moveto(x2,y2);
rotate(round(x+a[j].r*cos(a[j].f+f)),round(y-a[j].h+0.3*a[j].r*sin(a[j].f+f)));
lineto(x2,y2);
end;
 
 
{отрисовывает весь кубик}
procedure drawcube(f:real);
begin
for i:=1 to 4 do draw(320,240,i,i+4,f);
for i:=1 to 3 do draw(320,240,i,i+1,f);
draw(320,240,4,1,f);
for i:=5 to 7 do draw(320,240,i,i+1,f);
draw(320,240,8,5,f);
end;
 
begin
d:=detect;
m:=2;
initgraph(d,m,'c:\bgi');
cleardevice;
 
{задание цилиндрических координат}
for i:=1 to 4 do begin
a[i].h:=-50*sqrt(2);
a[i].r:=100;
a[i].f:=pi/2*(i-1);end;
 
for i:=5 to 8 do begin
a[i].h:=50*sqrt(2);
a[i].r:=100;
a[i].f:=pi/2*(i-1);end;
 
f1:=0;
f2:=0;
drawcube(f1);
 
 
{управление поворотом , A - влево, D - вправо, S - по часовой стрелке, W - против часовой стрелки}
repeat
c:=readkey;
if c='a' then f1:=f1+0.2;
if c='d' then f1:=f1-0.2;
if c='w' then f2:=f2+0.2;
if c='s' then f2:=f2-0.2;
if f1>2*pi then f1:=f1-2*pi;
if f1<-2*pi then f1:=f1+2*pi;
if f2>2*pi then f2:=f2-2*pi;
if f2<-2*pi then f2:=f2+2*pi;
cleardevice;
drawcube(f1);
until c=#27;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 15.04.2012 в 21:47.
BDA на форуме Ответить с цитированием
Старый 15.04.2012, 22:00   #3
missg
Пользователь
 
Регистрация: 28.09.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение

Пример отрисовки кубика (для 3 мерного случая):
а можно как-то по моей задаче объяснить?
missg вне форума Ответить с цитированием
Старый 15.04.2012, 22:18   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
program gr;

uses
    graph,crt;

const
cx=320;
cy=240;

type
point=record
x,y:integer;
end;

var
    g, h : integer;
    ang:real;
    c:char;

procedure rotate(var a:point;x1,y1:integer;ang:real);
begin            
a.x:=round((x1-cx)*cos(ang)-(y1-cy)*sin(ang))+cx;
a.y:=round((x1-cx)*sin(ang)+(y1-cy)*cos(ang))+cy;
end;
 
procedure line1(x1,y1,x2,y2:integer;f:real);
var
a,b:point;
begin
rotate(a,x1,y1,f);
rotate(b,x2,y2,f);
moveto(a.x,a.y);
lineto(b.x,b.y);
end;

procedure rectangle1(x1,y1,x2,y2:integer;f:real);
begin
     line1(x1,y1,x2,y1,f);
     line1(x2,y1,x2,y2,f);
     line1(x2,y2,x1,y2,f);
     line1(x1,y2,x1,y1,f);
end;

begin
    g := detect;
    initgraph(g,h,'');
    ang:=0;

    {Ellipse(300,250,0,360,80,40);}

repeat
    line(10,cy,630,cy);
    line(cx,10,cx,470);

    rectangle1(290,150,350,260,ang);

    line1(250,300,400,300,ang);
    line1(250,300,245,255,ang);
    line1(245,253,328,235,ang);
    line1(328,235,305,185,ang);
    line1(305,185,375,155,ang);
    line1(375,155,400,300,ang);

    c:=readkey;
    if c='a' then ang:=ang-0.2;
    if c='d' then ang:=ang+0.2;
    if ang>2*pi then ang:=ang-2*pi;
    if ang<-2*pi then ang:=ang+2*pi;
    cleardevice;
until c=#27;
end.
Эллипс реализуйте сами
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 15.04.2012, 22:27   #5
missg
Пользователь
 
Регистрация: 28.09.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Эллипс реализуйте сами
Ух ты! спасибо! с эллипсом надеюсь разберусь!! Огромное спасибо
missg вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вращение фигуры в 3D плоскости Владилена Помощь студентам 4 04.04.2012 11:26
Движение одной фигуры,вслед изменения высоты другой фигуры. 7vlad37 Microsoft Office Excel 3 21.07.2011 18:01
SDL OpenGL Вращение фигуры revaldo666 Общие вопросы C/C++ 0 18.07.2010 22:42
Вращение фигуры vandrouny Общие вопросы Delphi 3 22.05.2010 21:16
Вращение stscolt Помощь студентам 1 08.10.2009 20:39