Zurück (C) Christof Ermer, Regensburg
Gästebuch 
(public. sonst besser Email)  ChristofErmer@gmail.com



22.08.2018
02.08.18

DEV-C++
Kostenloser C++ Compiler: DEV-C++    -->  ANSI-C und C++:

Diesen Compiler einfach installieren. . von : http://www.bloodshed.net/dev/devcpp.html
http://www.bloodshed.net/dev/
Dem C-Compiler liegt GNU-CPP zugrundeHier habe ich kleine Andweungen,  Grafikbeispiele, für DEV-Cpp
Ich probiere immer wieder Methoden aus den Foren aus. --> Google
So lernt man selbst, wie was zu steuern ist.



Vorbereitung zu einem Grafik Projekt--> Lib_Konfig
Zuerst ein Projekt kreieren,
Wenn man die SetPixel Funktion benutzen möchte:
Füge folgendes zum LINKER hinzu
    -->unter Projekt Optionen, Parameter, Linker
....
C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib\libgdi32.a



//Diese sin/cos Funktion  zeichnet einen Kreis als Pixelgrafik

#include <iostream>
#include <math.h>
#include <windows.h>

Wenn man die SetPixel Funktion benutzen möchte:
//Füge folgendes zum LINKER hinzu-->unter Projekt Optionen, Parameter, Linker
//C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib\libgdi32.a

//const double M_PI = 4*atan(1.0);   //ist schon in math implementiertt
int main(void)
{
    HWND hWnd = FindWindow("ConsoleWindowClass", NULL);
    HDC hdc = GetDC(hWnd);

    for(double x = 0; x <= 360; x++)
    {
        double x_sin = sin(x*M_PI/180);
        double y_cos = cos(x*M_PI/180);
        SetPixel(hdc, 150-(x_sin*100), 150-(y_cos*100), RGB(255, 255, 255));
    }
system("pause");
return 0;
};



  Dann an:  (die rechte Grafik)  
    QuellFile für
