21xrx.com
2024-12-22 20:31:09 Sunday
登录
文章检索 我的文章 写文章
如何在C++中绘制爱心图案
2023-07-02 07:22:09 深夜i     --     --
C++编程 绘图函数 爱心图案 数学函数 图形库

在C++中,我们可以使用一些基础的绘图库来实现绘制爱心图案。下面将介绍几种方法:

1. 使用图形库

我们可以使用图形库来实现绘制爱心图案。在Windows下,我们可以使用Windows API来绘图。以下是使用Windows API绘制爱心图案的示例代码:


#include <windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

  PAINTSTRUCT ps;

  HDC hdc;

  switch (message)

  {

  case WM_PAINT:

    hdc = BeginPaint(hWnd, &ps);

    // 绘制爱心图案

    MoveToEx(hdc, 200, 200, NULL);

    for (double angle = 0; angle <= 2 * 3.1415926; angle += 0.1)

    {

      double x = 16 * pow(sin(angle), 3);

      double y = 13 * cos(angle) - 5 * cos(2 * angle) - 2 * cos(3 * angle) - cos(4 * angle);

      LineTo(hdc, x + 200, -y + 200);

    }

    EndPaint(hWnd, &ps);

    break;

  case WM_DESTROY:

    PostQuitMessage(0);

    break;

  default:

    return DefWindowProc(hWnd, message, wParam, lParam);

  }

  return 0;

}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR lpCmdLine, int nCmdShow)

{

  WNDCLASSEX wcex;

  HWND hWnd;

  MSG msg;

  // 注册窗口类

  wcex.cbSize = sizeof(WNDCLASSEX);

  wcex.style = CS_HREDRAW | CS_VREDRAW;

  wcex.lpfnWndProc = WndProc;

  wcex.cbClsExtra = 0;

  wcex.cbWndExtra = 0;

  wcex.hInstance = hInstance;

  wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);

  wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

  wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

  wcex.lpszMenuName = NULL;

  wcex.lpszClassName = L"WindowClass";

  wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);

  RegisterClassEx(&wcex);

  // 创建窗口

  hWnd = CreateWindow(

    L"WindowClass",

    L"爱心",

    WS_OVERLAPPEDWINDOW,

    CW_USEDEFAULT, CW_USEDEFAULT,

    640, 480,

    NULL,

    NULL,

    hInstance,

    NULL

  );

  if (!hWnd)

  

    return -1;

  

  // 显示窗口

  ShowWindow(hWnd, nCmdShow);

  UpdateWindow(hWnd);

  // 消息循环

  while (GetMessage(&msg, NULL, 0, 0))

  {

    TranslateMessage(&msg);

    DispatchMessage(&msg);

  }

  return (int)msg.wParam;

}

上述代码中,我们使用Windows API中的HDC类型来绘图,在WM_PAINT消息中调用BeginPaint和EndPaint函数来获取和释放绘图设备。在绘制爱心图案时,我们使用了参数方程(也称为极坐标方程)来计算坐标。

2. 使用空格字符

另一种实现方法是使用空格字符。我们可以分别在控制台中绘制两个大的圆形,然后通过在两个圆形之间添加适量的空格字符来形成爱心图案。以下是使用空格字符绘制爱心图案的示例代码:


#include <iostream>

#include <cmath>

#include <windows.h>

using namespace std;

const double PI = 3.1415926;

int main()

{

  // 设置控制台窗口大小

  system("mode con cols=100 lines=50");

  // 定义控制台窗口句柄和绘图设备句柄

  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

  CONSOLE_SCREEN_BUFFER_INFO csbi;

  GetConsoleScreenBufferInfo(hConsole, &csbi);

  COORD bufferSize = 100;

  if (csbi.dwSize.X < bufferSize.X || csbi.dwSize.Y < bufferSize.Y)

  {

    SetConsoleScreenBufferSize(hConsole, bufferSize);

  }

  // 计算两个圆形的半径和圆心坐标

  double R1 = 10, R2 = 20;

  double x1 = R2, y1 = R2, x2 = 3 * R2, y2 = R2;

  // 绘制两个圆形

  for (int y = -R2; y <= R2; ++y)

  {

    for (int x = -3 * R2; x <= 3 * R2; ++x)

    {

      double dist1 = sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));

      double dist2 = sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));

      if (fabs(dist1 - R1) < 0.5 || fabs(dist2 - R2) < 0.5)

      {

        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);

        cout << "*";

      }

      else if (dist1 < R1 && dist2 < R2)

      {

        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);

        cout << " ";

      }

      else

      {

        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);

        cout << " ";

      }

    }

    cout << endl;

  }

  // 输出爱心

  SetConsoleCursorPosition(hConsole, {0, R2 + 1});

  cout << "I love you!" << endl;

  return 0;

}

上述代码中,我们首先设置了控制台窗口的大小,并获取了控制台窗口句柄和绘图设备句柄。然后,通过计算两个圆形的半径和圆心坐标,我们在控制台中绘制了两个大的圆形。最后通过添加适量的空格字符,我们形成了爱心图案。

这两种方法都可以用来绘制爱心图案,具体使用哪一种可以根据实际需求选择。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复