ребят, срочно помощь нужна. задача – построить картинку, что ниже по ссыли, максимально оптимировав код. нужен только код для построения самих линий. все вертикальные и горизонтальные не нужны. заранее благодарен.
//i037.radikal.ru/0907/52/af30e4096820.jpg
я пока дошел только до этого, не могу понять как добить циклы.
#include <windows.h>
//#include "resource.h"
HINSTANCE hInst;
char szAppName[] ="ApiWin";
char szTitle[] ="Window Application";
int cxClient;
int cyClient;
int i=1;
int n=1;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
WNDCLASSEX wc;
HWND hwnd;
hInst=hInstance;
memset(&wc,0,sizeof(wc));
wc.style =CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra= 0;
wc.cbWndExtra= 0;
wc.hInstance = hInst;
//wc.hIcon=(HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON1),IMAGE_ICON,32,32,0);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+13);
wc.lpszMenuName= NULL;
wc.lpszClassName = szAppName;
wc.cbSize=sizeof(WNDCLASSEX);
//wc.hIconSm=LoadImage(hInst,MAKEINTRESOURCE(IDI_APPICON_SM),IMAGE_ICON,16,16,0);
if(!RegisterClassEx(&wc))
return FALSE;
hwnd = CreateWindow(szAppName, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, hInst, NULL);
if (!hwnd)
return (FALSE);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_SIZE:
{
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
}
case WM_PAINT:
{
hdc=BeginPaint(hwnd,&ps);
HGDIOBJ hPen=CreatePen(PS_DASH, 2, RGB(0,0,0));
HGDIOBJ hOldPen=SelectObject(hdc,hPen);
HGDIOBJ hBrush=CreateSolidBrush(RGB(134,134,134));
HGDIOBJ hOldBrush=SelectObject(hdc,hBrush);
/*шар*/
Ellipse(hdc,cxClient/2-10,0,cxClient/2+10,20);
/*линии*/
MoveToEx(hdc, cxClient/2-10, 0, NULL);
LineTo(hdc, cxClient/2-10, 40);
MoveToEx(hdc, cxClient/2+10, 0, NULL);
LineTo(hdc, cxClient/2+10, 40);
while (n<=5){
while(i<=5){
MoveToEx(hdc, cxClient/(2*i), i*cyClient/5-20, NULL);
LineTo(hdc, cxClient/(2*(i+1)), i*cyClient/5+40);
MoveToEx(hdc, cxClient/(2*i), i*cyClient/5-20, NULL);
LineTo(hdc, cxClient/i-cxClient/(2*(i+1)), i*cyClient/5+40);
i++;
}
n++;
}
EndPaint(hwnd,&ps);
break;
}
/*case WM_LBUTTONDOWN:
MessageBox(NULL,"Hello, 32-bit world!","Window",MB_OK);
*/break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hwnd, message, wParam, lParam));
}
return (0);
}
28 июля 2009 в 0:00
читаем условие внимательно:
> нужен только код для построения самих линий. все вертикальные и горизонтальные не нужны.
27 июля 2009 в 22:05
тобишь крышу катать просто 2мя линиями? или она как объект там есть?
27 июля 2009 в 22:03
может мне за вас все написать, чтобы сразу? сказано же – крыша занимает половину отведенного ей места (две средние четвертинки).
27 июля 2009 в 22:02
а как саму крышу создать?
27 июля 2009 в 22:01
основа рисунка – занимающая половину места "крыша", втиснутая необходимое количество раз.
for(i=0;i<5;i++){
n=1<<i;
l=0;
for(j=0;j<n;j++){
r=l+cxClient/n;
roof(l,r,i*step_y);
l=r;
}
}
короче, разберетесь.