0% found this document useful (0 votes)
4 views8 pages

Java 2d

tema 3
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views8 pages

Java 2d

tema 3
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

26/9/2019 Clipping in Java 2D

Home Contents Subscribe Previous Nex

Clipping
In this part of the Java 2D tutorial, we will talk about clipping.

Clipping

Clipping is restricting of drawing to a certain area. This is done for efficiency reasons and to create various
effects. When working with the clip, we must either work with a copy of the Graphics object or to restore
the original clip attribute. Changing the clip does not affect existing pixels; it affects future rendering only.

In the following example we will be clipping an image to a circle shape.

[Link]

package [Link];

import [Link];
import [Link];
import [Link];
import [Link].Graphics2D;
import [Link];
import [Link];
import [Link];
import [Link].Ellipse2D;
import [Link];
import [Link];
import [Link];
import [Link];

class Surface extends JPanel


implements ActionListener {

private int pos_x = 8;


private int pos_y = 8;
private final int RADIUS = 90;
private final int DELAY = 35;

private Timer timer;


private Image image;

private final double delta[] = { 3, 3 };

public Surface() {

loadImage();
determineAndSetImageSize();
initTimer();
[Link]/gfx/java2d/clipping/ 1/8
26/9/2019 Clipping in Java 2D

private void loadImage() {

image = new ImageIcon("[Link]").getImage();


}

private void determineAndSetImageSize() {

int h = [Link](this);
int w = [Link](this);
setPreferredSize(new Dimension(w, h));
}

private void initTimer() {

timer = new Timer(DELAY, this);


[Link]();
}

private void doDrawing(Graphics g) {

Graphics2D g2d = (Graphics2D) [Link]();

[Link](new [Link](pos_x, pos_y, RADIUS, RADIUS));


[Link](image, 0, 0, null);

[Link]();
}

@Override
public void paintComponent(Graphics g) {

[Link](g);
doDrawing(g);
}

@Override
public void actionPerformed(ActionEvent e) {

moveCircle();
repaint();
}

private void moveCircle() {

int w = getWidth();
int h = getHeight();

if (pos_x < 0) {

delta[0] = [Link]() % 4 + 5;
} else if (pos_x > w - RADIUS) {

delta[0] = -([Link]() % 4 + 5);


}

[Link]/gfx/java2d/clipping/ 2/8
26/9/2019 Clipping in Java 2D

if (pos_y < 0 ) {

delta[1] = [Link]() % 4 + 5;
} else if (pos_y > h - RADIUS) {

delta[1] = -([Link]() % 4 + 5);


}

pos_x += delta[0];
pos_y += delta[1];
}
}

public class ClippingEx extends JFrame {

public ClippingEx() {

initUI();
}

private void initUI() {

setTitle("Clipping");

add(new Surface());

pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}

public static void main(String[] args) {

[Link](new Runnable() {

@Override
public void run() {
ClippingEx cl = new ClippingEx();
[Link](true);
}
});
}
}

A circle is moving on the screen and showing a part of the underlying image. This is as if we looked through
a hole.

Graphics2D g2d = (Graphics2D) [Link]();

We create a copy of the Graphics2D object. Thus changing the clip will not affect other Swing parts where
the Graphics2D object is reused.

[Link](new [Link](pos_x, pos_y, RADIUS, RADIUS));

[Link]/gfx/java2d/clipping/ 3/8
26/9/2019 Clipping in Java 2D

The clip() method combines the existing clip with the shape given as an argument. The resulting
intersection is set to be the clip. In our case, the resulting clip is the circle shape.

if (pos_x < 0) {

delta[0] = [Link]() % 4 + 5;
} else if (pos_x > w - RADIUS) {

delta[0] = -([Link]() % 4 + 5);


}

If the circle hits the left or the right side of the window, the direction of the circle movement changes
randomly. Same applies for the top and bottom sides.

[Link]();

When we are done with the painting, we must release the copy of the Graphics2D object.

Clipping shapes

In the following example, we will be clipping to the intersection of two shapes: a rectangle and a circle.

[Link]

package [Link];

import [Link];
import [Link];
import [Link];
import [Link].Graphics2D;
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link].Ellipse2D;
import [Link];
import [Link];
import [Link];
import [Link];

