C++EASYX 라 이브 러 리 스캐닝 라인 알고리즘 구현

8228 단어 C++EASYX주사 선
본 논문 의 사례 는 C++EASYX 라 이브 러 리 스캐닝 라인 알고리즘 을 바탕 으로 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
스캐닝 라인 알고리즘 의 기본 원리

*저 자 는 스캐닝 라인 알고리즘 을 바탕 으로 이해 하기 쉬 운 지물 충전 그리 기 알고리즘 을 자체 적 으로 설계 하 였 습 니 다.
흐름 도

코드

#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;
}
//-------------------            ,    suitable_x[] ,         n --------------//
//x[]-----------  x  
//y[]-----------  y  
//N-------------     
//now_y---------      y
//suitable_x[]--           x  
//n-------------     
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])//             
 {
 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]) //             
 {
 function_line(x[i], y[i], x[i + 1], y[i + 1], k, b);
 suitable_x[t++] = solve_x(k, b, now_y);//    x   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 << "-----------------------------------------        --------------------------------------------

"; cout << " :
"; cout << " :2018 10 24
"; cout << " 10 24 , ,23 , !!!


"; int N,ch; char color; double x[50],y[50]; cout << " :"; cin >> N; cout << " :"; for (int i = 0; i < N; i++) { cout << " " << i+1 << " :" << endl; cout << "x,y:"; scanf_s("%lf,%lf",&x[i],&y[i]); /*cout << "x = "; cin >> x[i]; cout << "y = "; cin >> y[i];*/ } cout << " : --- 0; --- 1; --- 2 ; "; cin >> ch; if (ch == 0) { cout << " :BLACK ,DARKGRAY BLUE  LIGHTBLUE :GREEN CYAN RED MAGENTA BROWN YELLOW LIGHTGRAY ---
"; cout << " LIGHT
"; cout << " :"; 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]; // int hight = 12, width = 6; int space = 4; // setbkcolor(WHITE); // cleardevice(); // setlinecolor(BLACK); // for (int i = 0; i < N; i++) // { 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: //------------------------- -------------------------// 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();// system("pause"); return 0; }
실현 효과




읽 어 주 셔 서 감사합니다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기