: 2024-06-17 19:42 采纳率: 80%

# 计算机图形多边形及三次样条曲线绘制

• 写回答

#### 27条回答默认 最新

• 专家-赤兔[在线] 全栈领域优质创作者 2024-06-17 19:42
关注
获得0.30元问题酬金

引自免费微信小程序：皆我百晓生

以下是一个简单的示例代码，演示如何使用MFC在屏幕上绘制多边形和三次B样条曲线，并在控制多边形的特征三角形内显示生成过程：

``````#include "stdafx.h"
#include "MFCApplication.h"
#include "MFCApplicationDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CMyApp theApp;

BOOL CMyApp::InitInstance()
{
CWinApp::InitInstance();
CMyDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
return FALSE;
}

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()

void CMyDlg::OnPaint()
{
CPaintDC dc(this);
for (int i = 0; i < m_points.GetSize(); i++)
{
dc.SetPixel(m_points[i], RGB(0, 0, 0)); // 绘制多边形顶点
}

if (m_points.GetSize() > 4 && m_splinePoints.GetSize() >= 4)
{
for (int i = 0; i < m_splinePoints.GetSize() - 3; i++)
{
dc.MoveTo(m_splinePoints[i]);
dc.LineTo(m_splinePoints[i + 1]);
dc.LineTo(m_splinePoints[i + 2]);
dc.LineTo(m_splinePoints[i + 3]); // 绘制三次B样条曲线
}
}
}

void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
Invalidate();
CDialog::OnLButtonDown(nFlags, point);
}

void CMyDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
if (m_points.GetSize() > 4)
{
m_splinePoints.RemoveAll();
// 计算三次B样条曲线的控制点
for (int i = 0; i < m_points.GetSize() - 3; i++)
{
CPoint p0 = m_points[i];
CPoint p1 = m_points[i + 1];
CPoint p2 = m_points[i + 2];
CPoint p3 = m_points[i + 3];
for (double t = 0.0; t <= 1.0; t += 0.01)
{
double x = 0.5 * ((-t*t*t + 3*t*t - 3*t + 1) * p0.x + (3*t*t*t - 6*t*t + 3*t) * p1.x + (-3*t*t*t + 3*t*t) * p2.x + (t*t*t) * p3.x);
double y = 0.5 * ((-t*t*t + 3*t*t - 3*t + 1) * p0.y + (3*t*t*t - 6*t*t + 3*t) * p1.y + (-3*t*t*t + 3*t*t) * p2.y + (t*t*t) * p3.y);
}
}
}
Invalidate();
CDialog::OnRButtonDown(nFlags, point);
}
``````

这段代码创建了一个MFC应用程序，窗口上可以用鼠标左键点击来绘制多边形的顶点，用鼠标右键点击来绘制三次B样条曲线。在`OnPaint()`函数中绘制多边形顶点和B样条曲线，`OnLButtonDown()`函数处理左键点击事件，`OnRButtonDown()`函数处理右键点击事件。生成B样条曲线的代码使用了三次B样条曲线的计算公式。

请注意，这只是一个简单的示例，实际应用中可能需要更多的错误处理和优化。您可以根据需要对代码进行修改和扩展。

评论 编辑记录

• 系统已结题 6月25日
• 创建了问题 6月17日

#### 悬赏问题

• ¥15 咨询一下有关于王者荣耀赢藏战绩
• ¥100 求购一套带接口实现实习自动签到打卡
• ¥50 MacOS 使用虚拟机安装k8s