Przesunięcie obrazu o zadany wektor

0

Witam,

na początek chciałbym zaznaczyć, że z javą za wiele wspólnego nie miałem dotychczas i dopiero się uczę ;) ,więc prosiłbym o wyrozumiałość.

Szukam (niestety bezskutecznie,póki co) pomocy w dopisaniu metody do jednej z klas programu. Metoda powinna przesunąć narysowany obrazek o zadany wektor. Niestety moje próby kończą się niepowodzeniem. Byłbym więc wdzięczny za jakieś rady / wskazówki.

Kod klasy dla której potrzebna jest metoda (na wszelki wypadek)

public class Draw_pad extends JComponent 
{
	private static final long serialVersionUID = 7347455026837469877L;

	private Image image;
	private Graphics2D graphic;
	private int current_x,current_y,previous_x,previous_y;
	private int [] bounds = null;
	
	public Draw_pad()
	{
		
		setDoubleBuffered(false);
		addMouseListener(new MouseAdapter()
		{
			@Override
			public void mousePressed(MouseEvent me) 
			{
				previous_x=me.getX();
				previous_y=me.getY();
			}
		});
		addMouseMotionListener(new MouseAdapter()
		{
			@Override
			public void mouseDragged(MouseEvent me)
			{
				current_x=me.getX();
				current_y=me.getY();
				if(graphic!=null)
					graphic.drawLine(previous_x, previous_y, current_x, current_y);
				repaint();
				previous_x=current_x;
				previous_y=current_y;
			}	
		});
		
		
		
	}
	
	public void clear()
	{
		graphic.setColor(Color.WHITE);
		repaint();
		graphic.fillRect(0, 0, getSize().width, getSize().height);
		graphic.setColor(Color.BLACK);
		//bounds=null;
	}
	
	@Override
	protected void paintComponent(Graphics g) 
	{
		if(image == null)
		{
			image = createImage(getSize().width, getSize().height);
			graphic = (Graphics2D) image.getGraphics();
			graphic.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			clear();

		}
		g.drawImage(image, 0, 0, null);
	}
}
 

PS. kod nie do końca autorski,jako że pracuję nad programem ze znajomym i akurat to on zaproponował to rozwiązanie - jeśli więc można coś poprawić , również prosiłbym o komentarz :)

Z góry dziękuję.

1

Dodaj sobie pola na współrzędne obrazka (np. imageX i imageY).
W paintComponent rysuj używając tych współrzędnych g.drawImage(image, imageX, imageY, null);
A Twoja nowa metoda niech po prostu przesuwa aktualne współrzędne o zadany wektor.

0

Hmm a czy współrzędne zostaną zachowane, czy też cały "układ/rysunek" przesunie się na ekranie?

np użytkownik narysuje linię - początek w pkt [5,13] - po przesunięciu współrzędne będą [5,13] czy 5+x,13+y?

0

Dziwne pytanie ;)
To zależy od Ciebie. Chcesz metodę przesuwającą rysunek o wektor, więc wystarczy, że przesunie imageX i imageY o odpowiednie współrzędne.

Jeśli chcesz tą narysowaną przez użytkownika linię traktować jako wektor to po prostu przekaż tej metodzie [liniaKoniecX - liniaPoczatekX, liniaKoniecY - liniaPoczatekY]

Edit:
Dopiero zobaczyłem co Ty tam rysujesz ;)
Możesz dodać jakiś dodatkowy, mały obrazek do komponentu i to na nim stosować przesuwanie. Żeby zachować stabilne "tło".

0

Dzięki za pomoc,

niezależnie szukałem nadal rozwiązania i wymyśliłem coś takiego :

public void shiftImage(int sx,int sy)
	{
			Graphics2D g = (Graphics2D) image.getGraphics();
			AffineTransform old = g.getTransform();
			AffineTransform new_ = new AffineTransform();
			new_.translate(sx, sy);
			g.setTransform(new_);
			g.drawImage(image, new_,this);
			g.setTransform(old);
			repaint();

	} 

działa do połowy tak jak bym tego oczekiwał - rysunek pojawia się w nowym miejscu,ale jest powielony :( - nadal zostaje w starym miejscu a przesunięta jest jego kopia. czy można to jakoś szybko poprawić ?

0

Jeśli tak to może zamiast tego:

AffineTransform old = g.getTransform();
AffineTransform new_ = new AffineTransform();
new_.translate(sx, sy);
g.setTransform(new_);
g.drawImage(image, new_,this);
g.setTransform(old);

Spróbuj po prostu:

g.translate(sx,sy);
0

Spróbuj po prostu:
g.translate(sx,sy);

niestety nie do końca działa :( - program wpada mi w pętlę.

czy w kodzie który zaproponowałem da się jakoś oczyścić zawartość przed przerysowaniem? bo w sumie narysowana zawartość się przesuwa - o co zasadniczo mi chodziło, tylko jest powielona, więc jakby dało się pozbyć "starego" rysunku byłoby ekstra :)

0

Możesz użyć np. g.clearRect() podając cały region obrazka do wyczyszczenia.

Edit:
Chociaż różnie się może zachować bo rysujesz na tym samym obrazku, z którego jest graphics... Trochę rekursją pachnie ;)

0

W którym miejscu?
Bo chyba jeśli wyczyszczę przed transform to nie będzie co przesunąć a jak po - wyczyszczę zarówno "stary" jak i "nowy" kształt ? chyba że się mylę.

0

Prawdę rzeczesz ;)
Dlatego trochę niefajnie jest rysować obrazek na samym sobie. Możesz zrobić drugi i do niego rysować wersję przesuniętą, i ten nowy dopiero na komponent.

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