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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 1.07.2008 15:44
Сообщение #2


Гость






Цитата
Переделал на вот так...
Это ничего не дает... У тебя из файла читаются индексы (в Edges), начиная с 0, а не с 1-цы, и следовательно, при попытке обратиться к
x:=Shape.vertices[Shape.edges[i].src].x + Shape.xc;

(когда Shape.edges[i].src = 0) произойдет ни что иное, как выход за пределы массива... Зайди уже в меню Options -> Compiler, и включи там Range Checking (и больше никогда не отключай, если хочешь бОльшую часть времени писать программы, а не заниматься отловом глюков)

Надо было менять вот так:
...
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);
...


Но и это тебе ничего не даст... Программа все равно нерабочая. По одной простой причине: у тебя не инициализируются поля xc, yc, zc в структуре. А при вычислении X, Y и Z они используются... Все бы ничего, НО...

Ты не заполняешь сразу структуру, переданную, в Var параметр, а сначала заполняешь локальную, и только потом присваиваешь выходной структуре ее значения. Разница в твоем случае - катастрофическая: если в глобальной структуре Турбо Паскаль инициализирует все числовые значения нулем, то в локальной - ничего не инициализируется, остаются те значения, которые были в памяти на момент создания структуры...

Вот, например, при просмотре поля zc я вижу там число 4.087277324625618E+129 - представляешь, что получится в результате?
 К началу страницы 
+ Ответить 

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


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

 



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