最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)基于EASYX庫(kù)掃描線算法

 更新時(shí)間:2020年02月20日 12:51:30   作者:py粉  
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)基于EASYX庫(kù)掃描線算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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 淺灰---注意是大寫的英文\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)閉畫框
 system("pause");
 return 0;
}

實(shí)現(xiàn)效果

謝謝閱讀,歡迎來(lái)一起交流,一起學(xué)習(xí)!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 用C語(yǔ)言實(shí)現(xiàn)排雷游戲

    用C語(yǔ)言實(shí)現(xiàn)排雷游戲

    大家好,本篇文章主要講的是用C語(yǔ)言實(shí)現(xiàn)排雷游戲,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • EasyC++內(nèi)部鏈接性和無(wú)鏈接性

    EasyC++內(nèi)部鏈接性和無(wú)鏈接性

    這篇文章主要介紹了EasyC++內(nèi)部鏈接性和無(wú)鏈接性,當(dāng)我們使用static關(guān)鍵字,將變量的作用于限制在整個(gè)文件時(shí),該變量的鏈接性為內(nèi)部鏈接性,然而無(wú)鏈接性的變量其實(shí)就是在代碼塊當(dāng)中使用static關(guān)鍵字創(chuàng)建的,接下來(lái)一起進(jìn)入文章了解更多內(nèi)容吧
    2021-12-12
  • C語(yǔ)言進(jìn)階:指針的進(jìn)階(3)

    C語(yǔ)言進(jìn)階:指針的進(jìn)階(3)

    這篇文章主要介紹了C語(yǔ)言指針詳解及用法示例,介紹了其相關(guān)概念,然后分享了幾種用法,具有一定參考價(jià)值。需要的朋友可以了解下
    2021-09-09
  • 2~62位任意進(jìn)制轉(zhuǎn)換方法(c++)

    2~62位任意進(jìn)制轉(zhuǎn)換方法(c++)

    下面小編就為大家?guī)?lái)一篇2~62位任意進(jìn)制轉(zhuǎn)換方法(c++)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • C++模擬實(shí)現(xiàn)vector的示例代碼

    C++模擬實(shí)現(xiàn)vector的示例代碼

    大家在學(xué)習(xí)C++的時(shí)候一定會(huì)學(xué)到STL(標(biāo)準(zhǔn)模板庫(kù)),這是C++標(biāo)準(zhǔn)庫(kù)中最重要的組成部分,它包含了常用的數(shù)據(jù)結(jié)構(gòu)和算法。今天呢,我們首先來(lái)學(xué)習(xí)STL中的vector容器
    2022-09-09
  • C++實(shí)踐Time類中的運(yùn)算符重載參考方法

    C++實(shí)踐Time類中的運(yùn)算符重載參考方法

    今天小編就為大家分享一篇關(guān)于C++實(shí)踐Time類中的運(yùn)算符重載參考方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • win10中的dlib庫(kù)安裝過(guò)程

    win10中的dlib庫(kù)安裝過(guò)程

    這篇文章主要介紹了win10中dlib庫(kù)的安裝過(guò)程,本文通過(guò)實(shí)例圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C語(yǔ)言實(shí)現(xiàn)圖書館管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)圖書館管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • QT網(wǎng)絡(luò)編程UDP下C/S架構(gòu)廣播通信(實(shí)例講解)

    QT網(wǎng)絡(luò)編程UDP下C/S架構(gòu)廣播通信(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇QT網(wǎng)絡(luò)編程UDP下C/S架構(gòu)廣播通信(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • C語(yǔ)言中正切的相關(guān)函數(shù)總結(jié)

    C語(yǔ)言中正切的相關(guān)函數(shù)總結(jié)

    這篇文章主要介紹了C語(yǔ)言中正切的相關(guān)函數(shù)總結(jié),包括正切和反正切以及雙曲線正切等的函數(shù),需要的朋友可以參考下
    2015-08-08

最新評(píng)論

沅江市| 永城市| 盖州市| 诏安县| 大丰市| 嘉义市| 库车县| 鸡泽县| 册亨县| 上饶市| 绥中县| 贵港市| 新巴尔虎左旗| 阳城县| 山阳县| 大埔县| 峨眉山市| 嘉禾县| 体育| 安义县| 申扎县| 廊坊市| 阿鲁科尔沁旗| 布尔津县| 炉霍县| 高雄市| 梅河口市| 宁明县| 资阳市| 庆阳市| 山西省| 大名县| 尚志市| 读书| 滦南县| 灯塔市| 南京市| 新源县| 潞西市| 内乡县| 金秀|