Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Intro_Java_brief_Liang2011.pdf
Скачиваний:
195
Добавлен:
26.03.2016
Размер:
10.44 Mб
Скачать

506 Chapter 15 Graphics

15.6 Drawing Arcs

An arc is conceived as part of an oval bounded by a rectangle. The methods to draw or fill an arc are as follows:

drawArc(int x, int y, int w, int h, int startAngle, int arcAngle); fillArc(int x, int y, int w, int h, int startAngle, int arcAngle);

Parameters x, y, w, and h are the same as in the drawOval method; parameter startAngle is the starting angle; arcAngle is the spanning angle (i.e., the angle covered by the arc). Angles are measured in degrees and follow the usual mathematical conventions (i.e., 0 degrees is in the easterly direction, and positive angles indicate counterclockwise rotation from the easterly direction); see Figure 15.11.

Listing 15.4 is an example of how to draw arcs; the output is shown in Figure 15.12.

(x, y)

w

 

arcAngle

h

startAngle

 

FIGURE 15.11 The drawArc method draws an arc based on an oval with specified angles.

LISTING 15.4 DrawArcs.java

 

1

import javax.swing.JFrame;

 

2

import javax.swing.JPanel;

 

3

import java.awt.Graphics;

 

4

 

 

 

 

 

 

5

public class DrawArcs extends JFrame {

 

6

 

public DrawArcs() {

 

7

 

 

setTitle("DrawArcs");

add a panel

8

 

 

add(new ArcsPanel());

 

9

}

 

 

 

 

10

 

 

 

 

 

 

11

 

/** Main method */

 

12

 

public static void main(String[] args) {

 

13

 

 

DrawArcs frame = new DrawArcs();

 

14

 

frame.setSize(250, 300);

 

15

 

frame.setLocationRelativeTo(null); // Center the frame

 

16

 

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

17

 

frame.setVisible(true);

 

18

}

 

 

 

 

19

}

 

 

 

 

 

20

 

 

 

 

 

 

21

// The class for drawing arcs on a panel

 

22

class ArcsPanel extends JPanel {

 

23

// Draw four blades of a fan

override paintComponent

24

 

protected void paintComponent(Graphics g)

{

 

25

 

 

super.paintComponent(g);

 

 

 

26

 

 

 

 

 

 

27

 

int xCenter = getWidth() / 2;

 

28

 

int yCenter = getHeight() / 2;

 

29

 

int radius = (int)(Math.min(getWidth(), getHeight()) * 0.4);

 

30

 

 

 

 

 

15.7 Drawing Polygons and Polylines 507

31int x = xCenter - radius;

32int y = yCenter - radius;

34

g.fillArc(x, y, 2

* radius, 2

* radius, 0, 30);

 

30° arc from 0°

35

g.fillArc(x, y, 2

* radius, 2

* radius, 90, 30);

 

30° arc from 90°

36

g.fillArc(x,

y,

2

* radius,

2

*

radius,

180,

30);

30° arc from 180°

37

g.fillArc(x,

y,

2

* radius,

2

*

radius,

270,

30);

30° arc from 270°

38}

39}

(x, y)

30

FIGURE 15.12 The program draws four filled arcs.

Angles may be negative. A negative starting angle sweeps clockwise from the easterly direc- negative degrees tion, as shown in Figure 15.13. A negative spanning angle sweeps clockwise from the starting

angle. The following two statements draw the same arc:

g.fillArc(x, y, 2 * radius, 2 * radius, -30, -20); g.fillArc(x, y, 2 * radius, 2 * radius, -50, 20);

The first statement uses negative starting angle -30 and negative spanning angle -20, as shown in Figure 15.13(a). The second statement uses negative starting angle -50 and positive spanning angle 20, as shown in Figure 15.13(b).

–30

–50

–20

20

(a)Negative starting angle –30 and negative spanning angle –20

(b)Negative starting angle –50 and positive spanning angle 20

FIGURE 15.13 Angles may be negative.

15.7 Drawing Polygons and Polylines

To draw a polygon, first create a Polygon object using the Polygon class, as shown in Figure 15.14.

A polygon is a closed two-dimensional region. This region is bounded by an arbitrary number of line segments, each being one side (or edge) of the polygon. A polygon comprises a list of (x, y)-coordinate pairs in which each pair defines a vertex of the polygon, and two successive pairs are the endpoints of a line that is a side of the polygon. The first and final points are joined by a line segment that closes the polygon.

Here is an example of creating a polygon and adding points into it:

Polygon polygon = new Polygon(); polygon.addPoint(40, 20);

508 Chapter 15 Graphics

polygon.addPoint(70, 40); polygon.addPoint(60, 80); polygon.addPoint(45, 45); polygon.addPoint(20, 60);

