?
Das ist unsere bestehendes Hauptprogramm.
#include "header8.h"
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin");
HWND hwnd, hwnd2;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass (&wndclass))
{
MessageBox(NULL,TEXT ("Programm setzt WIN NT voraus"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow (
szAppName,
TEXT ("Unser erstes Fenster für mb3b"),
WS_OVERLAPPEDWINDOW,
50,
50,
600,
400,
NULL,
NULL,
hInstance,
NULL);
anzp_schlaeger= punkte_r3 (schlaeger, "schlaeger.txt");
stift1=CreatePen(PS_SOLID,1,RGB(0,0,0));//durchgezogen, dicke 1, weiß
stift2=CreatePen(PS_SOLID,schlaeger[1][0],RGB(schlaeger[2][0],schlaeger[2][1],schlaeger[2][2]));
stift3=CreatePen(PS_SOLID,1,RGB(255,0,0));//druchgezogen, dicke 1, rot
stift4=CreatePen(PS_DOT,1,RGB(0,0,255));//Eigentlich bewegungslinie in blau gestrichelt "dot"
hintergrund1=CreateSolidBrush(RGB(255,255,255));
hintergrund2=CreateSolidBrush(RGB(0,0,0));//Flaeche schwarz
hintergrund3=CreateSolidBrush(RGB(0,255,0));// Flaeche
ShowWindow (hwnd, iCmdShow);
while (GetMessage (&msg, NULL, 0,0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
GetClientRect (hwnd, &rect);
//DrawText (hdc, TEXT("Hallo MBB3b! Das ist mein erstes Fenster im Maerz 2016"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_TOP);
unterprog1 (hwnd, hdc, rect);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
case WM_LBUTTONDOWN: // linke Maustaste
xe = (double)LOWORD(lParam); //Neue Pos aus Mauskoordinaten
ye = (double)HIWORD(lParam);
movexy(hwnd);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}
//case 'G': naben[3].greifer=1;break;// Nabe 3 greifen
//case 'L': naben[3].greifer=0;break;// loslassen
void movexy(HWND hwnd)
{
char wtext[80];
UpdateWindow (hwnd);
//sprintf(wtext, "Aktuelle Pos.: x = %3.2lf, y = %3.2lf",xe, ye);
//SetWindowText(hwnd, wtext); //Titelleiste akt.
//SelectObject(hdc,stift1);
//MoveToEx(hdc,xa,ya,NULL);
//LineTo(hdc,xe,ye);
//xa=xe;
//ya=ye;
bewegen(hwnd);
}//ausgelagertes Unterprogramm zum Test der Graphikfunktionen
void unterprog1 (HWND hwnd, HDC hdc, RECT rect)
{
int i;
t_step=10;
t_max=500;
anz_p1=7;
anz_p2=8;
anzahl_saiten_vert=schlaeger[3][0]; ////////////////////////MUSS vor den anz_nab deklariert werden////////////////////////
//anzahl_saiten_hori=schlaeger[4][0]; ////////////////////////MUSS vor den anz_nab deklariert werden////////////////////////
anz_nab=anzahl_saiten_vert*4;
//anz_nab=anzahl_saiten_vert*4;
v_band=0; // Pixel/sec
anzp_koerpern=0;
koerper_greifer=0; // nicht gegriffen
l=-1;
linie_ein=0; // sprühkopf aus
SelectObject(hdc,stift1);
anzp_nabform= punkte_r (nab_form, "form_nab.txt"); //siehe auch Kapitel 10
anzp_koerper= punkte_r (koerper, "koerper8.txt"); //siehe auch Kapitel 10
//////////////////////////////////Form der Roboterarme/////////////////////////////////////////////
arm1[0][0]=-20;
arm1[0][1]=-20;
arm1[1][0]=-20;
arm1[1][1]=130;
arm1[2][0]=20;
arm1[2][1]=130;
arm1[3][0]=20;
arm1[3][1]=-20;
arm1[4][0]=arm1[0][0];
arm1[4][1]=arm1[0][1];
arm1[5][0]=0;
arm1[5][1]=0;
arm1[6][0]=0;
arm1[6][1]=110;
arm2[0][0]=-20;
arm2[0][1]=-20;
arm2[1][0]=-20;
arm2[1][1]=130;
arm2[2][0]=0;
arm2[2][1]=150;
arm2[3][0]=20;
arm2[3][1]=130;
arm2[4][0]=20;
arm2[4][1]=-20;
arm2[5][0]=arm2[0][0];
arm2[5][1]=arm2[0][1];
arm2[6][0]=0;
arm2[6][1]=0;
arm2[7][0]=0;
arm2[7][1]=110;
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////Koordianten des Schlägers///////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////Ellipse
bandbreite=schlaeger[0][0]; /////////Breite der Ellipse
bandlaenge=schlaeger[0][1]; /////////Länge der Ellipse
band_pos_x=300; /////////Schlägermittelpunkt Mitte von der Ellipse (x=0)
band_pos_y=150; /////////Schlägermittelpunkt Mitte von der Ellipse (x=0)
band[0][0]=band_pos_x-bandlaenge/2;
band[0][1]=band_pos_y-bandbreite/2;
band[1][0]=band_pos_x+bandlaenge/2;
band[1][1]=band_pos_y+bandbreite/2;/////////////////////////////////////////////////////////////////Ellipse
griffbreite=20;/////////////////////////////////////////////////////////////////////////////////////Griff
grifflaenge=150;
griff[0][0]=band_pos_x+bandlaenge/2;
griff[0][1]=band_pos_y-griffbreite/2;
griff[1][0]=band_pos_x+bandlaenge+grifflaenge;
griff[1][1]=band_pos_y-griffbreite/2;
griff[2][0]=griff[1][0];
griff[2][1]=band_pos_y+griffbreite/2;
griff[3][0]=griff[0][0];
griff[3][1]=band_pos_y+griffbreite/2;//////////////////////////////////////////////////////////////Griff
///////////////////////////////////////////////////////Nabenpunkte die Roboterarm anfährt = Punkte auf der Ellipse
int t;
int k=-1, j=-1, l=-1;
/////X positiv /////Y positiv /////
for(t=0;t<=(anzahl_saiten_vert-1)/2;t++)
{
x_wert=(bandlaenge/2)/((anzahl_saiten_vert+1)/2);
naben[t].x=x_wert*t;
naben[t].y=Ellipsenpunkte(bandbreite, bandlaenge, anzahl_saiten_vert, anzahl_saiten_hori, x_wert*t);
printf("%lf\t",naben[t].x);
printf("%lf\n",naben[t].y);
}
/////X negativ /////Y positiv /////
for(t=(anzahl_saiten_vert+1)/2;t<=anzahl_saiten_vert;t++)
{
x_wert=(bandlaenge/2)/((anzahl_saiten_vert+1)/2);
k++;
naben[t].x=(-1)*x_wert*k;
naben[t].y=Ellipsenpunkte(bandbreite, bandlaenge, anzahl_saiten_vert, anzahl_saiten_hori, x_wert*(-1)*k);
printf("xxx%lf\t",naben[t].x);
printf("%lf\n",naben[t].y);
}
/////X negativ /////Y negativ /////
for(t=anzahl_saiten_vert+1;t<=((anzahl_saiten_vert*2)-((anzahl_saiten_vert-1)/2));t++)
{
x_wert=(bandlaenge/2)/((anzahl_saiten_vert+1)/2);
l++;
naben[t].x=(-1)*x_wert*l;
naben[t].y=(-1)*(Ellipsenpunkte(bandbreite, bandlaenge, anzahl_saiten_vert, anzahl_saiten_hori, x_wert*(-1)*l));
printf("zzz%lf\t",naben[t].x);
printf("%lf\n",naben[t].y);
}
/////X positiv /////Y negativ /////
for(t=(((anzahl_saiten_vert*2)+1)-((anzahl_saiten_vert-1)/2));t<=(anzahl_saiten_vert*2)+1;t++)
{
x_wert=bandlaenge/(anzahl_saiten_vert+1);
j++;
naben[t].x=x_wert*j;
naben[t].y=(-1)*(Ellipsenpunkte(bandbreite, bandlaenge, anzahl_saiten_vert, anzahl_saiten_hori, x_wert*j));
printf("yyy%lf\t",naben[t].x);
printf("%lf\n",naben[t].y);
}////////
l1=arm1[anz_p1-1][1]-arm1[anz_p1-2][1];///////Abstand der Punkte des ersten Roboterarmes = Länge des Roboterarmes
l2=arm2[anz_p2-1][1]-arm2[anz_p2-2][1];///////Abstand der Punkte des ersten Roboterarmes = Länge des Roboterarmes
verschiebung[0]=band_pos_x; ////////////////////////////////////////Position des Roboter Hauptarmes
verschiebung[1]=band_pos_y+(bandbreite/2)+50; //////////////////////Position des Roboter Hauptarmes
linie_ein=1;// sprühkopf ein=1 sprühkopf aus=0
xa=verschiebung[0]; // Startpunkt festlegen
ya=verschiebung[1];
/*
xe=xa+100; //Anfangspunkt auf den der Roboter als Erstes fährt
ye=ya; //Anfangspunkt auf den der Roboter als Erstes fährt
bewegen(hwnd);
*/
t_max=500; // für konstante v sollte t_max proportional zur Strecke sein
for (i=0;i<anz_nab;i++)
{
xe=band_pos_x+naben[i].x;
ye=band_pos_y-naben[i].y;
bewegen(hwnd);
}// for i...
xe=450; //Endpunkt auf den der Roboter am Ende des Programmes fährt
ye=250; //Endpunkt auf den der Roboter am Ende des Programmes fährt
bewegen(hwnd);
linie_ein=0;// sprühkopf ein=1 sprühkopf aus=0
}// void unterprog1
//////////////////////////////////////////////////
//////////////////////////////////////////////////
//////////////Zeichnet Roboterarm/////////////////
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void PaintArm(double arm[][2], int anz_p)
{
double r=5; // Radius der Roboterachsen
int i;
POINT pt[100];
for (i=0;i<anz_p-2;i++)
{
pt[i].x=(int)arm[i][0];
pt[i].y=(int)arm[i][1];
}
//Polygon(hdc,pt,anz_p-2);
Polyline(hdc,pt,anz_p-2);
Ellipse(hdc,arm[anz_p-2][0]-r,arm[anz_p-2][1]-r,arm[anz_p-2][0]+r,arm[anz_p-2][1]+r);
Ellipse(hdc,arm[anz_p-1][0]-r,arm[anz_p-1][1]-r,arm[anz_p-1][0]+r,arm[anz_p-1][1]+r);
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
//////////////Zeichnet den Schläger///////////////
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void PaintSchlaeger(double polyg1[][2], int anz_p1, double polyg2[][2], int anz_p2)
{
int i;
POINT pt[100];
for (i=0;i<anz_p2;i++)//////////////////////////////////////////////////////Griff zeichnen
{
pt[i].x=(int)polyg2[i][0];
pt[i].y=(int)polyg2[i][1];
}
SelectObject(hdc,hintergrund2);
Polygon(hdc,pt,anz_p2);
SelectObject(hdc,hintergrund1);
for (i=0;i<anz_p1;i++) /////////////////////////////////////////////////////Ellipse zeichnen
{
pt[i].x=(int)polyg1[i][0];
pt[i].y=(int)polyg1[i][1];
}
SelectObject(hdc,stift2);
Ellipse(hdc,band[0][0],band[0][1],band[1][0],band[1][1]);
SelectObject(hdc,stift1);
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
///////Zeichnet den Griff des Schlägers///////////
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void PaintPolyg(double polyg[][2], int anz_p)
{
int i;
POINT pt[100];
for (i=0;i<anz_p;i++)
{
pt[i].x=(int)polyg[i][0];
pt[i].y=(int)polyg[i][1];
}
Polygon(hdc,pt,anz_p);
//Polyline(hdc,pt,anz_p-2);
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
////////////////Zeichnet Naben ///////////////////
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void PaintNaben(int anz_p)
{
double r=10; // Radius der Naben
double rk=5; // Radius für kleine Naben // typ 2
int i;
int j;
double formn[100][2];
double winkel=0;
double drehpunkt[2];
drehpunkt[0]=0;
drehpunkt[1]=0;
for(i=0;i<anz_p;i++)
{
if (naben[i].typ==1) Ellipse(hdc,naben[i].x-r,naben[i].y-r,naben[i].x+r,naben[i].y+r);
if (naben[i].typ==2) Ellipse(hdc,naben[i].x-rk,naben[i].y-rk,naben[i].x+rk,naben[i].y+rk);// kleine Naben
if (naben[i].typ==3)
{
shiftpunkt[0]=naben[i].x;
shiftpunkt[1]=naben[i].y;
for (j=0;j<anzp_nabform;j++)
{
TrafoPoint (nab_form[j], formn[j], naben[i].winkel, drehpunkt, shiftpunkt);
} // for j..
PaintPolyg(formn, anzp_nabform);
}
}
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
////////Weg des Roboters mit Linie zeigen/////////
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void PaintLinie(void)
{
int i;
SelectObject(hdc,stift4);
for (i=0;i<=l;i++)
{
MoveToEx(hdc,linie[i][0][0],linie[i][0][1],NULL) ;// linie i anfangshiftpunkt
LineTo(hdc,linie[i][1][0],linie[i][1][1]);
} // for i..
SelectObject(hdc,stift1);
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
//////////////Ellipsenpunkte berechnen////////////
//////////////////////////////////////////////////
//////////////////////////////////////////////////
double Ellipsenpunkte(double bandbreite, double bandlaenge, double anzahl_saiten_vert, double anzahl_saiten_hori, double x_wert)
{
double xelli, yelli, a, b;
a=bandlaenge/2;
b=bandbreite/2;
yelli=sqrt( (1- ( (x_wert*x_wert) / (a*a) ) )*(b*b) );
//xelli=sqrt( (1- ( (y_wert*t*t*y_wert) / (b*b) ) )*(a*a) );
return(yelli);
}