002
06.11.2005, 18:35 Uhr
~Paul472
Gast
|
Okay, hier ist die main.cpp, schon etwas länger geworden...
C++: |
#include <windows.h> #include <math.h> #include "CComplex.cpp"
/* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
void paint(HDC hdc);
// Complex operations CComplex add(CComplex a, CComplex b); CComplex sub(CComplex a, CComplex b); CComplex div(CComplex a, CComplex b); CComplex mul(CComplex a, CComplex b); double dist(CComplex a, CComplex b);
CComplex func(CComplex x); CComplex deriv(CComplex x); HBRUSH color(CComplex x);
/* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp";
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{ HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0;
/* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ );
/* Make the window visible on the screen */ ShowWindow (hwnd, nFunsterStil);
/* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); }
/* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; }
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; switch (message) /* handle the messages */ { case WM_PAINT: { hdc = BeginPaint(hwnd, &ps); paint(hdc); EndPaint(hwnd, &ps); } break; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); }
return 0; }
void paint(HDC hdc) { RECT rect; CComplex point(0.0,0.0); for (int i=0; i<601; i++) { for (int j=0; j<401; j++) { point.SetRe(i); point.SetIm(j); rect.left=i; rect.right=i+1; rect.top=j; rect.bottom=j+1; FillRect(hdc,&rect,color(point)); } } }
// complex adition CComplex add(CComplex a, CComplex b) { CComplex result(0.0,0.0); result.SetRe( a.GetRe()+b.GetRe() ); result.SetIm( a.GetIm()+b.GetIm() ); return result; }
// complex subtraction CComplex sub(CComplex a, CComplex b) { CComplex result(0.0,0.0); result.SetRe( a.GetRe()-b.GetRe() ); result.SetIm( a.GetIm()-b.GetIm() ); return result; }
// complex divison CComplex div(CComplex a, CComplex b) { CComplex result(0.0,0.0); result.SetRe( a.GetRe()*b.GetRe()-a.GetIm()*b.GetIm() ); result.SetIm( a.GetRe()*b.GetIm()+a.GetIm()*b.GetRe() ); return result; }
// complex multiplication CComplex mul(CComplex a, CComplex b) { CComplex result(0.0,0.0); result.SetRe( (a.GetRe()*b.GetRe()+a.GetIm()*b.GetIm())/(a.GetIm()*a.GetIm()+b.GetIm()*b.GetIm()) ); result.SetIm( (a.GetIm()*b.GetRe()-a.GetRe()*b.GetIm())/(a.GetIm()*a.GetIm()+b.GetIm()*b.GetIm()) ); return result; }
// distance double dist(CComplex a, CComplex b) { return ( sqrt((a.GetRe()-b.GetRe())*(a.GetRe()-b.GetRe()) + (a.GetIm()-b.GetIm())*(a.GetIm()-b.GetIm())) ); }
CComplex func(CComplex x) { CComplex eins(1,0); return ( add(mul(mul(x,x),x),eins) ); }
CComplex deriv(CComplex x) { CComplex zwei(2,0); return ( mul(zwei,mul(x,x)) ); }
HBRUSH color(CComplex x) { int count = 0; HBRUSH red = CreateSolidBrush(0x0000FF); HBRUSH blue = CreateSolidBrush(0xFF0000); HBRUSH green = CreateSolidBrush(0x00FF00); HBRUSH white = CreateSolidBrush(0xFFFFFF); HBRUSH black = CreateSolidBrush(0x000000);
// zeropoints CComplex zeropoint1(-1,0); // red CComplex zeropoint2(0.5,-0.866); // blue CComplex zeropoint3(0.5,0.866); // green CComplex x1(0,0); // Newton method do { x1 = sub(x,div(func(x),deriv(x))); count++; x = x1; } while (dist(x1,x1) > 0.01 && count < 40 ); if (count == 40) return white; if (dist(x1,zeropoint1) < dist(x1,zeropoint2)) { if (dist(x1,zeropoint1) < dist(x1,zeropoint3)) return red; else return green; } else { if (dist(x1,zeropoint2) < dist(x1,zeropoint3)) return blue; else return green; } return black; }
|
|