![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
stefi78 |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 12 Пол: Женский Реальное имя: Таня Репутация: ![]() ![]() ![]() |
Помогите пожалуйста , пирамиду нарисовала
![]() ![]() ![]() ![]() Program laba1;
uses
Graph,Crt;
type
pyram=array[1..5] of record x,y,z,v:real end;
{verts-Є(r)(r)а¤Ё вл (xyz) ўҐаиЁ дЁЈгал}
const
verts:pyram=(
(x: 0 ; y: 0; z: 40; v:1), {1-п ўҐаиЁ }
(x: 40; y: 0; z: 0; v:1), {2}
(x: 0 ; y: 0; z: -40; v:1), {3}
(x:-40; y: 0; z: 0; v:1), {4}
(x: 0; y: - 90; z: 0; v:1) );{5}
var
c: char;
Gd, Gm,i,yt : Integer; {ѓа дЁЄ }
procedure DrawPyrS(c,xt,yt:Integer);
var
i,midX,midY:Integer;
c1: byte;
ver:array[1..5] of PointType;
begin
midX:= GetMaxX div 2;
midY:= GetMaxY div 2;
for i:=1 to 5 do
begin
ver[i].x:=round(verts[i].x)+Xt+midX;
ver[i].y:=round(verts[i].y)+Yt+midY;
end;
SetColor( c );
Line(ver[1].x, ver[1].y , ver[2].x, ver[2].y);
Line(ver[1].x, ver[1].y , ver[4].x, ver[4].y);
Line(ver[1].x, ver[1].y , ver[5].x, ver[5].y);
Line(ver[2].x, ver[2].y , ver[3].x, ver[3].y);
Line(ver[2].x, ver[2].y , ver[5].x, ver[5].y);
Line(ver[3].x, ver[3].y , ver[4].x, ver[4].y);
Line(ver[3].x, ver[3].y , ver[5].x, ver[5].y);
Line(ver[4].x, ver[4].y , ver[ 5].x, ver[5].y);
end;
Procedure rotTxYz(a: Real; S: Real);{ўа 饨Ґ ў(r)ЄагЈ XYZ + Zoom}
Var
ca,sa,y1,x1,z1: Real;
i: Integer;
begin
for i:=1 to 5 do
begin
ca:=cos(a);
sa:=sin(a);
x1:= verts[i].x*ca*ca + verts[i].y*sa*ca + verts[i].z*sa;
y1:= verts[i].x*((-sa)*ca-ca*sa*sa) + verts[i].y*(ca*ca-sa*sa*sa) + verts[i].z*ca*sa;
z1:= verts[i].x*(sa*sa-ca*sa*ca) + verts[i].y*((-ca)*sa-sa*sa*ca) + verts[i].z*ca*ca;
verts[i].x:=x1*S;
verts[i].y:=y1*S;
verts[i].z:=z1*S;
end
end;
begin
{€ЁжЁ «Ё§ жЁп Ја дЁЄЁ}
Gd:= Detect;
InitGraph(Gd, Gm, 'D:\progra~1\tp\BGI'); { Џгвм Є BGI ¤а (c)ўҐа ¬ }
if GraphResult <> grOk then
Halt;
{ђЁб(r)ў ЁҐ}
yt:=-170;
repeat
for i:=1 to 50
do begin
drawpyrS(2,0,yt);
Delay(10000);
drawpyrS(0,0,yt);
rotTxYz(0.05,1.015);
yt:=yt+6
end;
for i:=1 to 50
do begin
drawpyrS(2,0,yt);
Delay(10000);
drawpyrS(0,0,yt);
rotTxYz(0.05,0.985);
yt:=yt-6
end
until Keypressed;
CloseGraph;
end.
выход esc когда пирамида находится в верхней точке stefi78, с тегами лучше смотрится, правда? ![]() Сообщение отредактировано: volvo - 2.11.2006 16:34 |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
stefi78, если спроецировать каждую вершину пирамиды на плоскость Z=0 и соединить полученные точки в том же порядке, в котором ты соединяешь вершины при отрисовке пирамиды, ты не получишь контур тени (источник света - НАД пирамидой)?
Кстати, вообще-то сначала я должен был задать вопрос "а где находится источник света?" Куда тени-то нужно отбрасывать? |
Бравый генерал |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 39 Пол: Мужской Реальное имя: Василий Репутация: ![]() ![]() ![]() |
Если
Сообщение отредактировано: Бравый генерал - 24.04.2006 19:11 |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Бравый генерал, я где-то написал слово "прямоугольно"? Разговор шел о проекции. О какой - это другой вопрос...
|
Бравый генерал |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 39 Пол: Мужской Реальное имя: Василий Репутация: ![]() ![]() ![]() |
Вообще-то я и не спорил с тобой (и ни с кем-либо еще). (По-моему ты придираешься ко мне). А слово "прямоугольно" я употребил вот почему. Ты сказал:
Цитата источник света - НАД пирамидой На каком расстоянии? Слишком маленьким это расстояние быть не может, потому что источнику света пришлось бы постоянно двигаться за пирамидой, чтобы быть над ней. Значит ты имел ввиду "довольно высоко над пирамидой", а это - ПОЧТИ (если пренебречь маленьким углом) прямоугольная проекция. Ну что ж - я исправил предыдущий свой пост, раз это имело такое большое значение. |
stefi78 |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 12 Пол: Женский Реальное имя: Таня Репутация: ![]() ![]() ![]() |
ИСТОЧНИК СВЕТА ПЕРЕД ПИРАМИДОЙ
Т.Е. ГЛАЗА (ЧЕЛОВЕКА КОТОРЫЙ СМОТРИТ НА ЭКРАН) ЯВЛЯЮТСЯ ЛАМПОЙ |
Бравый генерал |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 39 Пол: Мужской Реальное имя: Василий Репутация: ![]() ![]() ![]() |
Ага, т.е. тень вроде как на стену падает, да? Если тебе не срочно, то я напишу или сегодня ночью или завтра утром эту прогу, только немного по-другому, по своему (у тебя код немного неудобный)! (Мне самому интересно)
P.S. Здесь прямоугольную проекцию сделать легче всего, но она будет полезной (и то, совсем немного, так как тень будет лишь немного отступать от изображения пирамиды) только при наличии перспективы. Так что нужно брать за источник света точку, коей является центр экрана и оттуда проводить во все вершины лучи до пересечения со стеной. |
stefi78 |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 12 Пол: Женский Реальное имя: Таня Репутация: ![]() ![]() ![]() |
если сделаешь буду благодарна
в паскале я еще тот спец ![]() ![]() ![]() если питерский с меня пиво |
Lapp |
![]()
Сообщение
#9
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
ИСТОЧНИК СВЕТА ПЕРЕД ПИРАМИДОЙ Т.Е. ГЛАЗА (ЧЕЛОВЕКА КОТОРЫЙ СМОТРИТ НА ЭКРАН) ЯВЛЯЮТСЯ ЛАМПОЙ stefi78, если источник света действительно находится в точке, из которой смотрят (предполагается, по-видимому, что глаз один), то смотрящий никогда не увидит тени. Независимо от того, какая поверхность сзади - стена, лес - тень всегда будет загорожена самим предметом. Нужно это пояснять или понятно и так? Кроме того, обычно проще (по крайней мере для начала) иметь бесконечно удаленный источник света. Тогда лучи от него будут параллельны друг другу, и нужно задать только угол их падения. Такая ситуация совершенно реальна - например, именно так устроена тень в солнечном свете. Далее, кроме источника света, нужно задать поверхность, на которую падает тень. Если такой поверхностью является, грубо говоря, земля (пол), и Солнце светит точно из зенита, то тенью будет являться простая проекция пирамиды на плоскость z=0, то есть достаточно занулить вертикальную координату, и ты получишь тень. Но тут есть одно "но", про которое уже упоминал Бравый генерал. А именно: вся тень выродится в линию, так как горизонтальная плоскость строго перпендикулярна экрану и все ее изображение есть одна линия. Чтобы увидеть ее - Бравый генерал прав - надо вводить перспективу. Но это тема для отдельного разговора.. Мудрено я выражаюсь?.. Спрашивай, если что непонятно. ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Бравый генерал |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 39 Пол: Мужской Реальное имя: Василий Репутация: ![]() ![]() ![]() |
Цитата stefi78, если источник света действительно находится в точке, из которой смотрят (предполагается, по-видимому, что глаз один), то смотрящий никогда не увидит тени. Независимо от того, какая поверхность сзади - стена, лес - тень всегда будет загорожена самим предметом. Ну, имелось наверно ввиду, что источник света - это точка, которая находится в центре монитора, а глаза человека, т.е. камера - это весь монитор. Да, из любой точки тени центр монитора виден не будет ![]() Эскизы прикрепленных изображений ![]() |
Lapp |
![]()
Сообщение
#11
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Ну, имелось наверно ввиду, что источник света - это точка, которая находится в центре монитора, а глаза человека, т.е. камера - это весь монитор. Да, из любой точки тени центр монитора виден не будет ![]() Бравый генерал, глаза человека не могут быть всем монитором. Ты несколько путаешь понятия. Давай разберемся. Возьмем твою схему. Я не сразу понял, что есть что. Слово "Перспектива" вообще вводит в замешательство. Но потом я, кажется, понял, что ты хочешь сказать. Сейчас я выскажу свои соображения, а ты потом скажи, если с чем-то не согласен. 1. Глаз (или объектив) - это точка (точечный, малый объект). Лучи, ведущие к нему (или от него, что одно и то же), толжны все сходится на входе в глаз. Возможна, правда, ситуация, когда лучи параллельны (или почти параллельны), но она означает, что глаз просто находится бесконечно (или очень) далеко. 2. Я достроил твою схему, чтобы показать, что она на самом деле изображает (мои добавления все зеленые). Я так понял, что две боковые пунктирные линии ограничивают поле зрения. Таким образом, они должны являться продолжениями лучей, исходящих из глаза. Я продолжил их до пересечения. 3. Красные линии, по всей видимости, тоже направлены на глаз (ибо они показывают как видна тень). Таким образом, они тоже должны приходить в глаз. 4. В результате мы видим, что твоя схема неявно подразумевает, что глаз находится на некотором расстоянии от экрана (как, собственно, и есть на самом деле). Если источник света расположить как на твоей схеме, то тень действительно получается видна - она как бы вылезает за края предмета. ![]() Ты видишь разницу? stefi78 сказала: "Т.Е. ГЛАЗА (ЧЕЛОВЕКА КОТОРЫЙ СМОТРИТ НА ЭКРАН) ЯВЛЯЮТСЯ ЛАМПОЙ". И я отвечал ей в полном соответствии с ее словами. Если она имел в виду что-то другое - ну, это так и осталось в ее виду.. ![]() Конечно, можно додумать за stefi78, расположить источник и стену как надо и преподнести ей на блюдечке, но только указать на ошибки все же я считаю необходимым. Не знаю уж, нужно ли это ей.. Но я априори считаю человека который обратился сюда (а не в "задачи на заказ"), желающим обрести не только решение, но и понимание. Тема построения изображения и перспективы - это очень интересно. Она очень важна для художников и фотографов, но мало кто из них реально понимает оптику этого дела, даже лучшие из них действуют в сложных случаях по интуиции. В свое время я специально занимался этим вопросом (когда пытался немного рисовать) и открыл массу интересного (даже чисто в геометрической перспективе, я не беру сейчас в расчет психику восприятия, что тоже важно для художника). Сообщение отредактировано: lapp - 26.04.2006 3:59 -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Бравый генерал |
![]()
Сообщение
#12
|
Новичок ![]() Группа: Пользователи Сообщений: 39 Пол: Мужской Реальное имя: Василий Репутация: ![]() ![]() ![]() |
Аааа.... Я понял, что ты имеешь ввиду. Да, ты рассуждаешь абсолютно правильно! Просто я считал монитор и камерой и глазами человека, и туда же источник света помещал. Да, если расположить источник света в точке, где расположены настоящие глаза человека (немного абсурдно звучит
![]() |
Бравый генерал |
![]()
Сообщение
#13
|
Новичок ![]() Группа: Пользователи Сообщений: 39 Пол: Мужской Реальное имя: Василий Репутация: ![]() ![]() ![]() |
Сделал наконец. Прикрепляю архив. В архиве в папке две папки "bad" и "cool". "bad" сделано под стандартным EgaVga.bgi - и пирамида и тень контурами (смотрится не очень). В "cool" сделал полигонами, и с освещением, но под VESA256
![]() Uses
Graph;
А в папке "cool":Uses
VGraph;
![]() В разделе описания констант "d = 500" - z-координата вертикальной стены. Управление: w, s, a, d, ctrl+a, ctrl+d - вращательное движение пирамиды i, k, j, l, ctrl+i, ctrl+k - поступательное... ESC - выход Комментарии еще не делал... Ну, модуль прост в освоении, я думаю (там только обработка вершин и полигонов). Сообщение отредактировано: volvo - 2.11.2006 16:35 Прикрепленные файлы ![]() |
Jorik |
![]()
Сообщение
#14
|
![]() Группа: Пользователи Сообщений: 4 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
А можно узнать, где взять VESA.TPU? А то пишет Error 15: File not found (VESA.TPU).
Вы же дали VESA256... ![]() |
Бравый генерал |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 39 Пол: Мужской Реальное имя: Василий Репутация: ![]() ![]() ![]() |
А, точно! Просто у меня там в корне и Vesa.tpu, и Vesa2.tpu, и Vesa256.tpu - уже не помню что к чему))) Вот, пожалуйста.
Прикрепленные файлы ![]() |
Гость |
![]()
Сообщение
#16
|
Гость ![]() |
Прикольные картинки получаются! Только вот попробовал скомпилить - выводится сообщение
Цитата Error 70: Unit version mismaych (VGraph) Почему так? |
stefi78 |
![]() ![]()
Сообщение
#17
|
Новичок ![]() Группа: Пользователи Сообщений: 12 Пол: Женский Реальное имя: Таня Репутация: ![]() ![]() ![]() |
СПАСИБО ОГРОМНОЕ!!! за помощь
![]() ![]() ![]() к сожелению не было возможности выйти в инет и не смогла дать пояснения, но к счастью додумали за меня и абсалютно правельно |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 17:38 |