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


Автор: Delphin 6.10.2002, 19:21
Ребята пожайлуста помогите!!!
Сражу предупреждаю работа за спасибо, так как денег нет.
Нужно сделать программу на паскалее с помощью графа. На играни должен появляться куб, которым бы я мог управлять с помощью курсоров: вверх - куб поварачивается снизу вверх, и т.д.
нужна не срочно, но желательно по быстрее.
Кто откликнется пишити на личную почту!!!

Заранее благодарен...

Автор: Vex 6.10.2002, 23:43
У меня был исходник на паскале, там тоже вращающийся куб, правда написан только с помощью CRT, вещь классная, если хочешь, я на мыло тебе скину. Можешь переделать под свои нужды. Исходник написал не я потому это бесплатно.

Автор: Devos 7.10.2002, 05:39
Цитата(Vex @ 06.10.2002, 16:43)
Исходник написал не я потому это бесплатно.

:)

Автор: Vex 7.10.2002, 05:49
Цитата(Devos @ 06.10.2002, 21:39)
Цитата(Vex @ 06.10.2002, 16:43)
Исходник написал не я потому это бесплатно.

:)

Ну ведь раздел работа называется.  :)

Автор: Chingachguk 7.10.2002, 06:32
Вращающийся куб - это было одно из первых моих "творений", когда я учился программировать(только чур не смеяться !):

Код

uses graph,crt;
var
j1,col,x,y,r,f1,i,j,k,u,regim,driver,x1,x2,x3,x4,x5,x6,x7,x8,z1,z2,z3,z4,z5,z6,z7,z8:integer;
a,f,t,f2,y0,y1,y2,dd:real;
label 1,2,3,4,5,6,7;
begin
a:=sqrt(2);
driver:=detect;
initgraph(driver,regim,'c:\tp\bgi');
t:=0;k:=0;f:=3.14/4;
x:=300;y:=260;r:=9;j:=1;
col:=8;j1:=7;
setbkcolor(2);
setcolor(1);
outtextxy(245,340,'DEAD  WORLD  INC.');
outtextxy(230,450,'PRESS  ESC  TO  EXIT');
setcolor(1);
line(200,300,400,300);
line(200,300,300,40);
line(400,300,300,40);
setfillstyle(j,j1);
floodfill(390,290,1);
repeat
x1:=round(r*(cos(3*t)-a*sin(3*t)*sin(2*t+f)));x2:=round(r*(cos(3*t)-a*sin(3*t)*sin(2*t+f+2*f)));
x3:=round(r*(cos(3*t)-a*sin(3*t)*sin(2*t+f+4*f)));x4:=round(r*(cos(3*t)-a*sin(3*t)*sin(2*t+f+6*f)));
z1:=round(r*a*cos(2*t+f));z2:=round(r*a*cos(2*t+f+2*f));
z3:=round(r*a*cos(2*t+f+4*f));z4:=round(r*a*cos(2*t+f+6*f));
x5:=-x1;x6:=-x2;x7:=-x3;x8:=-x4;z5:=-z1;z6:=-z2;z7:=-z3;z8:=-z4;
y0:=sin(3*t);y1:=sin(2*t+3.14/2)*cos(3*t);y2:=sin(2*t)*cos(3*t);
if y0>=0 then goto 1;
setcolor(col);
line(x+x1,y+z1,x+x2,y+z2);line(x+x1,y+z1,x+x4,y+z4);
line(x+x2,y+z2,x+x3,y+z3);line(x+x3,y+z3,x+x4,y+z4);
setfillstyle(j,12);
floodfill(x+round((x1+x3)/2),y+round((z1+z3)/2),col);
1:if y1<0 then goto 2;
setcolor(col);
line(x+x4,y+z4,x+x6,y+z6);line(x+x4,y+z4,x+x3,y+z3);
line(x+x5,y+z5,x+x6,y+z6);line(x+x5,y+z5,x+x3,y+z3);
setfillstyle(j,14);floodfill(x+round((x3+x6)/2),y+round((z3+z6)/2),col);
2:if y0<=0 then goto 3;
setcolor(col);
line(x+x5,y+z5,x+x6,y+z6);line(x+x5,y+z5,x+x8,y+z8);
line(x+x6,y+z6,x+x7,y+z7);line(x+x7,y+z7,x+x8,y+z8);
setfillstyle(j,13);
floodfill(x+round((x5+x7)/2),y+round((z5+z7)/2),col);
3:if y2>0 then goto 4;
setcolor(col);
line(x+x1,y+z1,x+x4,y+z4);line(x+x1,y+z1,x+x7,y+z7);
line(x+x6,y+z6,x+x7,y+z7);line(x+x6,y+z6,x+x4,y+z4);
setfillstyle(j,11);
floodfill(x+round((x4+x7)/2),y+round((z4+z7)/2),col);
4:if y2<=0 then goto 5;
setcolor(col);
line(x+x2,y+z2,x+x3,y+z3);line(x+x3,y+z3,x+x5,y+z5);
line(x+x5,y+z5,x+x8,y+z8);line(x+x2,y+z2,x+x8,y+z8);
setfillstyle(j,10);floodfill(x+round((x3+x8)/2),y+round((z3+z8)/2),col);
5:if y1>=0 then goto 6;
setcolor(col);
line(x+x2,y+z2,x+x1,y+z1);line(x+x8,y+z8,x+x7,y+z7);
line(x+x7,y+z7,x+x1,y+z1);line(x+x2,y+z2,x+x8,y+z8);
setfillstyle(j,9);
floodfill(x+round((x2+x7)/2),y+round((z2+z7)/2),col);
6:setfillstyle(1,j1);
{delay(100);}
k:=k+1;if k=200 then k:=0;
t:=k*6.28/200;
{x:=300+round(80*sin(2*t));}y:=200+round(68*cos(t));
sound(250+round(140*sin(t)));
delay(100);
nosound;
7:bar(x-25,y-25,x+25,y+25);
until keypressed;
closegraph;
end.

