• 検索結果がありません。

線分の描画

ドキュメント内 表紙 (ページ 62-68)

第 4 章 Gdk による図形の描画 47

4.3 図形の描画

4.3.2 線分の描画

線分の描画関数

線分を描画する関数には次の3種類があります.

gdk draw line

指定した2点(x1, y1),(x2, y2)を結んだ線分を描画する関数です. v o i d g d k _ d r a w _ l i n e (G d k D r a w a b l e * d r a w a b l e ,

G d k G C * gc ,

g i n t x1 ,

g i n t y1 ,

g i n t x2 ,

g i n t y 2 ) ;

gdk draw lines

GdkPoint構造体の配列で指定した点を順番に結んだ複数の線分を描画する関数です.

v o i d g d k _ d r a w _ l i n e s (G d k D r a w a b l e * d r a w a b l e ,

G d k G C * gc ,

G d k P o i n t * p o i n t s ,

g i n t n p o i n t s ) ;

gdk draw segments

GdkSegment構造体の配列で指定した複数の線分を描画する関数です.

v o i d g d k _ d r a w _ s e g m e n t s (G d k D r a w a b l e * d r a w a b l e ,

G d k G C * gc ,

G d k S e g m e n t * s e g s ,

g i n t n s e g s ) ;

GdkSegment構造体は,次のように定義されています. s t r u c t G d k S e g m e n t {

g i n t x 1 ; g i n t y 1 ; g i n t x 2 ; g i n t y 2 ; } ;

関数gdk draw linesが折れ線のような連続した線分を描画するのに対して, 関数gdk draw segmentsは図 4.1のような複数の個別の線分(セグメント)を描画する関数です.

(segs[0].x2, segs[0].y2) (segs[0].x1, segs[0].y1)

(segs[1].x1, segs[1].y1)

(segs[1].x2, segs[1].y2) (segs[2].x2, segs[2].y2)

(segs[2].x1, segs[2].y1)

図4.1 複数セグメントの描画

線分の属性

線分を描画する際には,線分に対して次の属性を設定することができます.

線分の種類

線分の種類には,表4.1に示した3種類があります. 点線を描画する場合には,関数gdk gc set dashes で点線の間隔を設定することができます.

v o i d g d k _ g c _ s e t _ d a s h e s (G d k G C * gc ,

g i n t d a s h _ o f f s e t , g i n t 8 d a s h _ l i s t [] , g i n t n ) ;

dash offset は 前 景 色 を 何 ピ ク セ ル 目 か ら 描 画 す る か を 指 定 し ま す. ま た, dash list に は 点 線 の パ タ ー ン を 配 列 で 指 定 し ま す. 例 え ば, 次 の よ う な 配 列 を 与 え る と, 前 景 色4 ピ ク セ ル・空 白

表4.1 線の種類

スタイル 説明

GDK LINE SOLID 実線

GDK LINE ON OFF DASH 点線

GDK LINE DOUBLE DASH 点線(前景色と背景色を交互に描画)

(GDK LINE DOUBLE DASH なら背景色)2 ピクセル・前景色2 ピクセル・空白 2 ピクセルとい うパターンを繰り返し描画します. nには配列の要素数を与えます.

g i n t 8 d a s h _ l i s t [ ] = {4 , 2 , 2 , 2 } ;

線端の種類

線端の種類には,表4.2に示した4種類があります. 描画される線端は図4.2のようになります. 表4.2 線端の種類

スタイル 説明

GDK CAP NOT LAST 線端はGDK CAP BUTTと同様ですが,線幅が0のとき,最後の点を描画しません.

GDK CAP BUTT 始点と終点をそのまま描画します.

GDK CAP ROUND 線端を丸く描画します.

GDK CAP PROJECTING 線端を線幅の半分だけはみだして描画します.

始点 終点

GDK_CAP_BUTT

GDK_CAP_ROUND

GDK_CAP_PROJECTING

図4.2 線端の描画

接続の種類

線分の接続部分の形状には,表4.3に示した3種類があります. 描画される接続部分の形状は図4.3のよ うになります.

表4.3 接続の種類

スタイル 説明

GDK JOIN MITER 接続部分をとがらせます. GDK JOIN ROUND 接続部分を丸くします.

GDK JOIN BEVEL 接続部分のとがった部分をカットしたような形にします.

GDK_JOIN_MITER GDK_JOIN_ROUND GDK_JOIN_BEVEL

図4.3 接続部分の描画

線分の描画例

色の設定や線分の描画で説明した内容をまとめて,ソース4–2 に示します.

線分の描画に関する部分は先に詳しく解説してありますのでソースコードの説明は省略します. この例では, 図形描画用のドローアブルとして, GtkDrawingAreaウィジェットのwindowメンバを使用しています. 115 行目で設定しているコールバック関数は,ウィジェットが画面の前面に表示されたときなど画面の再描画が必 要なときに発生するシグナル”expose event”シグナルに対する関数です.

