будьте милосердны, умоляю!!((
Задача: нарисовать правильные многоугольники с общей стороной с колличеством сторон п=3,..12. т.е. рисунок должен состоять из 10 фигур одновременно.
#include <windows.h>
#include <math.h>
HINSTANCE hInst;
char szAppName[] ="ApiWin";
char szTitle[] ="Window Application";
double RadPerDeg=0.0174532925199433;
int forvard(float dist, float n);
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+1);
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_PAINT:
{ hdc=BeginPaint(hwnd,&ps);
HGDIOBJ hPen=CreatePen(PS_DASH, 2, RGB(0,0,255));
HGDIOBJ hOldPen=SelectObject(hdc,hPen);
POINT A;
POINT FAR* lppt=&A;
float n;
float i,j,dist,k;
float x=400;
float y=250;
dist=20;
float x1;
float y1;
MoveToEx(hdc,x,y,NULL);
{for(i=3;i<13;i++)
{n=((i-2)*180)/i;
j=1;
if (i==3) j=0;
while (j!=i+1)//цикл повторяется столько раз, сколко сторон требуется нарисовать(кроме 3угольника, т.к. нужно вернуться на исходную позицию)
{MoveToEx(hdc,x,y,NULL);
x1=x+dist*cos(RadPerDeg*n);
y1=y+dist*sin(RadPerDeg*n);
LineTo(hdc,x1,y1);
x=x1;
y=y1;
j++;}
}
}
EndPaint(hwnd,&ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hwnd, message, wParam, lParam));
}
return (0);
}
28 июля 2009 в 23:01
> не знаю по какой причине, но от этих изменений в программе рисунок почти не изменился(
ну это я с утра ошибся. странно, что у вас мои изменения вообще скомпилировались – там была синтаксическая ошибка:
for(i=3;i<13;i++){
n=360/i; // была пропущена точка с запятой
MoveToEx(hdc,x1=x,y1=y,NULL);
for(j=0;j<i;j++) LineTo(hdc
,x1+=dist*cos(RadPerDeg*n*j)
,y1+=dist*sin(RadPerDeg*n*j) // был написан косинус вместо синуса
);
}
из-за косинуса вместо синуса оно ходило неправильно – по диагонали (я так думаю).
28 июля 2009 в 23:00
> ммм…а разве есть в ТЗ это условие?
явно указана связка C++/WinAPI
> Извините,но ИМХО построение графики с помощью WinAPI похоже на изобретение велосипеда)
преподавателей, насколько я понимаю, это не волнует. им-то как раз и нужны по-новому изобретенные велосипеды.
28 июля 2009 в 19:00
#21
про изобретение велосипеда согласен, но это очевидно является каким-то учебным заданием. Не думаю что, преподу понравится, если предъявить ему программу, которая использует неоговоренные библиотеки
28 июля 2009 в 18:03
Я имею ввиду кусок кода где "рисование" происходит проверить пошагово как работает программа.Эта возможность должна быть в меню компилятора. Более менее сложная программа обычно методом трасировки и отлаживается. В некоторых случаях без нее вообще не разберешься где что,особенно если код не тобой написан.
28 июля 2009 в 16:04
трасировку?…. смотря что имеется в виду под этим словом….:-[ не очень понимаю о чем вы…
28 июля 2009 в 10:03
#16
ммм…а разве есть в ТЗ это условие?
Извините,но ИМХО построение графики с помощью WinAPI похоже на изобретение велосипеда)
Автор,а вы трасировку пробовали делать?
28 июля 2009 в 10:00
Леонид maxleo Максимов : не знаю по какой причине, но от этих изменений в программе рисунок почти не изменился(
28 июля 2009 в 9:00
по поводу вашего результата:
> x1=x+dist*cos(RadPerDeg*n);
прибавляет постоянную для многоугольника величину. зачем?
должно было получиться что-то вроде:
for(i=3;i<13;i++){
n=/*180-*/360/i
MoveToEx(hdc,x1=x,y1=y,NULL);
for(j=0;j<i;j++) LineTo(hdc,x1+=dist*cos(RadPerDeg*n*j),y1+=dist*cos(RadPerDeg*n*j));
}
28 июля 2009 в 3:05
я тут помозговала и изменила программу, по-моему к лучшему, но она все равно не работает(
тут надо найти ошибку в функции(MoveToEx(hdc,x,y,NULL)…), но я ее не вижу(
как-то непонятно у меня с углом дела обстоят…
#include <windows.h>
#include <math.h>
HINSTANCE hInst;
char szAppName[] ="ApiWin";
char szTitle[] ="Window Application";
double RadPerDeg=0.0174532925199433;
int forvard(float dist, float n);
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+1);
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_PAINT:
{ hdc=BeginPaint(hwnd,&ps);
HGDIOBJ hPen=CreatePen(PS_DASH, 2, RGB(0,0,255));
HGDIOBJ hOldPen=SelectObject(hdc,hPen);
POINT A;
POINT FAR* lppt=&A;
float n;
float i,j,dist,k;
float x=400;
float y=250;
dist=20;
float x1;
float y1;
MoveToEx(hdc,x,y,NULL);
{for(i=3;i<13;i++)
{n=((i-2)*180)/i;
j=1;
if (i==3) j=0;
while (j!=i+1)//цикл повторяется столько раз, сколко сторон требуется нарисовать(кроме 3угольника, т.к. нужно вернуться на исходную позицию)
{MoveToEx(hdc,x,y,NULL);
x1=x+dist*cos(RadPerDeg*n);
y1=y+dist*sin(RadPerDeg*n);
LineTo(hdc,x1,y1);
x=x1;
y=y1;
j++;}
}
}
EndPaint(hwnd,&ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hwnd, message, wParam, lParam));
}
return (0);
}
28 июля 2009 в 3:05
на рисунок выходит какая-то штука, похожая на спираль, а это совсем не то, что надо…
27 июля 2009 в 21:01
2 Евгений Воронов
А что если по постановке задачи нельзя использовать никакие иные библиотеки кроме заявленных
27 июля 2009 в 16:03
Я бы подключил библиотеки DirectX и их функциями бы нарисовал все это дело) Код инициализации там стандартный.
27 июля 2009 в 15:04
рисовать все линии многоугольника.
проходим n итераций, где n – число сторон
27 июля 2009 в 8:04
Кирилл ———————————————————————————————— Быков: ой, и правда 10))
27 июля 2009 в 8:04
Леонид maxleo Максимов: насчет нового цикла: не совсем поняла, что он должен делать?
27 июля 2009 в 8:03
ваш алгоритм рисует по одной линии от каждого многоугольника. добавьте еще один цикл.
27 июля 2009 в 8:03
От 3 до 12 включительно — 10 фигур.
Ваш К.О.
27 июля 2009 в 8:03
(оффтоп) из чего nbsp?
27 июля 2009 в 8:02
Марат Павлов еще раз могу повторить, что до case WM_PAINT идет стандартная часть, или вы не согласны? а программы совсем не похожи, там должно получиться что-то типа спирали, вроде. у меня же 9 целых фигур с общей стороной
27 июля 2009 в 8:01
Сергей Викторович Середенин: ТЗ? в смысле, условие?
нарисовать правильные многоугольники с общей стороной с количеством сторон п=3,..12. т.е. рисунок должен состоять из 9 фигур одновременно.
а если вас смущает функция, то я пыталась написать ее с помощью черепашьей графики, по всей видимости, не очень удачно..(
27 июля 2009 в 5:01
Мань скинь с тему ТЗ или что-то похожее
27 июля 2009 в 4:03
Программисты>Обсуждения>WinApl
27 июля 2009 в 2:04
Марат Павлов: ??
я,вроде, уже упомянула, что мало что в этом всем понимаю…
27 июля 2009 в 2:04
и до case WM_PAINT идет стандартная часть
я не писала бы сюда если бы знала, что делать.
и вообще, о том,что в С++ можно еще и рисовать, я узнала дня 2 назад, так, что еще раз умоляю быть милосердными((
и вообще, данная программа пишется ночью, и мозг мой (или то, что на его месте), сейчас не особо функционирует((
вот(
27 июля 2009 в 2:03
Че за дешевый стеб?