版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 背景說明利用linux gtk編寫c/c+程序,模擬小球在sin/cos曲線上進(jìn)行運(yùn)動(dòng)的軌跡。 源碼/* * cairo.cpp * * Created on: Jan 5, 2011 * Author: sjetlin */#include <gtk/gtk.h>#include <math.h>#include <stdio.h>/-double sin_start_x = 0;/sin水平坐標(biāo)系原點(diǎn)x坐標(biāo)double cos_start_x = 0;double sin_start_y = 75;double cos_start_y = 225;do
2、uble sin_ball_x = 0;/sin小球圓心坐標(biāo)double cos_ball_x = 0;/-double sin_ball_speed_rad;/sin小球每次移動(dòng)的弧度double cos_ball_speed_rad;double round_time;/sin和cos曲線周期,單位是M_PI/-double amplitude = 50;/曲線振幅double width;/水平坐標(biāo)系包含的像素點(diǎn),設(shè)置與窗口寬度相等double width_rad = 8 * M_PI;/水平坐標(biāo)系表示的弧度,默認(rèn)為8M_PI/-void clicked(GtkWidget *widge
3、t, GdkEventExpose *event, gpointer data);void sin_wave(cairo_t *cr);/畫sin曲線void cos_wave(cairo_t *cr);/畫sin小球void sin_ball(cairo_t *cr);/畫cos曲線void cos_ball(cairo_t *cr);/畫cos小球/-/static gboolean on_expose_event(GtkWidget *widget,GdkEventExpose *event,gpointer data)void clicked(GtkWidget *widget, Gd
4、kEventExpose *event, gpointer data)cairo_t* cr = (cairo_t*)data;width = widget->allocation.width;while (sin_ball_x <= width | cos_ball_x <= width) /當(dāng)兩個(gè)小球都在運(yùn)動(dòng)時(shí)改變畫布內(nèi)容cairo_set_source_rgb(cr, 255, 255, 255);cairo_rectangle(cr, 0, 0, 400, 300);cairo_fill (cr);/清空畫布cairo_set_source_rgb(cr, 255,
5、0, 0);/設(shè)置畫筆為紅色cairo_set_line_width(cr, 0.7);/設(shè)置畫筆寬度sin_wave(cr);sin_ball(cr);cos_wave(cr);cos_ball(cr);cairo_stroke(cr);g_usleep(0.5 * 1000000);/暫停0.5秒void sin_wave(cairo_t *cr)cairo_move_to(cr, sin_start_x, sin_start_y);cairo_line_to(cr, width, sin_start_y);/畫sin水平坐標(biāo)系cairo_select_font_face(cr, &quo
6、t;Georgis", CAIRO_FONT_SLANT_NORMAL,CAIRO_FONT_WEIGHT_BOLD);cairo_set_font_size(cr, 12);cairo_move_to(cr, sin_start_x, sin_start_y);cairo_show_text(cr, "0");cairo_move_to(cr, sin_start_x + width - 30, sin_start_y);cairo_show_text(cr, "8 PI");cairo_move_to(cr, sin_start_x, si
7、n_start_y);/曲線起點(diǎn)double x = sin_start_x;double inc_x = 1;while (x <= width)double next_x = x + inc_x;cairo_line_to(cr, x + inc_x, sin_start_y - amplitude * sin(2* width_rad * next_x / round_time / width);x = x + inc_x;void cos_wave(cairo_t *cr)cairo_move_to(cr, cos_start_x, cos_start_y);cairo_line
8、_to(cr, width, cos_start_y);/畫cos水平坐標(biāo)系cairo_select_font_face(cr, "Georgis", CAIRO_FONT_SLANT_NORMAL,CAIRO_FONT_WEIGHT_BOLD);cairo_set_font_size(cr, 12);cairo_move_to(cr, cos_start_x, cos_start_y);cairo_show_text(cr, "0");cairo_move_to(cr, cos_start_x + width - 30, cos_start_y);ca
9、iro_show_text(cr, "8 PI");cairo_move_to(cr, cos_start_x, cos_start_y - 50);/曲線起點(diǎn)double x = cos_start_x;double inc_x = 1;while (x <= width)double next_x = x + inc_x;cairo_line_to(cr, next_x, cos_start_y - amplitude * cos(2 * width_rad* next_x / round_time / width);x = x + inc_x;void sin_
10、ball(cairo_t *cr)if (sin_ball_x <= width)double sin_ball_radius = 10;double sin_ball_y = sin_start_y - amplitude * sin(2 * width_rad* sin_ball_x / round_time / width);cairo_move_to(cr, sin_ball_x + sin_ball_radius, sin_ball_y);cairo_arc(cr, sin_ball_x, sin_ball_y, sin_ball_radius, 0, 2 * M_PI);si
11、n_ball_x = sin_ball_x + sin_ball_speed_rad *M_PI*width/ width_rad;void cos_ball(cairo_t *cr)if (cos_ball_x <= width)double cos_ball_radius = 10;double cos_ball_y = cos_start_y - amplitude * cos(2 * width_rad* cos_ball_x / round_time / width);cairo_move_to(cr, cos_ball_x + cos_ball_radius, cos_bal
12、l_y);cairo_arc(cr, cos_ball_x, cos_ball_y, cos_ball_radius, 0, 2 * M_PI);cos_ball_x = cos_ball_x + cos_ball_speed_rad *M_PI*width/ width_rad;int main(int argc, char *argv)printf("請(qǐng)輸入一個(gè)實(shí)數(shù),代表曲線周期,單位是PI n");scanf("%lf", &round_time);printf("請(qǐng)輸入一個(gè)實(shí)數(shù),代表第一個(gè)小球移動(dòng)的弧度,單位是PI n"
13、;);scanf("%lf", &sin_ball_speed_rad);printf("請(qǐng)輸入一個(gè)實(shí)數(shù),代表第二個(gè)小球移動(dòng)的弧度,單位是PI n");scanf("%lf", &cos_ball_speed_rad);printf("n已生成窗口,點(diǎn)擊窗口中的空白區(qū)域即可查看動(dòng)畫nn");gtk_init(&argc, &argv);GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_titl
14、e(GTK_WINDOW(window), "sin cos && ball");gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);gtk_widget_set_app_paintable(window, TRUE);gtk_widget_show_all(window);cairo_t *cr = gdk_cairo_create(window->window
15、);/創(chuàng)建畫布gtk_widget_add_events(window,GDK_BUTTON_PRESS_MASK);g_signal_connect(window, "button-press-event", G_CALLBACK(clicked), cr);/注冊(cè)點(diǎn)擊事件g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);gtk_main();return 0;源碼說明1. 編程和編譯環(huán)境:Linux + Eclipse + CDT,文件名sport.c,可執(zhí)行文件
16、sport2. 程序運(yùn)行時(shí)需輸入3個(gè)變量,分別是曲線周期、sin小球運(yùn)動(dòng)速度、cos小球運(yùn)動(dòng)速度3. 程序的設(shè)計(jì)思想是先創(chuàng)建一塊畫布,畫布的內(nèi)容在小球運(yùn)動(dòng)時(shí)動(dòng)態(tài)改變,直至兩小球都運(yùn)動(dòng)到終點(diǎn)時(shí)停止。4. 小球運(yùn)動(dòng)時(shí)畫布改變順序如下: 先用一塊白布將畫布上的所有內(nèi)容抹掉 用一根紅筆畫出sin曲線、cos曲線、sin小球、cos小球5. 當(dāng)畫布上的內(nèi)容更新一次時(shí)暫停0.5秒,時(shí)間到時(shí)重復(fù)4的步驟,此時(shí)曲線不變,小球的圓心改變。6. 畫sin曲線時(shí)先畫出x軸,標(biāo)出起終點(diǎn)的水平坐標(biāo)(08PI),該曲線眾多的點(diǎn)和小線段組成,點(diǎn)是經(jīng)過精確計(jì)算的在sin曲線上的點(diǎn),而線段則由這些點(diǎn)連接起來,并最終匯總成為一條曲線。7. 畫移動(dòng)的小球時(shí),小球每次移動(dòng)的弧度由鍵盤輸入,將該弧度轉(zhuǎn)換為轉(zhuǎn)化水平像素點(diǎn),再加上上一個(gè)圓心的x坐標(biāo),即可確定出目前小球圓心所在的x坐標(biāo),取該x坐標(biāo)對(duì)應(yīng)于曲線上的一點(diǎn)作為小球的圓心。運(yùn)行截圖1. 進(jìn)入文件目錄2. 編譯3. 執(zhí)行 首先,程序會(huì)給出輸入提示信息,輸入相應(yīng)信息
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度智能家居加盟品牌授權(quán)合同3篇
- 二零二五年度新能源儲(chǔ)能系統(tǒng)購買合同3篇
- 二零二五年度林業(yè)人才培養(yǎng)合作造林協(xié)議3篇
- 2025年度老舊房屋漏水檢測(cè)與賠償專項(xiàng)協(xié)議3篇
- 2025年度股東退出與公司知識(shí)產(chǎn)權(quán)保護(hù)合同3篇
- 二零二五年度模特服裝租賃拍攝合同3篇
- 2025年度房地產(chǎn)公司合伙人項(xiàng)目合作協(xié)議3篇
- 二零二五年度循環(huán)水養(yǎng)殖養(yǎng)魚合作合同3篇
- 2025年度體育場(chǎng)館物業(yè)用房移交及賽事運(yùn)營(yíng)服務(wù)合同3篇
- 2025年度企業(yè)年會(huì)活動(dòng)宣傳片制作服務(wù)合同模板3篇
- 廣東省深圳市南山區(qū)2023-2024學(xué)年六年級(jí)上學(xué)期期末科學(xué)試卷
- 2023北京東城區(qū)初二上期末考?xì)v史試卷及答案
- 檢察院分級(jí)保護(hù)項(xiàng)目技術(shù)方案
- 土木工程建筑中混凝土裂縫的施工處理技術(shù)畢業(yè)論文
- 水電站工程地質(zhì)勘察報(bào)告
- 電站屏柜改造安裝二次工程施工組織設(shè)計(jì)
- DB42∕T 1795-2021 微動(dòng)勘探技術(shù)規(guī)程
- 大潤(rùn)發(fā)的企業(yè)文化
- 兒童劇劇本─三只小豬
- TROXLER3440核子密度儀
- 2流動(dòng)人員人事檔案轉(zhuǎn)遞通知單存根
評(píng)論
0/150
提交評(píng)論