class Surface extends JPanel


implements ActionListener {

private Timer timer;


private double rotate = 1;
private int pos_x = 8;
private int pos_y = 8;
private final double delta[] = {1, 1};

[Link]/gfx/java2d/clipping/ 4/8
26/9/2019 Clipping in Java 2D

private final int RADIUS = 60;

public Surface() {

initTimer();
}

private void initTimer() {

timer = new Timer(10, this);


[Link]();
}

private void doDrawing(Graphics g) {

Graphics2D g2d = (Graphics2D) g;

[Link](RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

[Link](RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);

Shape oldClip = [Link]();

int w = getWidth();
int h = getHeight();

Rectangle rect = new Rectangle(0, 0, 200, 80);

AffineTransform tx = new AffineTransform();


[Link]([Link](rotate), w / 2, h / 2);
[Link](w / 2 - 100, h / 2 - 40);

Ellipse2D circle = new [Link](pos_x, pos_y,


RADIUS, RADIUS);

GeneralPath path = new GeneralPath();


[Link]([Link](rect), false);

[Link](circle);
[Link](path);

[Link](new Color(110, 110, 110));


[Link](circle);

[Link](oldClip);

[Link](circle);
[Link](path);
}

@Override
public void paintComponent(Graphics g) {
[Link](g);

[Link]/gfx/java2d/clipping/ 5/8
26/9/2019 Clipping in Java 2D

doDrawing(g);
}

public void step() {

int w = getWidth();
int h = getHeight();

rotate += 1;

if (pos_x < 0) {

delta[0] = 1;
} else if (pos_x > w - RADIUS) {

delta[0] = -1;
}

if (pos_y < 0) {

delta[1] = 1;
} else if (pos_y > h - RADIUS) {

delta[1] = -1;
}

pos_x += delta[0];
pos_y += delta[1];
}

@Override
public void actionPerformed(ActionEvent e) {

step();
repaint();
}
}

public class ClippingShapesEx extends JFrame {

public ClippingShapesEx() {

initUI();
}

private void initUI() {

setTitle("Clipping shapes");

add(new Surface());

setSize(350, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}

public static void main(String[] args) {

[Link]/gfx/java2d/clipping/ 6/8
26/9/2019 Clipping in Java 2D

[Link](new Runnable() {

@Override
public void run() {
ClippingShapesEx ex = new ClippingShapesEx();
[Link](true);
}
});
}
}

In our example, we have a bouncing circle and a rotating rectangle. When these shapes overlap, the resultin
area is filled with colour.

Shape oldClip = [Link]();

Since we did not create a copy of the Graphics2D object, we store the old clip for later use. In the end, we
must reset the clip to the original one.

Rectangle rect = new Rectangle(0, 0, 200, 80);

AffineTransform tx = new AffineTransform();


[Link]([Link](rotate), w / 2, h / 2);
[Link](w / 2 - 100, h / 2 - 40);

The rectangle is being rotated. It is always positioned in the middle of the panel.

GeneralPath path = new GeneralPath();


[Link]([Link](rect), false);

Here we get the shape of the rotated rectangle.

[Link](circle);
[Link](path);

[Link](new Color(110, 110, 110));


[Link](circle);

Here we restrict drawing to the intersection of the two shapes. If they overlap, the interior of the resulting
shape is filled with colour. The clip() method combines the initial clip (the component's client area) with
the given two shapes.

[Link](oldClip);

With the setClip() method, we reset the clip area to the old clip before we draw the shapes. Unlike the
clip() method, the setClip() does not combine clipping areas. It resets the clip to the new area.
Therefore, this method should be exclusively used in restoring the old clip.

[Link]/gfx/java2d/clipping/ 7/8
26/9/2019 Clipping in Java 2D

Figure: Clipping shapes

In this part of the Java 2D tutorial, we have talked about clipping.

Home Contents Top of Page Previous Nex


ZetCode last modified April 14, 2015 © 2007 - 2019 Jan Bodnar Follow on Facebook

[Link]/gfx/java2d/clipping/ 8/8

You might also like