От теоретической части, я перешел к решению задачи. Сначала я сделал просто три линии, которые были связаны между собой, и каждая из которых вращалась в полярной системе координат, но такую работу у меня не приняли и приходится начинать все сначала.
И я поставил себе такую задачу: "Построить три октаэдра, которые бы произвольно вращались относительно любых трех осей координат и были свзяны между собой". Пока вопрос такой, у меня не получается построить сам октаэдр..
Код вот...
Program izknigi;
uses crt,graph;
type
Vertex=record
x,y,z:real;
End;
Edge=record
src,dest:integer;
End;
Object3D=record
vertices:array [0..5] of Vertex;
edges:array [0..11] of Edge;
xc,yc,zc:real;
End;
Var
model:object3d;
gm,gd:integer;
Procedure LoadObject3D(var X: Object3D);
var
ff:text;
Nv,Ne:integer;
Shape:Object3D;
i:integer;
Begin
Assign(ff,'D:\oct');
Reset(ff);
Readln(ff,Nv);
For i:=1 to NV do
Readln(ff, Shape.vertices[i].x , Shape.vertices[i].y , Shape.Vertices[i].z);
Readln(ff, Ne);
For i:=1 to Ne do
Readln(ff, Shape.edges[i].src, Shape.edges[i].dest);
Close(ff);
X:=Shape;
End;
procedure ShowShape(Shape: Object3D);
var
i,Xs,Ys:integer;
x,y,z:real;
const n=300;
Begin
For i:=0 to High(Shape.edges) do
Begin
x:=Shape.vertices[Shape.edges[i].src].x + Shape.xc;
y:=Shape.vertices[Shape.edges[i].src].y + Shape.yc;
z:=Shape.vertices[Shape.edges[i].src].z + Shape.zc;
If abs(z)<0.01 then z:=0.01;
Xs:= Round(GetMaxX div 2 + N*x/z);
Ys:= Round(GetMaxY div 2 + N*y/z);
MoveTo(Xs, Ys);
x:=Shape.vertices[Shape.edges[i].dest].x + Shape.xc;
y:=Shape.vertices[Shape.edges[i].dest].y + Shape.yc;
z:=Shape.vertices[Shape.edges[i].dest].z + Shape.zc;
If abs(z)<0.01 then z:=0.01;
Xs:= Round(GetMaxX div 2 + N*x/z);
Ys:= Round(GetMaxY div 2 + N*y/z);
LineTo(Xs,Ys);
End;
End;
Begin
gm:=detect; gd:=1;
InitGraph(gm,gd,'');
LoadObject3D(model);
ShowShape(Model);
CloseGraph;
End.
Object3D=record
vertices:array [0..5] of Vertex; { <--- Заметь, индексы 0 .. 5, а не 1 .. 6 }
edges:array [0..11] of Edge;
xc,yc,zc:real;
End;
For i:=1 to NV do
Readln(ff, Shape.vertices[i].x , Shape.vertices[i].y , Shape.Vertices[i].z);
Переделал на вот так...
Program izknigi;
uses crt,graph;
type
Vertex=record
x,y,z:real;
End;
Edge=record
src,dest:integer;
End;
Object3D=record
vertices:array [1..6] of Vertex;
edges:array [1..12] of Edge;
xc,yc,zc:real;
End;
Var
model:object3d;
gm,gd:integer;
Procedure LoadObject3D(var X: Object3D);
var
ff:text;
Nv,Ne:integer;
Shape:Object3D;
i:integer;
Begin
Assign(ff,'D:\oct');
Reset(ff);
Readln(ff,Nv);
For i:=1 to NV do
Readln(ff, Shape.vertices[i].x , Shape.vertices[i].y , Shape.Vertices[i].z);
Readln(ff, Ne);
For i:=1 to Ne do
Readln(ff, Shape.edges[i].src, Shape.edges[i].dest);
Close(ff);
X:=Shape;
End;
procedure ShowShape(Shape: Object3D);
var
i,Xs,Ys:integer;
x,y,z:real;
const
n=300;
Begin
For i:=1 to High(Shape.edges) do
Begin
x:=Shape.vertices[Shape.edges[i].src].x + Shape.xc;
y:=Shape.vertices[Shape.edges[i].src].y + Shape.yc;
z:=Shape.vertices[Shape.edges[i].src].z + Shape.zc;
If abs(z)<0.01 then z:=0.01;
Xs:= Round(GetMaxX div 2 + N*x/z);
Ys:= Round(GetMaxY div 2 + N*y/z);
MoveTo(Xs, Ys);
x:=Shape.vertices[Shape.edges[i].dest].x + Shape.xc;
y:=Shape.vertices[Shape.edges[i].dest].y + Shape.yc;
z:=Shape.vertices[Shape.edges[i].dest].z + Shape.zc;
If abs(z)<0.01 then z:=0.01;
Xs:= Round(GetMaxX div 2 + N*x/z);
Ys:= Round(GetMaxY div 2 + N*y/z);
LineTo(Xs,Ys);
End;
End;
Begin
gm:=detect; gd:=1;
InitGraph(gm,gd,'');
LoadObject3D(model);
ShowShape(Model);
CloseGraph;
End.
x:=Shape.vertices[Shape.edges[i].src].x + Shape.xc;
...
Reset(ff);
Readln(ff,Nv);
For i:=0 to pred(NV) do
Readln(ff, Shape.vertices[i].x , Shape.vertices[i].y , Shape.Vertices[i].z);
Readln(ff, Ne);
For i:=0 to pred(Ne) do
Readln(ff, Shape.edges[i].src, Shape.edges[i].dest);
Close(ff);
...
Огромное спасибо. Сейчас буду разбираться...
Отрисовать и завертеть параллелепипед я сумел. Спасибо еще раз Volvo, очень мне помог.
Program izknigi;
uses crt,graph;
type
Vertex=record
x,y,z:real;
End;
Edge=record
src,dest:integer;
End;
Object3D=record
vertices:array [1..8] of Vertex;
edges:array [1..12] of Edge;
xc,yc,zc:real;
End;
Matrix=array[1..4,1..4] of Real;
Column=array[1..4] of Real;
Var
model:object3d;
l,gm,gd:integer;
buf:matrix;
t:char;
Procedure MMMult(lhs,rhs:Matrix; var r: Matrix);
var
I,j,k:integer;
s:real;
Begin
For i:=1 to 4 do
For j:=1 to 4 do
Begin
s:=0;
for k:=1 to 4 do
s:=s+lhs[i,k]*rhs[k,j];
r[i,j]:=s;
End;
End;
Procedure MCMult(lhs:matrix; rhs:column;var r:column);
Var
k,i:integer;
s:real;
Begin
For i:=1 to 4 do
Begin
s:=0;
For k:=1 to 4 do
s:=s+lhs[i,k]*rhs[k];
r[i]:=s;
end;
End;
Procedure RotateMatrix( xa,ya,za:real;var r:Matrix);
var
xr,yr,zr: Matrix;
v:Matrix;
Begin
xr[1,1]:=1; xr[1,2]:=0; xr[1,3]:=0; xr[1,4]:=0;
xr[2,1]:=0; xr[2,2]:=cos(xa); xr[2,3]:=-sin(xa); xr[2,4]:=0;
xr[3,1]:=0; xr[3,2]:=sin(xa); xr[3,3]:=cos(xa); xr[3,4]:=0;
xr[4,1]:=0; xr[4,2]:=0; xr[4,3]:=0; xr[4,4]:=1;
yr[1,1]:=cos(ya); yr[1,2]:=0; yr[1,3]:=sin(ya); yr[1,4]:=0;
yr[2,1]:=0; yr[2,2]:=1; yr[2,3]:=0; yr[2,4]:=0;
yr[3,1]:=-sin(ya); yr[3,2]:=0; yr[3,3]:=cos(ya); yr[3,4]:=0;
yr[4,1]:=0; yr[4,2]:=0; yr[4,3]:=0; yr[4,4]:=1;
zr[1,1]:=cos(za); zr[1,2]:=-sin(za); zr[1,3]:=0; zr[1,4]:=0;
zr[2,1]:=sin(za); zr[2,2]:=cos(za); zr[2,3]:=0; zr[2,4]:=0;
zr[3,1]:=0; zr[3,2]:=0; zr[3,3]:=1; zr[3,4]:=0;
zr[4,1]:=0; zr[4,2]:=0; zr[4,3]:=0; zr[4,4]:=1;
MMMult(xr,yr,v);
MMMult(v,zr,r);
End;
Procedure RotateShape(xa,ya,za:real; var Shape:Object3D);
var
rm:matrix;
i:integer;
c:column;
Begin
RotateMatrix(xa,ya,za,rm);
c[4]:=1;
For i:=1 to High(Shape.vertices) do
Begin;
C[1]:= shape.vertices[i].x;
C[2]:= shape.vertices[i].y;
C[3]:= shape.vertices[i].z;
McMult(rm,c,c);
shape.vertices[i].x:=c[1];
shape.vertices[i].y:=c[2];
shape.vertices[i].z:=c[3];
End;
End;
Procedure LoadObject3D(var Shape: Object3D);
var
ff:text;
Nv,Ne:integer;
i:integer;
Begin
Assign(ff,'D:\oct');
Reset(ff);
Readln(ff,Nv);
For i:=1 to NV do
Readln(ff, Shape.vertices[i].x , Shape.vertices[i].y , Shape.Vertices[i].z);
Readln(ff, Ne);
For i:=1 to Ne do
Readln(ff, Shape.edges[i].src, Shape.edges[i].dest);
Shape.xc:=200; Shape.yc:=200;Shape.zc:=0;
Close(ff);
End;
procedure ShowShape(Shape: Object3D);
var
i:integer;Xs,Ys:real;
x,y,z:real;
const
n=300;
Begin
For i:=1 to High(Shape.edges) do
Begin
x:=Shape.vertices[Shape.edges[i].src].x+Shape.xc;
y:=Shape.vertices[Shape.edges[i].src].y+Shape.yc;
z:=Shape.vertices[Shape.edges[i].src].z+Shape.zc;
If abs(z)<0.01 then z:=0.01;
Xs:=320+x-y*cos(pi/4);
Ys:=240+y*sin(pi/4)-z;
MoveTo(Round(Xs/2),Round(Ys/2));
x:=Shape.vertices[Shape.edges[i].dest].x + Shape.xc;
y:=Shape.vertices[Shape.edges[i].dest].y + Shape.yc;
z:=Shape.vertices[Shape.edges[i].dest].z + Shape.zc;
If abs(z)<0.01 then z:=0.01;
Xs:=320+x-y*cos(pi/4);
Ys:=240+y*sin(pi/4)-z;
LineTo(Round(Xs/2),Round(Ys/2));
End;
End;
Begin
LoadObject3D(model);
gm:=detect; gd:=1;
InitGraph(gm,gd,'');
ShowShape(Model);
Repeat
T:=readkey;
case t of
#49: Begin
ClearDevice;
RotateShape(pi/24,0,0,model);
ShowShape(Model);
End;
#50: Begin
ClearDevice;
RotateShape(0,pi/24,0,model);
ShowShape(Model);
End;
#51: Begin
ClearDevice;
RotateShape(0,0,pi/24,model);
ShowShape(Model);
End;
End;
until t=#27;
CloseGraph;
End.