вторник, 16 мая 2017 г.

Программирование. Правильный многоугольник.

Программирование. Правильный многоугольник. 


Сегодня мы будем программировать правильные многоугольники. 
Для этого мы открываем Visual Studio? Не забывая поменять разрядность компилируем. Должно выскочить пустое окно. После этого переходим непосредственно к коду программы: 

Solution Explorer → ProgramDlg.cpp
#include "stdafx.h"
#include "Program.h"
#include "ProgramDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// диалоговое окно CProgramDlg
  

CProgramDlg::CProgramDlg(CWndpParent /*=NULL*/)
       : CDialog(IDD_PROGRAM_DIALOGpParent)
{
       m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CProgramDlg::DoDataExchange(CDataExchangepDX)
{
       CDialog::DoDataExchange(pDX);



       fg = true;

       SetWindowTextW(L"Program");
}

BEGIN_MESSAGE_MAP(CProgramDlgCDialog)
       ON_WM_PAINT()
       ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()


// обработчики сообщений CProgramDlg

BOOL CProgramDlg::OnInitDialog()
{
       CDialog::OnInitDialog();

       // Задает значок для этого диалогового окна.  Среда делает это автоматически,
       //  если главное окно приложения не является диалоговым
       SetIcon(m_hIcon, TRUE);                 // Крупный значок
       SetIcon(m_hIcon, FALSE);          // Мелкий значок

       // TODO: добавьте дополнительную инициализацию

       return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
}

// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
//  чтобы нарисовать значок.  Для приложений MFC, использующих модель документов или представлений,
//  это автоматически выполняется рабочей областью.

void CProgramDlg::OnPaint()
{
       if (IsIconic())
       {
             CPaintDC dc(this); // контекст устройства для рисования

             SendMessage(WM_ICONERASEBKGNDreinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

             // Выравнивание значка по центру клиентского прямоугольника
             int cxIcon = GetSystemMetrics(SM_CXICON);
             int cyIcon = GetSystemMetrics(SM_CYICON);
             CRect rect;
             GetClientRect(&rect);
             int x = (rect.Width() - cxIcon + 1) / 2;
             int y = (rect.Height() - cyIcon + 1) / 2;

             // Нарисуйте значок
             dc.DrawIcon(x, y, m_hIcon);
       }
       else
       {
             CClientDC dc(this);
             GetClientRect(&rc);
            

             dc.FillSolidRect(&rc, RGB(255, 255, 255));
             cf = RGB(255, 255, 255);
             COLORREF ck = RGB(50, 70, 120);

             int cxClient, cyClient;
             cyClient = rc.bottom;//высота
             cxClient = rc.right;//ширина

             hPenOxy = CreatePen(PS_SOLID, 2, ck);//создаем кисть цветом "crOxy"
             hOldPen = (HPEN)SelectObject(dc, hPenOxy);

             int XX[100], YY[100];
             int n = 3;
             int r = 200;
             for (k = 0; k <= n; k++)
             {
                    XX[k] = cxClient / 2 + r*sin(pi * 2 / n*k);
                    YY[k] = cyClient / 2 + r*cos(pi * 2 / n*k);
         }
             //for (k = 0; k < n; k++)
             k = 0;
             {
                    dc.MoveTo(XX[k], YY[k]);
                    for (i = 0; i <= n; i++)
                    {
                           dc.LineTo(XX[i], YY[i]);
                           //dc.MoveTo(XX[k], YY[k]);
                    }
             }

             SelectObject(dc, hOldPen);
             DeleteObject(hPenOxy);

            
             CDialog::OnPaint();
       }
}

// Система вызывает эту функцию для получения отображения курсора при перемещении
//  свернутого окна.
HCURSOR CProgramDlg::OnQueryDragIcon()
{
       return static_cast<HCURSOR>(m_hIcon);
}

Меняя число в пункте int n = 3, мы можем менять количество углов в многоугольнике. 
int n = 3

int n = 5

int n = 17

И так далее. 
Программа готова! 

Комментариев нет:

Отправить комментарий