IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> З-х звенный манипулятор, В трехмерном пространстве
Ametist
сообщение 1.07.2008 12:40
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  0  +


От теоретической части, я перешел к решению задачи. Сначала я сделал просто три линии, которые были связаны между собой, и каждая из которых вращалась в полярной системе координат, но такую работу у меня не приняли и приходится начинать все сначала.
И я поставил себе такую задачу: "Построить три октаэдра, которые бы произвольно вращались относительно любых трех осей координат и были свзяны между собой". Пока вопрос такой, у меня не получается построить сам октаэдр..
Код вот...
 
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.



Xs:= Round(GetMaxX div 2 + N*x/z);
Ys:= Round(GetMaxY div 2 + N*y/z);
Все дело умирает на этих вдух строчках, пишет "error 205 Floating point overflow". Вопрос как это исправить, чтобы все работало?
Внутренность тхт файла выглядит вот так...
6
-100 -100 0
-100 100 0
100 100 0
100 -100 0
0 0 -141.42
0 0 141.42
12
0 1
1 2
2 3
3 0
4 0
4 1
4 2
4 3
5 0
5 1
5 2
5 3
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Ametist
сообщение 2.07.2008 19:21
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской

Репутация: -  0  +


Отрисовать и завертеть параллелепипед я сумел. Спасибо еще раз 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.


Содержимое файла для считывания выглядит вот так:
8
-10 -5 0
-10 5 0
10 5 0
10 -5 0
-10 -5 100
-10 5 100
10 5 100
10 -5 100
12
1 2
2 3
3 4
4 1
5 6
6 7
7 8
8 5
5 1
6 2
7 3
8 4
Теперь мне остался последний штрих, надо связать три таких параллелепипеда, и сделать так,чтобы когда крутился первый, крутились бы второй и третий. Все бы хорошо, НО. Когда я кручу второй вместе с третим, то они улетают от первого. Вопрос как сделать так, чтобы оси для второго выходили из конца первого параллелепипеда?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 12.08.2025 10:25
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"