ユーザがウィンドウなどのドローアブル上に図形を描画する場合, 図形を描画しているウィンドウが他の ウィンドウに隠れた領域はユーザが再び図形の描画を行わない限り自動的に描画されることはありません. こ のように再描画が必要になったときに発生するシグナルが”expose event”シグナルです. 従って,このシグナ ルに対するコールバック関数に図形を描画するコードを書くのが一般的です.

図4.4 線分描画の例

ソース 4–2 線分の描画: draw lines.c

1 # i n c l u d e <g t k / g t k . h >

2

3 s t a t i c v o i d s e t _ c o l o r (G d k G C * gc ,

4 G d k C o l o r * c o l o r ,

5 g u i n t 1 6 red ,

6 g u i n t 1 6 g r e e n ,

7 g u i n t 1 6 b l u e ,

8 v o i d ( * s e t _ f u n c t i o n ) (G d k G C * gc ,

9 c o n s t G d k C o l o r * c o l o r ) ) {

10 c o l o r - >r e d = r e d ;

11 c o l o r - >g r e e n = g r e e n ;

12 c o l o r - >b l u e = b l u e ;

13 g d k _ c o l o r _ a l l o c ( g d k _ c o l o r m a p _ g e t _ s y s t e m ( ) , c o l o r ) ;

14 s e t _ f u n c t i o n ( gc , c o l o r ) ;

15 }

16

17 g b o o l e a n c b _ e x p o s e _ e v e n t (G t k W i d g e t * w i d g e t ,

18 G d k E v e n t E x p o s e * e v e n t ,

19 g p o i n t e r u s e r _ d a t a ) {

20 G d k W i n d o w * d r a w a b l e = w i d g e t - >w i n d o w ;

21 G d k G C * g c ;

22 G d k C o l o r c o l o r ;

23 G d k P o i n t p o i n t [ 3 ] ;

24 g i n t l i n e _ w i d t h = 1 0 ;

25 g i n t 8 d a s h _ s t y l e [ ] = { 4 0 , 10 , 10 , 1 0 } ;

26

27 g c = g d k _ g c _ n e w ( d r a w a b l e ) ;

28

29 / * 線 種 の 違 い * /

30 s e t _ c o l o r ( gc , & c o l o r , 0 x f f f f , 0 x 0 0 0 0 , 0 x 0 0 0 0 , g d k _ g c _ s e t _ f o r e g r o u n d ) ;

31 g d k _ g c _ s e t _ l i n e _ a t t r i b u t e s ( gc , l i n e _ w i d t h ,

32 G D K _ L I N E _ S O L I D , G D K _ C A P _ B U T T , G D K _ J O I N _ M I T E R ) ;

33 g d k _ d r a w _ l i n e ( d r a w a b l e , gc , 20 , 20 , 1 8 0 , 2 0 ) ;

34

35 g d k _ g c _ s e t _ l i n e _ a t t r i b u t e s ( gc , l i n e _ w i d t h ,

36 G D K _ L I N E _ O N _ O F F _ D A S H ,

37 G D K _ C A P _ B U T T , G D K _ J O I N _ M I T E R ) ;

38 g d k _ d r a w _ l i n e ( d r a w a b l e , gc , 20 , 40 , 1 8 0 , 4 0 ) ;

39

40 s e t _ c o l o r ( gc , & c o l o r , 0 x 0 0 0 0 , 0 x 0 0 0 0 , 0 x f f f f , g d k _ g c _ s e t _ b a c k g r o u n d ) ;

41 g d k _ g c _ s e t _ l i n e _ a t t r i b u t e s ( gc , l i n e _ w i d t h ,

42 G D K _ L I N E _ D O U B L E _ D A S H ,

43 G D K _ C A P _ B U T T , G D K _ J O I N _ M I T E R ) ;

44 g d k _ d r a w _ l i n e ( d r a w a b l e , gc , 20 , 60 , 1 8 0 , 6 0 ) ;

45

46 / * 点 線 の 設 定 * /

47 g d k _ g c _ s e t _ d a s h e s ( gc , 0 , d a s h _ s t y l e , 4 ) ;

48 g d k _ d r a w _ l i n e ( d r a w a b l e , gc , 20 , 80 , 1 8 0 , 8 0 ) ;

49

50 g d k _ g c _ s e t _ d a s h e s ( gc , 20 , d a s h _ s t y l e , 4 ) ;

51 g d k _ d r a w _ l i n e ( d r a w a b l e , gc , 20 , 1 0 0 , 1 8 0 , 1 0 0 ) ;

52

53 / * 線 端 の 種 類 * /

54 s e t _ c o l o r ( gc , & c o l o r , 0 x 0 0 0 0 , 0 x 8 8 8 8 , 0 x 0 0 0 0 , g d k _ g c _ s e t _ f o r e g r o u n d ) ;

55

56 g d k _ g c _ s e t _ l i n e _ a t t r i b u t e s ( gc , l i n e _ w i d t h ,

57 G D K _ L I N E _ S O L I D , G D K _ C A P _ B U T T , G D K _ J O I N _ M I T E R ) ;

58 g d k _ d r a w _ l i n e ( d r a w a b l e , gc , 20 , 1 3 0 , 1 8 0 , 1 3 0 ) ;

59

60 g d k _ g c _ s e t _ l i n e _ a t t r i b u t e s ( gc , l i n e _ w i d t h ,

61 G D K _ L I N E _ S O L I D ,

62 G D K _ C A P _ R O U N D , G D K _ J O I N _ M I T E R ) ;

63 g d k _ d r a w _ l i n e ( d r a w a b l e , gc , 20 , 1 5 0 , 1 8 0 , 1 5 0 ) ;

64

65 g d k _ g c _ s e t _ l i n e _ a t t r i b u t e s ( gc , l i n e _ w i d t h ,

66 G D K _ L I N E _ S O L I D ,

67 G D K _ C A P _ P R O J E C T I N G , G D K _ J O I N _ M I T E R ) ;

68 g d k _ d r a w _ l i n e ( d r a w a b l e , gc , 20 , 1 7 0 , 1 8 0 , 1 7 0 ) ;

69

70 / * 接 続 の 種 類 * /

71 s e t _ c o l o r ( gc , & c o l o r , 0 x 0 0 0 0 , 0 x 8 8 8 8 , 0 x c c c c , g d k _ g c _ s e t _ f o r e g r o u n d ) ;

72 l i n e _ w i d t h = 2 0 ;

73

74 g d k _ g c _ s e t _ l i n e _ a t t r i b u t e s ( gc , l i n e _ w i d t h ,

75 G D K _ L I N E _ S O L I D ,

76 G D K _ C A P _ B U T T , G D K _ J O I N _ M I T E R ) ;

77 p o i n t [ 0 ] . x = 2 2 0 ; p o i n t [ 0 ] . y = 9 0 ;

78 p o i n t [ 1 ] . x = 3 0 0 ; p o i n t [ 1 ] . y = 2 0 ;

79 p o i n t [ 2 ] . x = 3 8 0 ; p o i n t [ 2 ] . y = 9 0 ;

80 g d k _ d r a w _ l i n e s ( d r a w a b l e , gc , p o i n t , 3 ) ;

81

82 g d k _ g c _ s e t _ l i n e _ a t t r i b u t e s ( gc , l i n e _ w i d t h ,

83 G D K _ L I N E _ S O L I D ,

84 G D K _ C A P _ B U T T , G D K _ J O I N _ R O U N D ) ;

85 p o i n t [ 0 ] . x = 2 2 0 ; p o i n t [ 0 ] . y = 1 3 0 ;

86 p o i n t [ 1 ] . x = 3 0 0 ; p o i n t [ 1 ] . y = 6 0 ;

87 p o i n t [ 2 ] . x = 3 8 0 ; p o i n t [ 2 ] . y = 1 3 0 ;

88 g d k _ d r a w _ l i n e s ( d r a w a b l e , gc , p o i n t , 3 ) ;

89

90 g d k _ g c _ s e t _ l i n e _ a t t r i b u t e s ( gc , l i n e _ w i d t h ,

91 G D K _ L I N E _ S O L I D ,

92 G D K _ C A P _ B U T T , G D K _ J O I N _ B E V E L ) ;

93 p o i n t [ 0 ] . x = 2 2 0 ; p o i n t [ 0 ] . y = 1 7 0 ;

94 p o i n t [ 1 ] . x = 3 0 0 ; p o i n t [ 1 ] . y = 1 0 0 ;

95 p o i n t [ 2 ] . x = 3 8 0 ; p o i n t [ 2 ] . y = 1 7 0 ;

96 g d k _ d r a w _ l i n e s ( d r a w a b l e , gc , p o i n t , 3 ) ;

97

98 g _ o b j e c t _ u n r e f ( g c ) ;

99

100 r e t u r n F A L S E ;

101 }

