Трёхмерная графика, Пирамида |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Трёхмерная графика, Пирамида |
art88 |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
Задача
Изобразить линию сечения правильной шестигранной пирамиды плоскостью, заданной коэффициентами своего уравнения(Основание пирамиды лежит в плоскости XOY, высота совпадает с осью Z) ---------------------------------------------------------- Проблема Подскажите, как лучше потроить усечённую пирамиду, если я знаю взаимное расположение плоскости и каждой грани(точку пересечения или то, что они параллельны или, что грань лежит в плоскости). ---------------------------------------------------------- Программа Рисует пирамиду(DrawPyr), оси координат(DrawAxes), может находить взаимное расположение граней и плоскости(Interception). (См. Pyramid.pas). Прикрепленные файлы PYRAMID.PAS ( 2.66 килобайт ) Кол-во скачиваний: 350 |
volvo |
Сообщение
#2
|
Гость |
art88, погоди... Ты же написал, что
Цитата Программа , и в то же время у тебяРисует пирамиду(DrawPyr) Цитата Проблема ... Так рисует или НЕ рисует?Подскажите, как лучше потроить усечённую пирамиду |
art88 |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
Процедура DrawPyr рисует пирамиду(не усечённую) с заданными параметрами.
|
volvo |
Сообщение
#4
|
Гость |
Ну, попробуй вот это глянуть... Я только что выдрал это из своей старой программы, рисующей 3D поверхности, может это натолкнет тебя на какую-то идею...
{$n+} |
art88 |
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
volovo, насколько я понял твоя программа строит пирамиду с задаными радиусами верхнего и нижнего основания.
Дело в том, что мне не известен радиус вверхнего основания, да и ввобще в сечении плоскостью может получится и не шестиугольник вовсе(например если плоскость совпадает с YOZ). В задаче же требуется изобразить пирамиду и ЛИНИЮ, по которой плоскость пересекает пирамиду. ------------------------------- Я немного доделал программу и теперь она рисует один из частных случаев расположения пирамиды и плоскости, но не могу понять, почему требуемая линия лежит вне пирамиды(кроме случая совпадения секущей плоскости и XOY)??? (Видимо дело в процедуре Interception) Сообщение отредактировано: art88 - Прикрепленные файлы PYRAMID2.PAS ( 3.2 килобайт ) Кол-во скачиваний: 297 |
art88 |
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
Я нашёл ошибку в Interception, обобщил задачу, решаемую программой(до требуемой), но всё равно кроме случая, когда плоскость проходит через все боковые рёбра(типа A=0 B=0 C=1 D=50) программа работает не корректно(например A=0 B=1 C=0 D=0 - вертикальная плоскость).
Принцып работы программы такой: идём по ребрам, ищем точки пересеченя, соединяем. ------------------------------------------------- Помогите пожалуйста найти ошибку/и, а то у меня две задачи осталось сдать(эта и освещённый шар), а время поджимает! Прикрепленные файлы PYR.PAS ( 4.31 килобайт ) Кол-во скачиваний: 332 |
volvo |
Сообщение
#7
|
Гость |
art88, я очень глубоко не разбирался, просто сразу бросилось в глаза: почему ты сразу же после отрисовки пирамиды ставишь указатель (MoveTo) на ее вершину? Ты что, заранее уверен, что сечение пойдет через вершину? Тогда расскажи, почему?
|
art88 |
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
Ну надо же его куда-нибудь поставить. Да и вообще, когда мы будем проводить сечение оно пройдёт или через вершину или через одно из боковых рёбер(в большинстве случаев), ну а если так, то мы сделаем LineTo и линия, соединяющая вершину с первой точкой совпадёт с боковым ребром.
|
art88 |
Сообщение
#9
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
Вообще хорошо бы делать MoveTo сразу в первую точку сечения, если она есть, этого можно добиться например заведя, какую-нибудь Булеву пременную, потавить на её истинность проверку и после перого перемещения сделать её FALSE, ну или что-нибудь в этом духе.
-------------------------- Для меня главное построить линию сечения. |
volvo |
Сообщение
#10
|
Гость |
art88, кажется я понял, в чем ошибка... Я бы на твоем месте попробовал сделать вот так (читай комментарии):
var А самое интересное - это то, что у тебя есть после всех этих операций список точек пересечения секущей плоскости с пирамидой... НО этого недостаточно. Чтобы правильно отрисовать нужную тебе кривую, ты должен построить из этих точек выпуклый полигон, то есть определить порядок соединения точек... И когда ты найдешь этот порядок, просто в соединяй точки... Все. Алгоритмы построения полигона были где-то, по-моему, даже на форуме... Попробуй это реализовать. |
art88 |
Сообщение
#11
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
volovo, следуя твоим указаниям я переделал программу(см. Pyramida.pas), добавил поцедуру, рисующую замкнутую кривую(DrawCut), добавил в процедуре Intrception проверку на принадлежность точки отрезку(intercept), но точки пересечения находятся не правильно,точнее находится одна точка, являющаяся центром основания пирамиды.
Прикрепленные файлы PYRAMIDA.PAS ( 4.41 килобайт ) Кол-во скачиваний: 317 |
volvo |
Сообщение
#12
|
Гость |
Цитата следуя твоим указаниям я переделал программу Нет, ты не следовал моим указаниям, а посему ошибки у себя будешь искать сам... Я что написал? Цитата (читай комментарии) По-твоему это для красоты? Ты не заметил, что СНАЧАЛА строится пирамида - я же написал:Цитата { До этого места - никаких изменений } Кроме того, мое замечание о построении выпуклой оболочки ты тоже предпочел не заметить? Цитата Чтобы правильно отрисовать нужную тебе кривую, ты должен построить из этих точек выпуклый полигон Ну, так пеняй на себя, потому что ты можешь даже получить правильные точки, но вот соединяться они будут в неверном порядке, как результат на экране будет бред...Извини, но я умываю руки... Если ты все делаешь не так, как тебе советуют - зачем советовать? |
art88 |
Сообщение
#13
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
И снова здраствуйте....
Вот уже которую неделю, я тщетно пытаюсь написать программу, изображающую сечение пирамиды. Профессор сказал, что решение этой задачи с отысканием точек пересечения и последующим построением их оболочки(полигона) слишком сложно. Поэтому пришлось начинать всё заново и вот, что получилось(см. Inter.pas) ------------------------- Принцип такой: Рисуем пирамиду, заполняем массив её вершинами(procedure DrawPyr) Разбиваем основание на треугольники(общая вершина - щентр основания)(procedure GenTri). Находим пересечение плоскоти с каждой стороной треугольника. Если нашли две точки соединяем. Аналогично для боковых граней(общей вершиной треугольников будет вершина пирамиды). ------------------------- Принцип новый проблеммы старые: сечение не рисуется. ------------------------- Помогите, пожалуйста, найти ошибку. P.S.: Обещаю следвать всем советам. Прикрепленные файлы INTER.PAS ( 4.26 килобайт ) Кол-во скачиваний: 277 |
art88 |
Сообщение
#14
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
Неужели, ни у кого руки не доходят проверить мою программу?
Очень надо!!!!!!!!!!!!!! |
volvo |
Сообщение
#15
|
Гость |
art88, ну НЕ НАХОДИТ твоя процедура Interception пересечений отрезка с плоскостью... Я только что попробовал чуть ли не вручную разбить на треугольники... Разбивается нормально, пересечений НЕТ! Ищи ошибку в Interception...
|
art88 |
Сообщение
#16
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
Поменял пару знаков в процедуре interception, убрал проверку на кол-во точек пересечения и программа строит
6 точек пересечения плоскости (0,0,1,50) и пирамиды, но линиями их не соединяет.(т.е программа находит по одной точке пересечения плоскости и треугольника). Сообщение отредактировано: art88 - Прикрепленные файлы INT.PAS ( 4.31 килобайт ) Кол-во скачиваний: 280 |
volvo |
Сообщение
#17
|
Гость |
Цитата программа находит по одной точке пересечения плоскости и треугольника Знаешь, почему это происходит? Программа-то может и находила бы больше, НО !!! 1. procedure Interception(l: tLine; s: tPlane);А если эту строку НЕ добавить, то после того, как хотя бы один раз intercept будет True, значение False он уже никогда не примет... Это первое. 2. procedure PlaneTri(p: tPlane; t: tTriangle); Если оставить 1 .. 2, то возможна порча значений, хранящихся в стеке ПОСЛЕ aInt (это могут быть данные или код программы)... 3. Измени направление вектора AC в треугольнике (процедура PlaneTree): { вместо } После внесения изменений ЧЕГО-ТО чертится, но я не уверен, что именно то, что нужно. Проверь... Кстати, можно внести еще несколько мелких улучшений, чтобы сократить объем программы. Нужно? |
art88 |
Сообщение
#18
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
Внёс все изменения, действительно что-то чертится, но это явно не линия пересечения. В случае горизонтальной плоскости(0,0,1,50) построенные отрезки действительно содержат точки пересечения плоскости и рёбер, но во-первых эти отрезки выходят за пирамиду а во-вторых не соединяются друг с другом.
Прикрепленные файлы INT.PAS ( 4.31 килобайт ) Кол-во скачиваний: 253 |
volvo |
Сообщение
#19
|
Гость |
Опять начинается... Я же сказал, без Intercept := False не будет у тебя ничего чертиться !!!
|
art88 |
Сообщение
#20
|
Новичок Группа: Пользователи Сообщений: 40 Пол: Мужской Реальное имя: Артём Репутация: 0 |
Volvo, извини запостил не ту программу(она вообще без изменений).
Прикрепленные файлы INT.PAS ( 4.33 килобайт ) Кол-во скачиваний: 260 |
Текстовая версия | 7.10.2024 9:52 |