Powiększanie obszaru roboczego

0

Cześć, zastanawiałem się ostatnio nad takim zagadnieniem. Szukałem w necie informacji, ale tam znalazłem jedynie rzeczy na temat powiększania obrazów.

Co planuję zrobić.
Załóżmy, że mamy ScrollBoxa. Na nim użytkownik umieszcza sobie kreskę. Tyle, że ta kreska tak naprawdę jest obiektem. Można ją kliknąć, przenieść itd. I teraz użytkownik chce powiększyć sobie obszar roboczy. Jak to zrobić najlepiej? Bo jedyne, co mi przychodzi do głowy, to żeby:

  • wyposażyć obiekt(tą kreskę) w następujące właściwości: origX, origY, origHeight, origWidth, currX, currY, currHeight, currWidth, gdzie:
    origX, origY - oryginalne położenie obiektu (skala domyślna - bez powiększenia)
    origHeight, origWidth - oryginalne rozmiary obiektu (skala domyślna)
    currX, currY - położenie obiektu po powiększeniu
    currHeight, currWidth - rozmiary obiektu po powiększeniu

I teraz tak. Załóżmy sytuację najprostszą - skala domyślna; użytkownik kładzie obiekt (tą kreskę) w obszarze roboczym i wtedy wypełniają się właściwości orig i curr(takie samo jak orig*)
Teraz użytkownik powiększa sobie obszar roboczy dwukrotnie. I jedyne, co mi przychodzi do głowy, to w jakiś magiczny sposób przeliczyć właściwości curr:

  • zwiększyć obszar roboczy x2 (w pionie i poziomie)
  • zwiększyć currHeight i currWidth x2 i w jakiś magiczny sposób obliczyć currX i currY.

Czy to jest dobry tok myślenia? Czy są do tego jakieś inne techniki/algorytmy? A może jakieś komponenty to realizujące (zamiast TScrollBox)?

0

Obiekt ma tylko i wyłacznie - origX, origY, origHeight, origWidth.
Zaś ScrollBox ma (Top, Left, Zoom) lub (Top, Left, Botoom, Right)
Przy innych konfiguracjach zwariujesz.

0

OK, ale to jak na tym zrealizować powiększanie? Załóżmy, że chcę zrobić edytor graficzny, który rysuje kółka. Tylko chciałbym móc powiększać i oddalać, jak np. w Corelu, czy InkScape. Jak zacząć?

0
{Top, Left, Zoom} Zoom:=Zoom*2; ScrollBox.Invalidate;
{Top, Left, Botoom, Right} D:=(Botoom-Top)div(2);  Top:=Top-D; Bottom:=Bottom+D; {tak samo dla Left,Right} ScrollBox.Invalidate;
0

Nie ogarniam. Próbuję na różne sposoby to zastosować, ale zazwyczaj po prostu top scrollBoxa idzie do góry, a obiekt, który jest w nim nie zmienia swoich rozmiarów.

0

Póki co, powiększam obiekty:

shape.left:=shape.left * zoom;
shape.top:=shape.top * zoom;
shape.width:=shape.width * zoom;
shape.height:=shape.height * zoom;

i niby to działa, proporcje między obiektami też są zachowane. Tylko chciałbym do tego użyć scrolla myszy i tu już nie mam pojęcia, jak obliczyć left i top obiektów (żeby działało jak powiększanie w corelu, czy inkskape).

0

Więc wywal to swoje "póki co" i zrób jak ci powiedziałem, wtedy nie będziesz miał problemów.

0

Chyba nie rozumiem, co do mnie piszesz. Z tego, co napisałeś, to mi wynika, że mam zmieniać top, left, width i height scrollBoxa?

0

Masz oddzielić wymiary realne od wymiarów wyświetlanych na ekranie. Postaraj się nie dublować wymiarów. Te ( Top, Left, Bottom, Right ) z przykładu to wymiary rzeczywisty i nie mają nic wspólnego z wyświetlanymi.

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