windows.h头文件,setpixel()函数专业方法

时间:2017-01-26 13:59:20

标签: c++ math graphics

好。我一直在玩windows.h几个小时,因为我有一个需要一些图形输出的小项目。我看过关于某些数学主题的YouTube视频我感兴趣,所以我自己做了(至少是其中的一部分)。所以问题是:

windows.h中是否有可以设置像素大小的函数?我希望有一个像素化图像,因为如果我正确看到它,我的输出看起来会更好。

这是我的代码,如果你想看到它,还有一些关于项目的截图。 (图片:https://1drv.ms/f/s!AvMH4xlC_LqCmyAvmyOWUsIqFHAV

#include <iostream>
#include <fstream>
/// ezek kellenek a grafikához!
#define _WIN32_WINNT 0x0500
#include<windows.h>
#include <cmath>

#define N 1000
#define S 2000000
#define gridMAX 4

using namespace std;

void toeple(int** grid);

int main()
{
    int **grid = new int*[N];

    for(int i=0;i<N;i++){
        grid[i] = new int[N];
    }

    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            grid[i][j] = 0;
        }
    }
    grid[N/2][N/2] = S;

    toeple(grid);

    ofstream fout("grid.txt");

    fout << N-2 << endl;

    for(int i=1;i<N-1;i++){
        for(int j=1;j<N-1;j++){
            fout << grid[i][j] << " ";
        }
        fout << endl;
    }

    fout.close();

    for(int i=0;i<N;i++){
        delete [] grid[i];
    } 
    delete [] grid;

    ifstream fin("grid.txt");

    int meret;

    fin >> meret;

    int **newgrid = new int*[meret];

    for(int i=0;i<meret;i++){
        newgrid[i] = new int[meret];
    }

    string sor;

    while(!fin.eof()){
        for(int i=0;i<meret;i++){
            for(int j=0;j<meret;j++){
                fin >> newgrid[i][j];
            }
        }
    }

    fin.close();

    /// most rajzolunk!

    HWND myconsole = GetConsoleWindow();

    HDC mydc = GetDC(myconsole);

    COLORREF black = RGB(0,0,0), red = RGB(255,0,0), green =               RGB(0,255,0), blue = RGB(0,0,255) , zero = RGB(229, 255, 0);

    for(int i=0;i<meret;i++){
        for(int j=0;j<meret;j++){
            if(newgrid[i][j] == 0){
                SetPixel(mydc, 10+i,10+j, zero);
            }else if(newgrid[i][j] == 1){
                SetPixel(mydc, 10+i,10+j, red);
            }else if(newgrid[i][j] == 2){
                SetPixel(mydc, 10+i,10+j, green);
            }else if(newgrid[i][j] == 3){
                SetPixel(mydc, 10+i,10+j, blue);
            }else{
                SetPixel(mydc,10+i,10+j, black);
            }
        }
    } 

    ReleaseDC(myconsole, mydc);

    cin.ignore();

    for(int i=0;i<N;i++){
        delete [] newgrid[i];
    }
    delete [] newgrid;

    return 0;
}

void toeple(int** grid){
    bool ready = false;
    do{
        ready = true;
        for(int i=1;i<N-1;i++){
            for(int j=1;j<N-1;j++){
                if(grid[i][j]>=gridMAX){
                    ready = false;
                    while(grid[i][j]>=gridMAX){
                        grid[i+1][j]++;
                        grid[i-1][j]++;
                        grid[i][j+1]++;
                        grid[i][j-1]++;
                        grid[i][j]-=gridMAX;
                    }
                }
            }
        }
    }while(!ready);
}

1 个答案:

答案 0 :(得分:-1)

您可以使用SetWorldTransform,SetMapMode和相关功能更改GDI坐标系。

Coordinate Spaces and Transformations

这些年来我用它来实现放大\缩小功能。

P.S。另外,如果使用SetPixelV而不是SetPixel,则可能会看到速度小幅提升。

SetPixelV function