Автор: Delphin 11.10.2002, 17:21
всем спасибо, буду проверять, если че снова к вам:)))

Автор: Delphin 14.10.2002, 15:51
Chingachguk
Твой код конечно работает бе проблем, но дело в том, что мне нужна прога вращением куба в которой я бы мог управлять курсороми клавы. Если не трудно подскажи как будет.

Автор: Chingachguk 17.10.2002, 01:43
Счас я на работе да и нету под рукой графических библиотек (graph.tpu).
Если будет время на выходных - попробую сделать...

Автор: Delphin 18.10.2002, 23:11
Цитата(Chingachguk @ 16.10.2002, 22:43)
Если будет время на выходных - попробую сделать...

Буду ждать....

Автор: MuToGeN 19.10.2002, 00:48
Цитата(Delphin @ 18.10.2002, 16:11)

блин, я на паскале когда-то (очень давно) писал примитивный 3д-шный движок. был тормозной, но работал. исходники год назад где-то прое...л. обидно...

Автор: Chingachguk 21.10.2002, 16:54
Цитата

Delphin Дата сообщения: 18.10.2002,16:11
Цитата (Chingachguk @ 16.10.2002,22:43)
Если будет время на выходных - попробую сделать...

Буду ждать....


Да, я начал делать, но я решил переписать все заново потому, что тот бред я не в силах поправить ...

Автор: Chingachguk 4.11.2002, 04:03
Вот, держи. Правда, без закраски ;)

uses
 graph,crt;
const
 d = 50;
 color = 14;
type
 vector = array[1..3] of real;
const
 cubic: array[1..8,1..3] of integer =
   (( 1, 1,-1),( 1, 1, 1),( 1,-1, 1),( 1,-1,-1),
    (-1, 1,-1),(-1, 1, 1),(-1,-1, 1),(-1,-1,-1));
 S_XYZ: array[1..3] of integer = (240,200,200);
 a0: vector = (0,Pi/2,d);
 b0: vector = (Pi/2,Pi/2,d);
 c0: vector = (0,0,d);