DEV_CPP  Compiler : SigmoidFunction.zip
Dazu muss die Grafik lib in den Compiler eingebunden werden ( siehe #Lib-Konfig )
          

Konfiguration:
Für meine Grafikbeipiele  habe ich diese Bibliotk eingetragen.   
Menü-->Projekt--> Projektoptionen" --> Paramterer --> Linker
die Bibliothek 
"libgdi32.a" , zu finden unter dem Pfad 
C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib\libgdi32.a
( nicht lib32/libgdi32.a )
und zwar so: "../../../../../Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libgdi32.a"   (ohne /lib32\/libgdi32.a)
"../../../../../Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32/libgdi32.a"  (mit /lib32/libgdi32.a)

ausprobieren. !!

also bei mir ging es trotz 64Bit Debug Option mit /lib/libgdi32.a     (ohne  /lib32 )
Dies ALLES ERLEDIGT das Öffnen meiner zum Projekt gehörenden Projektdatei:   Name.dev
Also:    Lade die Beispiel "Zips", jede in einen in eigenen Ordner:
    Öffne
mit DEV-C++ die Projektdatei  *.dev  im Ordner  
    z.B. "FunktionX.dev"
    dann mit F9 compilieren, oder gleich mit F10 Ausführen
Diese Beispiele sind mitten aus der Bastel-Entwicklung gerissen, mit Artefakten, aber dennoch anschaulich brauchbar.

schon älter--> da sind noch allerlei Fehler drin, aber stöbern darf man ja.
> Graf_Iissaj.zip   --> Graf_Fraktal8-neu.zip evtl die /lib/libgdi32.a Einbindung erneuern Wichtig ist für das Verständnis, die "allereinfachste" Windows Konsolenfenster Generierung,
    -->Wie der Datentyp  "HANDLE auf Window" "HWND" usw.
Es gibt zahlreiche Lernseiten im Web dazu.   --> Googeln




SCHON ÄLTER ( mit kleinen Fehlern ) Also:    Lade die Beispiel Zips, jede in einen in eigenen Ordner:
    Öffne die Projektdatei im Ornder mit DEV-C++  z.B. "FunktionsgraphikX.dev"
    dann mit F9 compilieren, oder gelich mit F10 Ausführen
Diese Beispiele sind mitten aus der Bastel-Entwicklung gerissen, mit Artefakten , aber dennoch anschaulich brauchbar.
ich probiere immer wieder Methoden aus Google und den Foren aus. So lernt man selbst, wie, was zu steuern ist.
Fange damit an   EulerProdukt.zip   -->    FunktionX.zip   -- > Graf_Iissaj.zip   --> Graf_Fraktal8-neu.zip Wichtig ist für das Verständnis die allereinfachste Windows Fenstergenerierung,



Hier noch was schönes zum rumspielen Feigenbaumdiagramm _ Feigenbaum.zip
zum Artikel: https://www.heise.de/newsticker/meldung/Zahlen-bitte-Die-Feigenbaum-Konstante-beschreibt-Ordnung-im-Chaos-4141733.html
Arbeitsweise:  a...get von 2...5, ab 3.2 wird es interessant, ab 3.4 gibt es 4 Wertem , ab
a = 0.2
x = 4.0
for i in range(200):
    a = X*a*(1-a)
    print(a)

Hier mein "Weit-Bereichs" C++  Feigenbaum mit    a= 0.2 und X->-5..+5



NÜTZLICHES

#define ROUND(a) ((int) (a + 0.5))

static HWND sHwnd;

static COLORREF redColor=RGB(255,0,0);
static COLORREF blueColor=RGB(0,0,255);
static COLORREF greenColor=RGB(0,255,0);
static COLORREF whiteColor=RGB(255,255,255);

void setPixel(int x,int y,COLORREF& color=whiteColor)
{
if(sHwnd==NULL)
    {
    MessageBox(NULL,"sHwnd was not initialized !","Error",MB_OK|MB_ICONERROR);
    exit(0);
}
HDC hdc=GetDC(sHwnd);
SetPixel(hdc,x,y,color);
ReleaseDC(sHwnd,hdc);
return;
}


void drawLineDDA(int xa, int ya, int xb, int yb)
{
   int dx = xb - xa, dy = yb - ya, steps, k;
   float xIncrement, yIncrement, x = xa, y = ya;
   if(abs(dx) > abs(dy)) steps = abs(dx);
   else steps = abs(dy);
   xIncrement = dx / (float) steps;
   yIncrement = dy / (float) steps;
   setPixel(ROUND(x), ROUND(y));
   for(int k = 0; k < steps; k++)
    {
    x += xIncrement;
    y += yIncrement;
    setPixel(x, y);
     }
};


Nur ein BEISPIEL:

Hier mal eine LIV ECode Ansicht, noch mit allerlei Murks: so mitten aus der Arbeit

Header Datei
#define clear() printf("\033[H\033[J")
#define gotoxy(x,y) printf("\033[%d;%dH", (x), (y))

//ifndef MAIN_HEADER  //Prevents multiple includes
#define MAIN_HEADER

// FENSTER PIXEL GROESSE
// ------------------------

#define WIN_X_WIDTH         (600)
#define WIN_Y_WIDTH        (600)
#define ADDITIONAL_X    32 //32
#define ADDITIONAL_Y    32 //32

#define X_RESOLUTON        WIN_X_WIDTH
#define Y_RESOLUTON        WIN_Y_WIDTH

#define WIN_X_MITTE        (WIN_X_WIDTH/2)
#define    WIN_Y_MITTE        (WIN_Y_WIDTH/2)

#define CHARMAX_X    128
#define CHARMAX_Y    80

#define COULOUR_MAX_VAL    16777216UL
#endif  //MAIN_HEADER


/*
Christof Ermer  Regensburg
02.08.2018
Fermikurve.c
*/

#define PROG_NAME  "FunktionX"

#pragma comment(lib,"libgdi32.a")   // einbinden von lib

#include <windows.h>
#include <iostream>
#include <limits>
#include <stdexcept>

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
#include <math.h>
#include "main.h"
#include "MyCodeTools.h"

using namespace std;
//GLOBAL
HWND hWnd;
HDC hDC;
//HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
//CONSOLE_SCREEN_BUFFER_INFO sConScreenInf;

// ******************************
void KreuzZeichnen(void)
// ******************************
{
uint16_t i16NN;
//KREUZ
for( i16NN = 0 ; i16NN < WIN_X_WIDTH ; i16NN++)
    {
    SetPixel(hDC, i16NN, WIN_Y_MITTE, RGB(255, 255, 0));               
    };
for( i16NN = 0 ; i16NN < WIN_Y_WIDTH ; i16NN++)
    {
    SetPixel(hDC, WIN_X_MITTE, i16NN, RGB(255, 0, 255));               
    };
};

// ******************************
void PLotX_ToY( double dXX, double  dYY)  //Normiert auf 0
// ******************************
{
uint16_t u16WIN_X = round( dXX ) + WIN_X_MITTE;
uint16_t u16WIN_Y = (round( dYY ) * -1.0) + WIN_Y_MITTE;

if( (u16WIN_X < WIN_X_WIDTH) && (u16WIN_Y < WIN_Y_WIDTH) )
    {
    SetPixel(hDC, u16WIN_X, u16WIN_Y , RGB(255, 255, 255));               
    }
};

// ****************************************************************
void FunktionSinus( void )
// ****************************************************************
{
int16_t i16XPos;
for(i16XPos = 0; i16XPos < X_RESOLUTON; i16XPos++)     //0..1024
    {
    SetPixel(hDC, i16XPos, 512 + 512 * sin(2*M_PI* i16XPos/(float)X_RESOLUTON), RGB(255, 255, 255));   
    };
};

// ****************************************************************
void FunktionX( float fX_LowestValue, float fX_HighestValue, float fY_Expected_MIN_Value, float fY_Expected_MAX_Value)
// ****************************************************************
{
int16_t i16XPos;
int16_t i16YPos;
float f16XX;    //realer X
float f16YY;    //realer y
float fY_Plotval;

//LEGE RECHNBEREICH FEST
#define CHARMAX_X    128
#define CHARMAX_Y    80
//-512..+512
for(i16XPos = 0; i16XPos < X_RESOLUTON; i16XPos++)     //0..1024
    {
    //generiere passenden X Normiert auf Plotscala
    f16XX = fX_LowestValue + (((fX_HighestValue - fX_LowestValue )/(float)X_RESOLUTON) * i16XPos);
    //Funktion
    // F(x) = 2X^2+5
    f16YY = 1 / (1 +  exp( -1*(f16XX) ) );

    //Normiere auf PLOTscala
    fY_Plotval = f16YY * ((float)Y_RESOLUTON)/(fY_Expected_MAX_Value - fY_Expected_MIN_Value);
    PLotX_ToY( i16XPos-WIN_X_MITTE , fY_Plotval );
    gotoxy(1,0);
    PrintSpaces(30);
    gotoxy(1,0);
    printf("\r\nu16XPos=%d=X:%f    ply%f=Y:%f   ",i16XPos-WIN_X_MITTE,f16XX, (round( fY_Plotval ) * -1.0) + WIN_Y_MITTE, f16YY );
     //Sleep(100);
    };
//AchseBeschriften(fX_LowestValue, fX_HighestValue, fY_Expected_MAX_Value, fY_Expected_MIN_Value);
KreuzZeichnen();
};

// ******************************
int main(void)
// ******************************
{

//https://docs.microsoft.com/en-us/windows/console/creation-of-a-console
//https://docs.microsoft.com/en-us/windows/console/getconsolewindow

   //HWND hWnd = FindWindow(NULL, "Grafik in Dos");
    //alternative zu FindWindow
//SMALL_RECT windowSize = {0, 0, WIN_X_WIDTH, WIN_Y_WIDTH};
//hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
hWnd = GetConsoleWindow();
if( hWnd != NULL )
    {
    hDC = GetDC(hWnd);
    SetConsoleTitle( PROG_NAME ); 
    //MoveWindow(hWnd,100,100,windowWidth,windowHeight,FALSE);
    MoveWindow(hWnd ,100,100 ,WIN_X_WIDTH+ADDITIONAL_X, WIN_Y_WIDTH+ADDITIONAL_Y, TRUE); //TRUE   

/*
    if(!SetConsoleWindowInfo(hConsole, TRUE, &windowSize))
        {
            cout << "SetConsoleWindowInfo failed with error " << GetLastError() << endl;
            return -1;
        }
*/
    }
else
    {
    return -1;
}    ;
/*
//GetCursorposition
//console con( 80, 200 );
//SetConsoleWindowInfo
SetConsoleScreenBufferSize
*/   
    system("cls");
    gotoxy(0,0);
    KreuzZeichnen();       
    FunktionX(-5,5,-1.2,1.2);
    //FunktionSinus();
    //CheckPrint();
     //gotoxy(0,4);
    //printf("\n\r\r%f", AhochX(2,16) );
    ReleaseDC(hWnd, hDC);
    DeleteDC(hDC);
    //std::cin.get();
printf("\n\r\a"); // beep
    system("pause");  
    return 0;       
};/* run this program using the console pauser or add your own getch, system("pause") or input loop */