![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Ametist |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
От теоретической части, я перешел к решению задачи. Сначала я сделал просто три линии, которые были связаны между собой, и каждая из которых вращалась в полярной системе координат, но такую работу у меня не приняли и приходится начинать все сначала.
И я поставил себе такую задачу: "Построить три октаэдра, которые бы произвольно вращались относительно любых трех осей координат и были свзяны между собой". Пока вопрос такой, у меня не получается построить сам октаэдр.. Код вот...
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 |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Все дело умирает на этих вдух строчках, пишет "error 205 Floating point overflow". Умирает у тебя все гораздо раньше, просто труп показывается тебе на этих 2-х строчках... Смотри:Цитата Object3D=record (процедура LoadObject3D) Цитата For i:=1 to NV do |
Ametist |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
Переделал на вот так...
Ничего не поменялась.. опять таже ошибка на том же самом месте. Или опять я что-то не так сделал? |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата Переделал на вот так... Это ничего не дает... У тебя из файла читаются индексы (в Edges), начиная с 0, а не с 1-цы, и следовательно, при попытке обратиться кx:=Shape.vertices[Shape.edges[i].src].x + Shape.xc; (когда Shape.edges[i].src = 0) произойдет ни что иное, как выход за пределы массива... Зайди уже в меню Options -> Compiler, и включи там Range Checking (и больше никогда не отключай, если хочешь бОльшую часть времени писать программы, а не заниматься отловом глюков) Надо было менять вот так: ... Но и это тебе ничего не даст... Программа все равно нерабочая. По одной простой причине: у тебя не инициализируются поля xc, yc, zc в структуре. А при вычислении X, Y и Z они используются... Все бы ничего, НО... Ты не заполняешь сразу структуру, переданную, в Var параметр, а сначала заполняешь локальную, и только потом присваиваешь выходной структуре ее значения. Разница в твоем случае - катастрофическая: если в глобальной структуре Турбо Паскаль инициализирует все числовые значения нулем, то в локальной - ничего не инициализируется, остаются те значения, которые были в памяти на момент создания структуры... Вот, например, при просмотре поля zc я вижу там число 4.087277324625618E+129 - представляешь, что получится в результате? |
Ametist |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
Огромное спасибо. Сейчас буду разбираться...
|
Ametist |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Мужской Репутация: ![]() ![]() ![]() |
Отрисовать и завертеть параллелепипед я сумел. Спасибо еще раз Volvo, очень мне помог.
Содержимое файла для считывания выглядит вот так: 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 Теперь мне остался последний штрих, надо связать три таких параллелепипеда, и сделать так,чтобы когда крутился первый, крутились бы второй и третий. Все бы хорошо, НО. Когда я кручу второй вместе с третим, то они улетают от первого. Вопрос как сделать так, чтобы оси для второго выходили из конца первого параллелепипеда? |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата Вопрос как сделать так, чтобы оси для второго выходили из конца первого параллелепипеда? У тебя же есть координаты "конца" первого параллелепипеда (ну, скажем, середина той грани, к которой крепится второй параллелепипед может быть вычислена без проблем в любое время)? так вот высчитывай положение второго "кубика" относительно начала координат, так же, как делаешь с первым, а потом, только для того, чтобы отрисовать второй "кубик" делай пересчет координат его вершин (добавляй к каждой координате каждой вершины координату "конца" первого "кубика"). Повторяю: только отрисовывать с новыми координатами.Фактически, достаточно в твою программу добавить процедуру сложения записи типа Object3D и структуры, хранящей 3 координаты X, Y, Z; и в ShowShape передавать не один параметр, а два: первый - это сам "кубик", а второй - это "концевая точка" предыдущего объекта (для первого "кубика" - нули по всем координатам), а уже внутри нее заводишь локальную переменную типа Object3D, в нее заносишь сумму Shape и той самой "концевой точки предыдущего объекта", и отрисовываешь именно ЭТУ структуру. Попробуй сделать это сам, если не получится - обращайся ![]() Кстати, твою программу можно упростить, насколько я вижу. |
![]() ![]() |
![]() |
Текстовая версия | 12.08.2025 7:46 |