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 zugrunde.
Hier
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 */