Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2011, 10:14   #1
lDrakonl
 
Аватар для lDrakonl
 
Регистрация: 10.02.2011
Сообщений: 3
По умолчанию Додекаэдр

Всем доброго времени суток.
Есть задача на паскале:
Нарисовать матовый цветной освещенный солнцем додекаэдр.
Собственно вопрос как нарисовать этот самый додекаэдр.

Додека́эдр — правильный многогранник, составленный из двенадцати правильных пятиугольников. Каждая вершина додекаэдра является вершиной трёх правильных пятиугольников.

Нашел что-то похожее на координаты, но разобратся с ними так и не смог(ресурс англоязычный) - http://www.scienceu.com/geometry/fac...ds/dodeca.html
lDrakonl вне форума Ответить с цитированием
Старый 24.03.2011, 16:31   #2
lDrakonl
 
Аватар для lDrakonl
 
Регистрация: 10.02.2011
Сообщений: 3
По умолчанию

Додекаедр побежден.

Додекаедр стрится вокруг куба. Более подробно тут - http://www.slidefinder.net/М/МОУ_Ела..._школа/3373334

Освещенность гранией определяется по формуле:
I= kр *Iр + kн* Iн*cos ,

где I - яркость поверхности;
kр - коэффициент отражения рассеянного света (kд<1);
kн - коэффициент отражения направленного света;
Iр - интенсивность рассеянного света;
Iн - интенсивность падающего света;
 - угол между направлением света и нормалью к поверхности.

Для построения исспользуется изометрическая проекция.
Закрашиваются только видимые грани. Названия процедур помоему досточно говорящие чтобы можно было разобратся.
{------------------------------------------------}
PHP код:
program Dodik;
uses
   Graph
crt;
type
   t3Dpoint 
record
      X
YZreal;
   
end;
   
t2DPoint record
      X
Yinteger;
   
end;
   
tPlane record
      A
BCDreal;
      
P: array [0..4of t3DPoint;
   
end;
   
tPlanes = array [1..12of tPlane;

Const
   
Sx =  1000;
   
Sy =  500;
   
Sz =  1000  ;
   
Kp =  0.9;
   
Ip =   15;
   
Kn =  0.8;
   
Inn 60;
var
   
D: array [1..20of t3DPoint;
   
PltPlanes;


{----------------------------------------------}
procedure CreatePlane(P1P2P3P4P5t3DPoint; var PltPlane);
var
   
pqt3DPoint;
begin
   Pl
.P[0] := P1;
   
Pl.P[1] := P2;
   
Pl.P[2] := P3;
   
Pl.P[3] := P4;
   
Pl.P[4] := P5;
   
p.:= P2.P1.Xp.:= P2.P1.Yp.:= P2.P1.Z;
   
q.:= P3.P1.Xq.:= P3.P1.Yq.:= P3.P1.Z;
   
Pl.:=  p.Y*q.q.Y*p.Z;
   
Pl.:= -p.X*q.q.X*p.Z;
   
Pl.:=  p.X*q.q.X*p.Y;
   
Pl.:= -Pl.A*P1.Pl.B*P1.Pl.C*P1.Z;
   if 
Pl.>= 0 then begin
      Pl
.:= -Pl.APl.:= -Pl.BPl.:= - Pl.C;
      
Pl.:= -Pl.A*P1.Pl.B*P1.Pl.C*P1.Z;
   
end;
end;
{----------------------------------------------}
procedure Proection(P3t3DPoint; var P2t2DPoint);
begin
   P2
.:= round(sqrt(3)*(P3.P3.X)/2);
   
P2.:= round(P3.- (P3.P3.Y)/2);
end;
{----------------------------------------------}
procedure Scale(var Pt2DPoint);
begin
   P
.:= P.GetMaxX div 2;
   
P.:= GetMaxY div 2 P.Y;
end;
{----------------------------------------------}
Function 
Intensity(uvreal): integer;
Var
   
CosA real;
   
xyreal;
Begin
   x
:= sx u;
   
y:= sy v;
   
z:= sz w;
   
CosA:= (x*y*z*w) /
           ((
Sqrt(u*v*+w*w)*sqrt(x*y*z*z)));
   if 
CosA 0 then
      CosA
:= 0;
   
intensity := trunc(Kp*Ip Kn *Inn*cosA);
end;
{----------------------------------------------}
Procedure drawPlane(integer);
Var
   
P    t2DPoint;
   
P3   t3DPoint;
   
a    : array[0..4of t2DPoint;
   
i    integer;
   
xyreal;
   
c    integer;
Begin
   x
:= 0;
   
y:= 0;
   
z:= 0;
   for 
i:= 0 to 4 do begin
         x
:= Pl[j].P[i].x;
         
y:= Pl[j].P[i].y;
         
z:= Pl[j].P[i].z;
         
Proection(Pl[j].P[i], P);
         
Scale(P);
         
a[i].x:= p.x;
         
a[i].y:= p.y;
    
end;
   
x:= x/5;
   
y:= y/5;
   
z:= z/5;
   
c:= Intensity(xyz);
   
SetColor(c);
   
SetFillStyle(1c);
   
FillPoly(5a);
end;
{----------------------------------------------}
procedure Draw(areal);
var
   
P    t2DPoint;
   
iinteger;
   
P3   t3DPoint;
begin
   P3
.:= aP3.:= aP3.:= a;
   for 
:= 1 to 12 do
      if 
Pl[j].A*P3.Pl[j].B*P3.Pl[j].C*P3.0 then begin
         drawPlane
(j);
      
end;
end;
{----------------------------------------------} 
lDrakonl вне форума Ответить с цитированием
Старый 24.03.2011, 16:32   #3
lDrakonl
 
Аватар для lDrakonl
 
Регистрация: 10.02.2011
Сообщений: 3
По умолчанию

PHP код:
{----------------------------------------------}
procedure CreateDod(areal);
var
   
bhh1real;
   
iinteger;
begin
   b 
:= a*sin(108*pi/180)/sin(36*pi/180);
   
:= sqrt(3/4*a*b*b/a*b/2);
   
h1 := (a)/2;
   
D[1].:=  b/2D[1].:=      b/2D[1].:=     b/2;
   
D[2].:=    0D[2].:= b/h1D[2].:= b/h;
   
D[3].:= -b/2D[3].:=      b/2D[3].:=     b/2;
   for 
:= 1 to 3 do begin
      D
[6-i+1].:= D[i].XD[6-i+1].:= -D[i].YD[6-i+1].:= D[i].Z;
   
end;
   for 
:= 1 to 6 do begin
      D
[12-i+1].:= D[i].XD[12-i+1].:= D[i].YD[12-i+1].:= -D[i].Z;
   
end;
   
D[13].:=  D[2].ZD[13].:= D[2].XD[13].:= D[2].Y;
   
D[14].:=  D[5].ZD[14].:= D[5].XD[14].:= D[5].Y;
   
D[15].:= -D[2].ZD[15].:= D[2].XD[15].:= D[2].Y;
   
D[16].:= -D[5].ZD[16].:= D[5].XD[16].:= D[5].Y;

   
D[17].:= D[2].YD[17].:=  D[2].ZD[17].:= D[2].X;
   
D[18].:= D[5].YD[18].:=  D[5].ZD[18].:= D[5].X;
   
D[19].:= D[2].YD[19].:= -D[2].ZD[19].:= D[2].X;
   
D[20].:= D[5].YD[20].:= -D[5].ZD[20].:= D[5].X;
end;
{----------------------------------------------}
procedure CreatePlanes(dangreal);
begin
   CreatePlane
(D1], D2], D5], D6], D[13], Pl1]);
   
