Aksonometria ukośna "prosta"

Skorzystamy z twierdzenie K. Pohlkego (1853 r)
    Trzy odcinki dowolnej długości leżące na płaszczyźnie rysunku i wychodzące z jednego punktu Oa z których nie wszystkie leżą na jednej prostej, mogą być uważane za rzut równoległy trzech odcinków równej długości, wychodzących z punktu O i wzajemnie prostopadłych.

Skorzystamy z tego twierdzenia. Załóżmy, że mamy punkt przestrzeni P(x,y,z) (patrz rysunek niżej).
Rzutnią aksonometryczną będzie płaszczyzna trójkąta (kolor zielony) - ale ekran komputera umieszczony w płaszczyżnie XY. Aplet po lewej stronie jest implementacją tego modelu.

Ten model charakteryzuje deformacja liniowa 1:skala:1 oraz kąt α pod jakim rysujemy oś Y.


W praktyce często przyjmuje się : skala=½ i α=45º. Tak przyjeto w powyższym przykładzie.

Mamy narysować taką właśnie scenę tzn mając współrzędne przestrzenne (x,y,z) , szukamy pary współrzędnych ekranowych (xe,ye). Ale oto wzory (patrz rysunek po prawej) A(x,y,z)=(xe,ye):

xe=x+y·skala·cosα
   ye=z+y·skala·sinα


Zaletą modelu jest jego prostota, wadą problem z ustaleniem kierunku rzutowania.. Sensownym wydaje się, by projekcję bryły zmieniać jedynie stosując wzory na obrót punktu w przestrzeni. Dynamiczna zmiana któregokolwiek z parametrów modelu (tzn skala lub α) jedynie wprowadza chaos w obserwacji.

Jeśli potrafisz rysować linię w przestrzeni 2-wymiarowej i jest to np procedura linia(g,Pkt p, Pkt k) , wtedy analogiczna Pkt3d.linia(g,Pkt p, Pkt k) w naszym modelu przyjmuje postać :

linia( g, p.x+skala*p.y*ca, p.z+skala*p.y*sa, k.x+skala*k.y*ca , k.z+skala*k.y*sa);
gdzie sa=sinα oraz ca=cosα

Informacje o wierzchołkach bryły (np graniastosłupa o podstawie wielokąta foremnego) możemy zgromadzić np w tablicy w typu Pkt3d, zaś narysowanie bryły jest już proste :

public void graniastoslup(int n,double r,double h)
public void rysuj(Graphics g)
{
  double fi=2*Math.PI/n;

   for(int i = 0; i <= n-1; i++)
     {	   
       w[i].war(r*Math.cos(i*fi),r*Math.sin(i*fi),-h/2);
       w[i+n].war(w[i].x,w[i].y,h/2);       
     }
 }
      
  {int i;
  for(i = 0;i < n; i++)
   {
    Pkt3d.linia(g,w[i],w[(i+1)%n]);
    Pkt3d.linia(g,w[i+n],w[n+(i+1)%n]);
    Pkt3d.linia(g,w[i],w[i+n]);
  }
}