var
 regim,driver: integer;
 key: char;
 i,j,p1,p2: integer;
 tempY,tempZ: real;
 phi,teta: real;
 a,b,c: vector;
 x,y,z: array[1..3] of real;
 points: array[1..8,1..3] of integer;
begin
 driver:=detect;
 initgraph(driver,regim,'c:\tp\bgi');
 outtextxy(245,420,'DEAD  WORLD  INC.');
 outtextxy(230,450,'PRESS  ESC  TO  EXIT');
 phi:=0;
 teta:=0;
 repeat
   setcolor(0);
   setfillstyle(1,0);
   bar(100,40,500,300);
   {Поворот в плоскости XY на угол phi}
   a[1]:=a0[3]*cos(a0[1]+phi)*sin(a0[2]);
   a[2]:=a0[3]*sin(a0[1]+phi)*sin(a0[2]);
   a[3]:=a0[3]*cos(a0[2]);
   b[1]:=b0[3]*cos(b0[1]+phi)*sin(b0[2]);
   b[2]:=b0[3]*sin(b0[1]+phi)*sin(b0[2]);
   b[3]:=b0[3]*cos(b0[2]);
   c[1]:=c0[3]*cos(c0[1]+phi)*sin(c0[2]);
   c[2]:=c0[3]*sin(c0[1]+phi)*sin(c0[2]);
   c[3]:=c0[3]*cos(c0[2]);
   {Поворот в плоскости YZ на угол teta}
   tempY:=a[2];
   tempZ:=a[3];
   a[2]:=tempY*cos(teta)+tempZ*sin(teta);
   a[3]:=tempY*sin(teta)+tempZ*cos(teta);
   tempY:=b[2];
   tempZ:=b[3];
   b[2]:=tempY*cos(teta)+tempZ*sin(teta);
   b[3]:=tempY*sin(teta)+tempZ*cos(teta);
   tempY:=c[2];
   tempZ:=c[3];
   c[2]:=tempY*cos(teta)+tempZ*sin(teta);
   c[3]:=tempY*sin(teta)+tempZ*cos(teta);
   for i:=1 to 8 do
     for j:=1 to 3 do
       points[i,j]:=S_XYZ[j]+round(cubic[i,1]*a[j]+cubic[i,2]*b[j]+cubic[i,3]*c[j]);
   setcolor(color);
   for i:=1 to 4 do
     begin
       p1:=i;
       p2:=i+1;
       if p2>4 then p2:=1;
       line(points[p1,1],points[p1,2],points[p2,1],points[p2,2]);
       line(points[p1+4,1],points[p1+4,2],points[p2+4,1],points[p2+4,2]);
       line(points[p1,1],points[p1,2],points[p1+4,1],points[p1+4,2]);
     end;
   key:=readkey;
   if key=#77 then phi:=phi-Pi/9;
   if key=#75 then phi:=phi+Pi/9;
   if key=#72 then teta:=teta-Pi/9;
   if key=#80 then teta:=teta+Pi/9;
 until key=#27;
 closegraph;
end.

Автор: Delphin 4.11.2002, 06:14
Спасибо;=)
Щас попробую сделать чтобы невидимые линии были --------..
если что - опять сюда:)

Автор: Delphin 11.11.2002, 03:36
блн, что то не получается..
слушайте, а можно сделать невидимые линии в виде пунктиров и вращение по оси yz не колебательно а по кругу , как по оси xy...?

Автор: MuToGeN 15.11.2002, 18:11
Цитата(Delphin @ 10.11.2002, 19:36)
можно сделать невидимые линии в виде пунктиров

это делается с помощью матрицы глубины. т.е. для каждого пикселя на экране просчитываешь координату Z того, что на этом пикселе отображается. и когда уже окончательно рисуешь, то проверяешь по этой матрице, "верхний" это элемент или нет.

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