102

103 i n t m a i n (i n t ar g c , c h a r * a r g v [ ] ) {

104 G t k W i d g e t * w i n d o w ;

105 G t k W i d g e t * c a n v a s ;

106

107 g t k _ i n i t ( & a r g c , & a r g v ) ;

108

109 w i n d o w = g t k _ w i n d o w _ n e w ( G T K _ W I N D O W _ T O P L E V E L ) ;

110 g t k _ w i n d o w _ s e t _ t i t l e ( G T K _ W I N D O W ( w i n d o w ) , " L i n e à E x a m p l e s " ) ;

111 g t k _ w i d g e t _ s e t _ s i z e _ r e q u e s t ( w i n d o w , 4 0 0 , 2 0 0 ) ;

112

113 c a n v a s = g t k _ d r a w i n g _ a r e a _ n e w ( ) ;

114 g t k _ c o n t a i n e r _ a d d ( G T K _ C O N T A I N E R ( w i n d o w ) , c a n v a s ) ;

115 g _ s i g n a l _ c o n n e c t ( G _ O B J E C T ( c a n v a s ) , " e x p o s e _ e v e n t " ,

116 G _ C A L L B A C K ( c b _ e x p o s e _ e v e n t ) , N U L L ) ;

117

118 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;

119 g t k _ m a i n ( ) ;

120

121 r e t u r n 0 ;

122 }

ドキュメント内 表紙 (ページ 62-68)