<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Cairo 基本圖形 > 原文: [https://zetcode.com/gfx/cairo/basicdrawing/](https://zetcode.com/gfx/cairo/basicdrawing/) 在 Cairo 圖形教程的這一部分中,我們將繪制一些基本圖元。 我們將繪制簡單的線條,使用填充和描邊操作,我們將討論筆劃線,線帽和線連接。 ## 直線 線是非常基本的矢量對象。 要畫一條線,我們使用兩個函數調用。 通過`cairo_move_to()`調用指定起點。 線的終點通過`cairo_line_to()`調用指定。 ```c #include <cairo.h> #include <gtk/gtk.h> static void do_drawing(cairo_t *); struct { int count; double coordx[100]; double coordy[100]; } glob; static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data) { do_drawing(cr); return FALSE; } static void do_drawing(cairo_t *cr) { cairo_set_source_rgb(cr, 0, 0, 0); cairo_set_line_width(cr, 0.5); int i, j; for (i = 0; i <= glob.count - 1; i++ ) { for (j = 0; j <= glob.count - 1; j++ ) { cairo_move_to(cr, glob.coordx[i], glob.coordy[i]); cairo_line_to(cr, glob.coordx[j], glob.coordy[j]); } } glob.count = 0; cairo_stroke(cr); } static gboolean clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 1) { glob.coordx[glob.count] = event->x; glob.coordy[glob.count++] = event->y; } if (event->button == 3) { gtk_widget_queue_draw(widget); } return TRUE; } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *darea; glob.count = 0; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); darea = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(window), darea); gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK); g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(on_draw_event), NULL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(window, "button-press-event", G_CALLBACK(clicked), NULL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 400, 300); gtk_window_set_title(GTK_WINDOW(window), "Lines"); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 在我們的示例中,我們用鼠標左鍵隨機單擊一個窗口。 每次點擊都存儲在一個數組中。 當我們右鍵單擊窗口時,所有點都與數組中的每個點相連。 這樣,我們可以創建一些有趣的對象。 右鍵單擊繪制的對象將清除窗口,我們可以單擊另一個對象。 ```c cairo_set_source_rgb(cr, 0, 0, 0); cairo_set_line_width (cr, 0.5); ``` 線條將用黑色墨水繪制,寬度為 0.5 點。 ```c int i, j; for (i = 0; i <= glob.count - 1; i++ ) { for (j = 0; j <= glob.count - 1; j++ ) { cairo_move_to(cr, glob.coordx[i], glob.coordy[i]); cairo_line_to(cr, glob.coordx[j], glob.coordy[j]); } } ``` 我們將數組中的每個點連接到其他每個點。 ```c cairo_stroke(cr); ``` `cairo_stroke()`調用畫線。 ```c g_signal_connect(window, "button-press-event", G_CALLBACK(clicked), NULL); ``` 我們將`button-press-event`連接到單擊的回調。 ```c if (event->button == 1) { glob.coordx[glob.count] = event->x; glob.coordy[glob.count++] = event->y; } ``` 在單擊的回調中,我們確定是單擊鼠標左鍵還是單擊鼠標右鍵。 如果單擊鼠標左鍵,則將 x,y 坐標存儲到數組中。 ```c if (event->button == 3) { gtk_widget_queue_draw(widget); } ``` 通過右鍵單擊,我們重新繪制窗口。 ![Lines](https://img.kancloud.cn/34/b2/34b27db08032c75cf39a949b35c0455c_402x326.jpg) 圖:直線 ## 填充和描邊 描邊操作繪制形狀的輪廓,填充操作填充形狀的內部。 ```c #include <cairo.h> #include <gtk/gtk.h> #include <math.h> static void do_drawing(cairo_t *, GtkWidget *); static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data) { do_drawing(cr, widget); return FALSE; } static void do_drawing(cairo_t *cr, GtkWidget *widget) { GtkWidget *win = gtk_widget_get_toplevel(widget); int width, height; gtk_window_get_size(GTK_WINDOW(win), &width, &height); cairo_set_line_width(cr, 9); cairo_set_source_rgb(cr, 0.69, 0.19, 0); cairo_translate(cr, width/2, height/2); cairo_arc(cr, 0, 0, 50, 0, 2 * M_PI); cairo_stroke_preserve(cr); cairo_set_source_rgb(cr, 0.3, 0.4, 0.6); cairo_fill(cr); } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *darea; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); darea = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(window), darea); g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(on_draw_event), NULL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 300, 200); gtk_window_set_title(GTK_WINDOW(window), "Fill & stroke"); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 在我們的示例中,我們將繪制一個圓并用純色填充它。 ```c #include <math.h> ``` `M_PI`常量需要此頭文件。 ```c GtkWidget *win = gtk_widget_get_toplevel(widget); int width, height; gtk_window_get_size(GTK_WINDOW(win), &width, &height); ``` 在這里,我們獲得了窗口的寬度和高度。 繪制圓時,將需要這些值。 當我們調整窗口大小時,圓圈將被調整大小。 ```c cairo_set_line_width(cr, 9); cairo_set_source_rgb(cr, 0.69, 0.19, 0); ``` 我們使用`set_line_width()`方法設置線寬。 我們使用`set_source_rgb()`方法將光源設置為深紅色。 ```c cairo_translate(cr, width/2, height/2); cairo_arc(cr, 0, 0, 50, 0, 2 * M_PI); cairo_stroke_preserve(cr); ``` 使用`cairo_translate()`方法,我們將圖形原點移動到窗口的中心。 我們希望我們的圈子居中。 `arc()`方法向 Cairo 繪圖上下文添加了新的圓形路徑。 最后,`stroke_preserve()`方法繪制圓的輪廓。 與`stroke()`方法不同,它還保留了形狀以供以后繪制。 ```c cairo_set_source_rgb(cr, 0.3, 0.4, 0.6); cairo_fill(cr); ``` 在這里,我們用藍色填充線圈。 ![Fill and stroke](https://img.kancloud.cn/f2/6d/f26da81158a534f5eb93c3e092c03278_302x226.jpg) 圖:填充和描邊 ## 筆劃線 每條線可以用不同的筆劃線繪制。 它定義了線條的樣式。 筆劃線由`cairo_stroke()`函數調用使用。 筆劃線由`cairo_set_dash()`函數指定。 該模式由虛線數組設置,該數組是一個正浮點值的數組。 他們設置筆劃線圖案的開和關部分。 我們還指定了數組的長度和偏移值。 如果長度為 0,則禁用虛線。 如果為 1,則假定對稱圖案,并交替顯示由虛線表示的單個值指定的大小的打開和關閉部分。 ```c static void do_drawing(cairo_t *cr) { cairo_set_source_rgba(cr, 0, 0, 0, 1); static const double dashed1[] = {4.0, 21.0, 2.0}; static int len1 = sizeof(dashed1) / sizeof(dashed1[0]); static const double dashed2[] = {14.0, 6.0}; static int len2 = sizeof(dashed2) / sizeof(dashed2[0]); static const double dashed3[] = {1.0}; cairo_set_line_width(cr, 1.5); cairo_set_dash(cr, dashed1, len1, 0); cairo_move_to(cr, 40, 30); cairo_line_to(cr, 200, 30); cairo_stroke(cr); cairo_set_dash(cr, dashed2, len2, 1); cairo_move_to(cr, 40, 50); cairo_line_to(cr, 200, 50); cairo_stroke(cr); cairo_set_dash(cr, dashed3, 1, 0); cairo_move_to(cr, 40, 70); cairo_line_to(cr, 200, 70); cairo_stroke(cr); } ``` 在此示例中,我們將繪制三條具有不同筆劃線圖案的線。 ```c static const double dashed1[] = {4.0, 21.0, 2.0}; ``` 我們有三個數字的模式。 我們得出 4 分,未得出 21 分,得出 2 分。 然后,未繪制 4 點,未繪制 21 點和未繪制 2 點。 該模式輪流直到行尾。 ```c static int len1 = sizeof(dashed1) / sizeof(dashed1[0]); ``` 我們得到數組的大小。 ```c cairo_set_dash(cr, dashed1, len1, 0); ``` 我們設置筆劃線。 ```c static const double dashed3[] = {1.0}; ... cairo_set_dash(cr, dashed3, 1, 0); cairo_move_to(cr, 40, 70); cairo_line_to(cr, 200, 70); cairo_stroke(cr); ``` 這些線創建了一條帶有描邊的對稱劃線交替交替的單個點和斷開點的線。 ![Dashes](https://img.kancloud.cn/29/23/2923ffef4b856a792202b0610699a507_252x126.jpg) 圖:虛線 ## 線帽 線帽是線的端點。 * `CAIRO_LINE_CAP_SQUARE` * `CAIRO_LINE_CAP_ROUND` * `CAIRO_LINE_CAP_BUTT` Cairo 有三種不同的線帽樣式。 ![Line caps](https://img.kancloud.cn/02/82/028209e1479c20616e6daa81ab243710_132x136.jpg) 圖:正方形,圓和端帽 帶有`CAIRO_LINE_CAP_SQUARE`上限的行的大小將不同于帶有`CAIRO_LINE_CAP_BUTT`上限的行。 如果一條線的寬度為 px 寬,則帶有`CAIRO_LINE_CAP_SQUARE`上限的線的寬度將恰好為 px 寬度。 開頭為`width / 2`像素,結尾為`width / 2`像素。 ```c static void do_drawing(cairo_t *cr) { cairo_set_line_width(cr, 10); cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT); cairo_move_to(cr, 30, 50); cairo_line_to(cr, 150, 50); cairo_stroke(cr); cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); cairo_move_to(cr, 30, 90); cairo_line_to(cr, 150, 90); cairo_stroke(cr); cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE); cairo_move_to(cr, 30, 130); cairo_line_to(cr, 150, 130); cairo_stroke(cr); cairo_set_line_width(cr, 1.5); cairo_move_to(cr, 30, 40); cairo_line_to(cr, 30, 140); cairo_stroke(cr); cairo_move_to(cr, 150, 40); cairo_line_to(cr, 150, 140); cairo_stroke(cr); cairo_move_to(cr, 155, 40); cairo_line_to(cr, 155, 140); cairo_stroke(cr); } ``` 該示例繪制了具有三個不同上限的三條線。 它還將以圖形方式顯示行大小的差異。 ```c cairo_set_line_width(cr, 10); ``` 我們的線將是 10 像素寬。 ```c cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); cairo_move_to(cr, 30, 90); cairo_line_to(cr, 150, 90); cairo_stroke(cr); ``` 在這里,我們用`CAIRO_LINE_CAP_ROUND`帽畫一條水平線。 ```c cairo_set_line_width(cr, 1.5); cairo_move_to(cr, 30, 40); cairo_line_to(cr, 30, 140); cairo_stroke(cr); ``` 這是用來說明大小差異的三條垂直線之一。 ![Line caps](https://img.kancloud.cn/e2/8a/e28a350d3d86dd0db60c276eca8dfe68_202x226.jpg) 圖:線帽 ## 線連接 可以使用三種不同的連接樣式來連接線: * `CAIRO_LINE_JOIN_BEVEL` * `CAIRO_LINE_JOIN_ROUND` * `CAIRO_LINE_JOIN_MITER` ![Bevel, Round, Miter line joins](https://img.kancloud.cn/42/08/420884376ef71795c1c4d9efcfbaaf91_427x125.jpg) 圖:斜角,圓角,斜接線連接 `CAIRO_LINE_JOIN_BEVEL`使用切除連接,其中切除距離接合點的線寬一半。 `CAIRO_LINE_JOIN_ROUND`使用圓形連接,其中圓心是連接點。 `CAIRO_LINE_JOIN_MITER`使用了一個尖角。 ```c static void do_drawing(cairo_t *cr) { cairo_set_source_rgb(cr, 0.1, 0, 0); cairo_rectangle(cr, 30, 30, 100, 100); cairo_set_line_width(cr, 14); cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER); cairo_stroke(cr); cairo_rectangle(cr, 160, 30, 100, 100); cairo_set_line_width(cr, 14); cairo_set_line_join(cr, CAIRO_LINE_JOIN_BEVEL); cairo_stroke(cr); cairo_rectangle(cr, 100, 160, 100, 100); cairo_set_line_width(cr, 14); cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND); cairo_stroke(cr); } ``` 在此示例中,我們繪制了三個具有各種線連接的粗矩形。 ```c cairo_rectangle(cr, 30, 30, 100, 100); cairo_set_line_width(cr, 14); cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER); cairo_stroke(cr); ``` 在此代碼示例中,我們繪制具有`CAIRO_LINE_JOIN_MITER`連接樣式的矩形。 線寬為 14px。 ![Line joins](https://img.kancloud.cn/55/ce/55ce5a54fe7e72c2b1a23834b849ba7c_302x306.jpg) 圖:直線連接 在本章中,我們做了一些基本繪圖。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看