Skalowanie rysowanych figur

0

Dzień dobry,

Męczy mnie problem skalowania, tzn. rysując trojkąt o danych wspolrzednych mieści on się w oknie, ale zmniejszając to okno ten trojkat zostaje przyciety. Mianowicie chce zeby ten trojkat pozostał w oknie w tym samym miejscu, a dodatkowo w skali takiej jak to okno zostalo zmniejszone.

Jak to ugryzc?

public void rysuj(Graphics2D g2d, Wielokat B) {
              Czworokat A = (Czworokat)B;
    Punkt a = A.getA();
    Punkt b = A.getB();
    Punkt c = A.getC();
    Punkt d = A.getD();
    
    
    int n = 4; 
    int []x = new int[n];
    int []y = new int[n];
    
    x[0]=(int)a.getX();
    x[1]=(int)b.getX();
    x[2]=(int)c.getX();
    x[3]=(int)d.getX();
    
    y[0]=(int)a.getY();
    y[1]=(int)b.getY();
    y[2]=(int)c.getY();
    y[3]=(int)d.getY();
  Polygon t = new Polygon(x,y,n); 
  g2d.drawPolygon(t);

  t.translate(500, 50);
  
    }

7768645000_1333058946.jpg

Dane poczatkowe okna:
xmax - koniec okna
xmin - poczatek okna
ymax, ymin - j/w

x1,y1 - wspolrzedne pkt

0

no i jaki problem?
jeśli okno przykładowo zmniejszyło się o połowę to masz skalę 0.5 (dzielisz nowe wymiary przez stare), mnożysz wszystkie współrzędne * 0.5 i masz wyskalowane do okna :| o to chodzi?

0

W jaki sposób podzielić stare wymiary przez nowe ? Jak to pobrać równoczesnie skoro obrazek jest cały czas rysowany od nowa po zmianie rozmiaru okna?

0

po prostu po zeskalowaniu zapamiętujesz gdzieś wymiary i w następnym przebiegu porównujesz aktualne z tymi zapamiętanymi
ale nie rób tak bo błędy się będą kumulować a jeśli zmniejszysz okno całkowicie a potem powiększysz to nasilą się do tego stopnia że figury będą całkiem zniekształcone i w dodatku się poprzemieszczają

dlatego najlepiej przyjmij jakieś wymiary okna za skalę 1:1 (nie ma znaczenia jakie) i trzymaj osobno współrzędne rzeczywiste obiektów, a rysuj z drugiej pary - przeskalowanych współrzędnych

0

W jaki sposób pobrac rozmiary okna po rozciągnięciu/zmniejszeniu ?
Funkcje getWidth() oraz getHeight() zwracaja rozmiar okna, ale poczatkowy, który się nie zmienia.

0

Przyjmij jako obowiązujące (zawsze) takie założenie, że nigdy nic nie rysujesz na konkretnym urządzeniu, ale na swoim wewnętrznym układzie współrzędnych, którego wymiary sobie sam ustalasz. Następnie wszystkie wyliczone współrzędne przeskalowujesz ze swojego układu tak aby ustalony maksymalny rozmiar Twojego układu przekładał się na aktualny rozmiar okna czy innego urządzenia na którym rysujesz.

Do tego musisz sobie jeszcze rozwiązać problem innego stosunku wysokości do szerokości (aspect ratio) okna i tego co chcesz sobie narysować - na przykład przez rozciąganie jednej osi żeby wypełnić okno lub proporcjonalne rozmieszczasz to w oknie (np. centralnie), albo po prostu obcinasz jedną ze stron (nie przejmujesz się i rysujesz -system obetnie). Żeby przeskalować używasz po prostu przeliczeń proporcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1