|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
создание Параллелепипед из 3х параллелограммов, нужна помощь
Ребята, очень нужна помощь и к сожалению чем раньше тем лучше
Нужно создать Параллелепипед, он должен собираться из трех параллелограммов. Я частично сделала, а точнее: сделала форму, на которой выводиться размеры объекта, начальное положение, НО это всё для одного параллелограмма, а не для Параллелепипед! не выходит создать все 3 параллелограмма, чтобы они соединялись и образовали Параллелепипед. вот более точное задание: Размеры и положение объекта указываются пользователем (в ходе выполнения программы). Объект (по команде пользователя) должен вращаться вокруг одной из осей координат. Скорость вращения объекта является одним из свойств класса (не обязательно, но если знаете как буду очень признательна ). При создании объекта пользователь должен иметь возможность задавать: • размеры объекта; • начальное положение; • цвет объекта; • скорость вращения; • выбирать ось, относительно которой будет вращаться объект. Разработать программу с использованием этого класса. |
#2
|
|||
|
|||
я блондинка попытаюсь на пальцах объяснить как это должно выглядеть
выводиться размеры объекта, начальное положение | V рисуется параллелепипед (а они рисуются из 3х параллелограммов) | V и под формой начальных данных X, Y, R указывается угол на который поворачивается параллелепипед (то есть три параллелограмма соединяются в один объект) я сама пыталась разобраться и сюда решила написать в последний момент, мне после выходных сдавать буду рада любой помощи!!!! Заранее спасибо!!! |
#3
|
||||
|
||||
Сашенька, мог бы Вам помочь, но слишком пьян)))
|
#4
|
|||
|
|||
ну вы "выздоравливайте"
если будет возможность сегодня (в воскресенье) вечером-ночью помочь, буду очень рада!! Последний раз редактировалось alexandra, 19.06.2011 в 05:48. |
#5
|
|||
|
|||
обновления темы =), что то получилось, но не до конца
Ребята! с большей частью задачи справилась, уже рисуется куб по заданным параметрам. Я сама вижу что в коде много "мусора", не могли бы вы мне помочь, как то оптимизировать.
На данный момент, я не разобралась и не получается исправить следующие проблемы: 1) рисуется фигура, потом если задаем новые координаты и размеры, фигура перерисовывается, но не стирает прошлые линии Первую проблему решила вот так: Код:
procedure TForm1.Button1Click(Sender: TObject); begin PatBlt(Form1.Canvas.Handle, 0, 0, Form1.ClientWidth, Form1.ClientHeight - Shape1.ClientHeight - 6, WHITENESS); end; 3 и наверное самое сложное, я не могу доделать перерисовку фигуры в зависимости заданного градуса Буду рада,если подскажите решение хоть одной проблемки Последний раз редактировалось alexandra, 26.06.2011 в 19:00. Причина: up |
#6
|
||||
|
||||
Цитата:
|
#7
|
|||
|
|||
Цитата:
у меня пере наследование и тп.. всё перепутано и нормально уже не работает |
#8
|
||||
|
||||
Так и рисуется. Я сейчас ковыряюсь в исходниках, но пока стараюсь отойти от наследования для упрощения. А там видно будет.
Последний раз редактировалось angvelem, 26.06.2011 в 23:59. |
#9
|
|||
|
|||
Цитата:
столько раз исправляла, сперва рисовало всё нормально (серый куб с черными гранями) но после перерисовки, оставался след фигуры.. пока избавлялась, пришлось это дело убрать)) в общем.. проблема решена))) осталось самое сложное! чтоб поворачивалось на заданный градус если это как то упростит задачу.. прикрепляю исходники не моего куда.. там тоже не используется openGL там фигура поворачивается по x, y, z стрелочками клавиатуры я оттуда вырвала кусочек, можно заметить: Код:
procedure TCube.RotateY(a: single; var x, y, z: single); var xx,zz,c,s:single; begin a:=30; c:=cos(a*pi/180); // матрица поворота имеет вид s:=sin(a*pi/180); xx:=x*c+z*s; zz:=-x*s+z*c; // |CosX 0 -sinX | x:=xx; // Ry=| 0 1 0 | y:=y; // |SinX 0 CosX| z:=zz; end; |
#10
|
||||
|
||||
Тогда, посмотри этот проект, может подойдёт
|
#11
|
||||
|
||||
друзья-товарищи, если куб должен быть залитым, не забудьте позаботиться об удалении не видимых граней, используя при этом метод отброса не лицевых граней. Проверка на то, повернута ли вам грань передом или задом происходит следующим способом:
дана грань с вершинами V1,V2,V3. Соответственно каждая вершина состоит из координат x,y,z. находим некоторые коэффициенты. A=(V2.y-V1.y)*(v3.z-V1.z)-(V2.z-V1.z)*(v3.y-V1.y) B=(V2.z-V1.z)*(v3.x-V1.x)-(V2.x-V1.x)*(v3.z-V1.z) C=(V2.x-V1.x)*(v3.y-V1.y)-(V2.y-V1.y)*(v3.x-V1.x) далее проверяем если c*focus_kamera+A*V1.x+B*V1.y+C*V1.z<0 то рисуем грань. focus_kamera это фокусное расстояние, значение которого используется при проекции трехмерных координат на двухмерную плоскость, т.е. на ваш монитор. В основном я его беру равным 250-300 Если грань не нарисуется то поменяйте знак < на >, т.к. там имеет значение то, в каком порядке у вас идет обход граней, либо по часовой стрелке , либо против... вот собственно нахождение двухмерных координат зная трехмерные X2D:=(WindowWidth/2+FOCUS_KAMERA*(V.X3D) /(FOCUS_KAMERA+V.Z3DP)); Y2D:=(WindowHeight/2-FOCUS_KAMERA*(V.Y3DP) /(FOCUS_KAMERA+V.Z3DP)); |
#12
|
||||
|
||||
В приложенном последнем архиве это и сделано, мог бы и посмотреть перед ответом.
|
#13
|
|||
|
|||
Цитата:
проект отличный, но к сожалению, преподаватель мой код знает, тк сам помогал, и если я принесу кардинально новый проект - это будет не хорошо. Можно от туда попробовать вытащить нужные части кода, но боюсь, что в мой проект не получиться вставить это со всей запутанностью моего проекта |
#14
|
||||
|
||||
В твоём проекте, как раз и не заложена возможность сокрытия невидимых граней. При повороте такого куба (а куба как такового нет) возникнет масса проблем с перерисовкой. И, если преподователь помогал, он не мог этого не понимать.
|
#15
|
|||
|
|||
Цитата:
Значит, в моем проекте это сделать будет сложно, и легче делать новый, на основе предложенных вариантов? видимо у него свое видение и по думал, что дальше сама справлюсь =\ |