C++實(shí)現(xiàn)基于EASYX庫(kù)掃描線算法
本文實(shí)例為大家分享了C++實(shí)現(xiàn)基于EASYX庫(kù)掃描線算法的具體代碼,供大家參考,具體內(nèi)容如下
掃描線算法的基本原理
* 作者在掃描線算法的基礎(chǔ)上自己設(shè)計(jì)的更易于理解的地物填充繪制算法
流程圖
代碼
#include<graphics.h> //#include<conio.h> #include<iostream> using namespace std; //-----------------------------草圖形-----------------------------// void Grass(double x, double y, double hight, double width) { setlinecolor(GREEN); line(x, y, x - hight / 2, y - width); line(x, y, x, y - width); line(x, y, x + hight / 2, y - width); } //-----------------------------林圖形-----------------------------// void Tree(double x, double y, double hight, double width) { setlinecolor(GREEN); line(x, y, x - hight / 2, y - width); line(x, y, x + hight / 2, y - width); line(x, y - width, x, y + width); } //------------------求解方程的k,b值---------------------// void function_line(double x1, double y1, double x2, double y2, double &k, double &b) { if (x2 - x1 == 0) { k = -9999; b = x1; return; } k = (y2 - y1) / (x2 - x1); b = y1 - k * x1; } //------------------返回直線的y----------------------// double solve_y(double k, double b, double x) { return k * x + b; } //------------------返回直線的x----------------------// double solve_x(double k, double b, double y) { if (k == -9999) return b; return (y - b) / k; } //-------------------找出掃描線與邊界相交的點(diǎn),并儲(chǔ)存在suitable_x[]中,把相交的點(diǎn)數(shù)儲(chǔ)存在n中--------------// //x[]-----------頂點(diǎn)x坐標(biāo) //y[]-----------頂點(diǎn)y坐標(biāo) //N-------------頂點(diǎn)的個(gè)數(shù) //now_y---------當(dāng)前的掃描線y //suitable_x[]--掃描線與邊界相交的點(diǎn)的x坐標(biāo) //n-------------相交的點(diǎn)數(shù) void Suitable_x(double x[], double y[],int N, double now_y, double suitable_x[], int &n) { n = 0; int t = 0; double k, b; for (int i = 0; i < N; i++) { if (i == N - 1) { if (y[i] < now_y&& now_y <= y[0] || y[0] < now_y&& now_y <= y[i])//判斷直線是否過(guò)最后一條直線 { function_line(x[0], y[0], x[i], y[i], k, b); suitable_x[t++] = solve_x(k, b, now_y); } } else { if (y[i] < now_y&& now_y <= y[i + 1] || y[i + 1] < now_y&& now_y <= y[i]) //判斷掃描線過(guò)哪條直線的范圍 { function_line(x[i], y[i], x[i + 1], y[i + 1], k, b); suitable_x[t++] = solve_x(k, b, now_y);//把交點(diǎn)的x儲(chǔ)存在suitable_x[]中 } } } n = t; } void sort_min_to_max(double suitable_x[],int n) //排序----從小到大排序 { double temp; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (suitable_x[i] > suitable_x[j]) { double temp = suitable_x[i]; suitable_x[i] = suitable_x[j]; suitable_x[j] = temp; } } } } double find_max(double elem[],int N) //輸出最大的元素值 { double max = elem[0]; for (int i = 0; i < N; i++) { if (elem[i] > max) { max = elem[i]; } } return max; } double find_min(double elem[],int N) //輸出最小的元素值 { double min = elem[0]; for (int i = 0; i < N; i++) { if (elem[i] < min) { min = elem[i]; } } return min; } int main() { cout << "-----------------------------------------地物填充繪制算法--------------------------------------------\n\n"; cout << " 創(chuàng)建人:李景勃\n"; cout << " 時(shí)間:2018年10月24日\(chéng)n"; cout << " 10月24日是全部程序員值得開(kāi)心的節(jié)日,也是自己重要的日子,23號(hào)完成,祝福全部程序員們?。。?\n\n\n"; int N,ch; char color; double x[50],y[50]; cout << "輸入填充的多邊形的頂點(diǎn)數(shù):"; cin >> N; cout << "依次輸入地物的頂點(diǎn)坐標(biāo):"; for (int i = 0; i < N; i++) { cout << "輸入第" << i+1 << "個(gè)頂點(diǎn)的坐標(biāo):" << endl; cout << "x,y:"; scanf_s("%lf,%lf",&x[i],&y[i]); /*cout << "x = "; cin >> x[i]; cout << "y = "; cin >> y[i];*/ } cout << "選擇您填充的地物: 整個(gè)區(qū)域單顏色充填---請(qǐng)按0;草地---請(qǐng)按 1;林地---請(qǐng)按 2 ; "; cin >> ch; if (ch == 0) { cout << "請(qǐng)選擇顏色:BLACK 黑,DARKGRAY 深灰綠色 BLUE 藍(lán) LIGHTBLUE 亮藍(lán):GREEN 綠 CYAN 青 RED 紅 MAGENTA 紫 BROWN 棕 YELLOW 黃 LIGHTGRAY 淺灰---注意是大寫(xiě)的英文\n "; cout << "如果想讓顏色變亮請(qǐng)?jiān)陬伾那懊婕由螸IGHT \n"; cout << "請(qǐng)輸入顏色:"; cin >> color; } initgraph(find_max(x, N)+100, find_max(y, N)+100); //int N = 9; //double x[50] = { 200,100,150,170,400,350,300,250,270 }; //double y[50] = { 200,300,400,250,350,300,250,100,270 }; double new_y[50] = { 0 }; int n = 0; double suitable_x[10]; //草的參數(shù) int hight = 12, width = 6; int space = 4; //草之間的間隔 setbkcolor(WHITE); //設(shè)置背景色 cleardevice(); //用背景色填充屏幕 setlinecolor(BLACK); //多邊形的線條顏色 for (int i = 0; i < N; i++) //逆時(shí)針頂點(diǎn)相連構(gòu)成閉合多邊形 { if (i == N - 1) { line(x[i], y[i], x[0], y[0]); } else { line(x[i], y[i], x[i + 1], y[i + 1]); } } double min_y = find_min(y,N), max_y = find_max(y,N); switch (ch) { case 0: //-------------------------像素填充面積-------------------------// for (int now_y = min_y; now_y <= max_y; now_y++) { Suitable_x(x, y, N, now_y, suitable_x, n); sort_min_to_max(suitable_x, n); //從小到大排序 for (int i = 0; i < n; i += 2) { for (int now_x = suitable_x[i]; now_x < suitable_x[i + 1]; now_x++)//確定在掃描線上,要填充的范圍 { putpixel(now_x, now_y, color); } } } break; case 1: //-------------------------草填充-------------------------// for (int now_y = min_y + width + space; now_y <= max_y; now_y += width + space) { Suitable_x(x, y, N, now_y, suitable_x, n); sort_min_to_max(suitable_x, n); //從小到大排序 for (int i = 0; i < n; i += 2) { for (int now_x = suitable_x[i] + hight / 2 + space + space; now_x < suitable_x[i + 1] - hight / 2; now_x += hight + space)//確定在掃描線上,要填充的范圍 { Grass(now_x, now_y, hight, width); Sleep(60); } } } break; case 2: //-------------------------樹(shù)填充-------------------------// for (int now_y = min_y + width + space; now_y <= max_y; now_y += 2 * width + space) { Suitable_x(x, y, N, now_y, suitable_x, n); sort_min_to_max(suitable_x, n); //從小到大排序 for (int i = 0; i < n; i += 2) { double longth = suitable_x[i + 1] - suitable_x[i]-space; int num = longth / (hight+space); //double space_tmp = longth - num * (hight + space); //double space_ = space + space / num; for (int now_x = suitable_x[i] + hight / 2 +space+space; now_x < suitable_x[i + 1] - hight / 2&&num--; now_x += hight + space)//確定在掃描線上,要填充的范圍 { Tree(now_x, now_y, hight, width); Sleep(60); } } } break; default: cout << "填充失?。。。? << endl; break; } //closegraph();//關(guān)閉畫(huà)框 system("pause"); return 0; }
實(shí)現(xiàn)效果
謝謝閱讀,歡迎來(lái)一起交流,一起學(xué)習(xí)!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言結(jié)構(gòu)體內(nèi)存的對(duì)齊知識(shí)詳解
這篇文章主要介紹了C語(yǔ)言結(jié)構(gòu)體內(nèi)存的對(duì)齊的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03C/C++實(shí)現(xiàn)貪吃蛇逐步運(yùn)動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了C/C++實(shí)現(xiàn)貪吃蛇逐步運(yùn)動(dòng)效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05Matlab實(shí)現(xiàn)帶豎線散點(diǎn)的核密度圖的繪制
核密度估計(jì)是用于估計(jì)隨機(jī)變量概率密度函數(shù)的一種非參數(shù)方法。核密度圖不失為一種用來(lái)觀察連續(xù)型變量分布的有效方法。本文將用Matlab實(shí)現(xiàn)帶豎線散點(diǎn)的核密度圖的繪制,感興趣的可以了解一下2022-08-08C++實(shí)現(xiàn)二叉樹(shù)非遞歸遍歷方法實(shí)例總結(jié)
這篇文章主要介紹了C++實(shí)現(xiàn)二叉樹(shù)非遞歸遍歷方法實(shí)例總結(jié),是算法設(shè)計(jì)中比較經(jīng)典的一個(gè)遍歷算法,需要的朋友可以參考下2014-08-08總結(jié)IOS中nil、Nil、NULL和NSNull區(qū)別
相信有不少朋友想知道,在 Objective-C 中 nil 和 Nil 以及 NULL 的區(qū)別。最重要的是,在面試中還有不少朋友常會(huì)被問(wèn)到?,F(xiàn)在小編在這里統(tǒng)一詳細(xì)說(shuō)明。2016-08-08C語(yǔ)言中的內(nèi)存泄露 怎樣避免與檢測(cè)
堆經(jīng)常會(huì)出現(xiàn)兩種類型的問(wèn)題:1.釋放或改寫(xiě)仍在使用的內(nèi)存(稱為:“內(nèi)存損壞”)。2.未釋放不再使用的內(nèi)存(稱為:“內(nèi)存泄露”)。這是最難被調(diào)試發(fā)現(xiàn)的問(wèn)題之一2013-09-09