java.awt.Polygon

 

 

 

 

 

+xpoints: int[]

 

x-coordinates of all points in the polygon.

+ypoints: int[]

 

y-coordinates of all points in the polygon.

+npoints: int

 

The number of points in the polygon.

 

 

Creates an empty polygon.

+Polygon()

 

+Polygon(xpoints: int[], ypoints: int[],

 

Creates a polygon with the specified points.

npoints: int)

 

 

+addPoint(x: int, y: int)

 

Appends a point to the polygon.

 

 

 

FIGURE 15.14 The Polygon class models a polygon.

After these points are added, xpoints is {40, 70, 60, 45, 20}, ypoints is {20, 40, 80, 45, 60}, and npoints is 5. xpoints, ypoints, and npoints are public data fields in Polygon, which is a bad design. In principle, all data fields should be kept private.

To draw or fill a polygon, use one of the following methods in the Graphics class:

drawPolygon(Polygon polygon);

fillPolygon(Polygon polygon);

drawPolygon(int[] xpoints, int[] ypoints, int npoints);

fillPolygon(int[] xpoints, int[] ypoints, int npoints);

For example:

int x[] = {40, 70, 60, 45, 20}; int y[] = {20, 40, 80, 45, 60}; g.drawPolygon(x, y, x.length);

The drawing method opens the polygon by drawing lines between point (x[i], y[i]) and point (x[i+1], y[i+1]) for i = 0, ... , x.length-1; it closes the polygon by drawing a line between the first and last points (see Figure 15.15(a)).

(x[0], y[0])

(x[0], y[0])

 

(x[1], y[1])

(x[1], y[1])

(x[3], y[3])

(x[3], y[3])

(x[4], y[4])

(x[4], y[4])

(x[2], y[2])

(x[2], y[2])

(a) Polygon

(b) Polyline

FIGURE 15.15 The drawPolygon method draws a polygon, and the polyLine method draws a polyline.

15.7 Drawing Polygons and Polylines 509

To draw a polyline, use the drawPolyline(int[] x, int[] y, int nPoints) method, which draws a sequence of connected lines defined by arrays of x- and y-coordinates. For example, the following code draws the polyline, as shown in Figure 15.15(b).

int x[] = {40, 70, 60, 45, 20}; int y[] = {20, 40, 80, 45, 60}; g.drawPolyline(x, y, x.length);

Listing 15.5 is an example of how to draw a hexagon, with the output shown in Figure 15.16.

LISTING 15.5 DrawPolygon.java

1 import javax.swing.JFrame;

2 import javax.swing.JPanel;

3 import java.awt.Graphics;

4 import java.awt.Polygon;

5

6 public class DrawPolygon extends JFrame {

7public DrawPolygon() {

8setTitle("DrawPolygon");

9

add(new PolygonsPanel());

add a panel

10

}

 

11

 

 

12/** Main method */

13public static void main(String[] args) {

14DrawPolygon frame = new DrawPolygon();

15frame.setSize(200, 250);

16frame.setLocationRelativeTo(null); // Center the frame

17frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

18frame.setVisible(true);

19}

20}

21

 

 

 

 

 

 

22

// Draw a polygon in the panel

 

23

class PolygonsPanel extends JPanel {

 

24

 

protected void paintComponent(Graphics g)

{

paintComponent

25

 

 

super.paintComponent(g);

 

 

 

26

 

 

 

 

 

 

27int xCenter = getWidth() / 2;

28int yCenter = getHeight() / 2;

29int radius = (int)(Math.min(getWidth(), getHeight()) * 0.4);

31// Create a Polygon object

32Polygon polygon = new Polygon();

34// Add points to the polygon in this order

35

polygon.addPoint(xCenter + radius, yCenter);

add a point

36polygon.addPoint((int)(xCenter + radius *

37Math.cos(2 * Math.PI / 6)), (int)(yCenter – radius *

38Math.sin(2 * Math.PI / 6)));

39polygon.addPoint((int)(xCenter + radius *

40Math.cos(2 * 2 * Math.PI / 6)), (int)(yCenter – radius *

41Math.sin(2 * 2 * Math.PI / 6)));

42polygon.addPoint((int)(xCenter + radius *

43Math.cos(3 * 2 * Math.PI / 6)), (int)(yCenter – radius *

44Math.sin(3 * 2 * Math.PI / 6)));

45polygon.addPoint((int)(xCenter + radius *

46Math.cos(4 * 2 * Math.PI / 6)), (int)(yCenter – radius *

47Math.sin(4 * 2 * Math.PI / 6)));

48polygon.addPoint((int)(xCenter + radius *

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]