: 2024-06-17 19:42 采纳率: 80%
浏览 10
已结题

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

如何用vs和mfc完成以下问题:在屏幕上使用鼠标左键绘制数量大于4的任意顶点形成控制多边形,单击鼠标右键绘制三次B样条曲线,同时在控制多边形的每一个特征三角形内用虚线显示三次B样条曲线的几何生成过程

  • 写回答

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)
    {
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    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)
    {
        m_points.Add(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);
                    m_splinePoints.Add(CPoint(x, y));
                }
            }
        }
        Invalidate();
        CDialog::OnRButtonDown(nFlags, point);
    }
    

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

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

    评论 编辑记录

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 咨询一下有关于王者荣耀赢藏战绩
  • ¥100 求购一套带接口实现实习自动签到打卡
  • ¥50 MacOS 使用虚拟机安装k8s
  • ¥500 亚马逊 COOKIE我如何才能实现 登录一个亚马逊账户 下发新 COOKIE ..我使用下发新COOKIE 导入ADS 指纹浏览器登录,我把账户密码 修改过后,原来下发新COOKIE 不会失效的方式
  • ¥20 玩游戏gpu和cpu利用率特别低,玩游戏卡顿
  • ¥25 oracle中的正则匹配
  • ¥15 关于#vscode#的问题:把软件卸载不会再出现蓝屏
  • ¥15 vimplus出现的错误
  • ¥15 usb无线网卡转typec口
  • ¥30 怎么使用AVL fire ESE软件自带的优化模式来优化设计Soot和NOx?