CreatePlane(D3], D2], D5], D4], D[15], Pl2]);
   
CreatePlane(D[16], D9], D8], D[11], D[10], Pl3]);
   
CreatePlane(D8], D[11], D[12], D[14], D7], Pl4]);
   
CreatePlane(D1], D[13], D[14], D[12], D[17], Pl5]);
   
CreatePlane(D[13], D[14], D7], D[19], D6], Pl6]);
   
CreatePlane(D[16], D[15], D3], D[18], D[10], Pl7]);
   
CreatePlane(D[16], D[15], D4], D[20], D9], Pl8]);
   
CreatePlane(D[17], D[18], D3], D2], D1], Pl9]);
   
CreatePlane(D[17], D[18], D[10], D[11], D[12], Pl[10]);
   
CreatePlane(D[19], D[20], D4], D5], D6], Pl[11]);
   
CreatePlane(D[19], D[20], D9], D8], D7], Pl[12]);
end;
{----------------------------------------------}
procedure GraphInit;
var
   
GDGMinteger;
   
integer;
begin
   GD 
:= installUserDriver('svga256'nil);
    
GM := 2;
   
InitGraph(GDGM'');
   if 
GraphResult <> grOK then begin
      writeln
('ќв® ®зҐ*м *Ґ е®а®иЁ© Є®¬ЇмовҐа, ** *с¬ Ја*дЁЄ* *Ґ а*Ў®в*Ґв...');
      
readln;
      
halt(1);
   
end
   
else
      for 
i:= 0 to 255 do
         
SetRgbPalette(ii0i);
end;
{----------------------------------------------}
var
   
aangreal;
begin
   writeln
('‡*¤*©вҐ ¤«Ё*г аҐЎа* ЄгЎ*');
   
readln(a);
   
GraphInit;
   
CreateDod(a);
   
CreatePlanes(pi/180);
   
Draw(a);
   
readln;
   
CloseGraph;
end
ЗЫ
Всем поколениям ПриМата и Дяде Сереж привет!
lDrakonl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить класс описывающий додекаэдр. С++ varlonec Помощь студентам 0 26.01.2010 18:23
ДОДЕКАЭДР!!! Dимок Помощь студентам 0 01.05.2009 20:38
Додекаэдр Fandaret Помощь студентам 1 31.01.2009 18:01