-
- Wstęp
- Klasa pkt3d
- Rzut równoległy
- Rzut perpektywiczny
- Jak rysować bryły
- Widoczność ściany
- Oświetlenie wielościanu
- Wykres funkcji z=f(x,y)
-
|
Oświetlenie bryły (jego ścian) wyrażę poprzez odpowiedni kolor. Ściany zwykle są "bardziej" i "mniej" oświetlone - tę cechę wyrazimy poprzez rozjaśnianie / ściemnienie koloru.
Posłużę się gradientem, który dostosuję do naszych potrzeb.
W aplecie po lewej stronie mamy przykład gradientów. Przykład (1), (2), (3) pokazuje przejście dla kolorów podstawowych (R, G i B) od koloru czarnego np do czerwonego (dla 1).
Aby uzyskać taki efekt rozpatrzę każdą składową koloru oddzielnie.
Np dla (1), będziemy zmieniali tylko sładową R w zakresie 0-255 na długości dl tzn wg wzoru: g.setColor(new Color(i*255/dl,0,0))
void paleta_zl()
{
float pr=154f/255f,dr=(254f-154f)/255f;
float pg=122f/255f,dg=(252f-122f)/255f;
float pb=40f/255f,db=40f/255f;
for(int i=0;i<91;i++)
paleta[i]=new Color(pr+i*dr/91f ,pg+i*dg/91f ,pb+i*db/91f);
}
|
Natężenie oświetlenia ściany uzależnię od "kąta padania" promieni światła (w zakresie 0°-90°).
Dlatego utworzę gradient długości 90, a jego wartości zgromadzę w tablicy paleta[]. Obok procedura generująca 90 odcieni "światła złotego" (4). Jak łatwo zauważyć jest to wybrane "górne" pasmo tego światła.
Point W(int nr)
{ int x=lo28.cal_x(rz.x);
int y=lo28.cal_y(rz.y);
pkt2d rz=_3d.rzut(w[nr]);
Point p=new Point(x ,y);
return(p);
}
//--------zamaluj ścianę boczną-----------------
void Filuj4(Graphics g,int i,int j,int k,int m)
{Point[] u= W(i),W(j),W(k),W(m)};
int[] fx={u[0].x,u[1].x,u[2].x,u[3].x},
fy={u[0].y,u[1].y,u[2].y,u[3].y};
g.setColor(paleta[kolor]);
g.fillPolygon( fx , fy , 4);
}
//-----zamaluju podstawę------------------------
void FilujP(Graphics g,int kt)
{
Point fig []=new Point[ile];
int[ ] fx=new int[ile];
int[ ] fy=new int[ile];
int i,j;
j=-1;
for(i=kt;i<kt+ile;i++)
{
j++;
fig[j]=W(i);
fx[j]=fig[j].x;
fy[j]=fig[j].y;
}
g.setColor(paleta[kolor]);
g.fillPolygon( fx , fy , ile);
}
|
Uzyskany gradient praktycznie wykorzystamy poprzez metodę klasy Graphics
fillPolygon(int[] x,int[] y,int n) .
Oznacza to dla nas przeliczenie "naszych" danych typu pkt3d (wierzchołki) na dane typu int[] (2 tablice). W klasie _3d mamy odpowiednie metody. Potrzebujemy "zamalować" 4-kąt (ściana boczna) / n-kąt (podstawy).
Obok komplet tych narzędzi.
|