最小二乘法拟合直线-C++实现

最近公司的一个项目需要计算TVDI(Temperature Vegetation Dryness Index ,温度植被干旱指数) ,TVDI的计算公式如下(具体原理自行百度):

其中,为任意像元的地表温度;

在使用 Visual C++ 实现最小二乘法拟合直线并将其展示在图形界面中时,主要涉及以下几个关键步骤:数据输入、计算拟合直线的参数(斜率和截距)、绘制原始数据点以及绘制拟合直线。以下是一个完整的实现示例。 ### 数据结构与类设计 为了在图形界面中操作,需要一个用于存储数据点的类或结构。假设使用 MFC(Microsoft Foundation Classes)框架,可以通过 `CView` 派生类来实现绘图功能。 ```cpp // 在视图类头文件中定义 class CLeastSquaresView : public CView { protected: std::vector<CPoint> m_dataPoints; // 存储用户输入的数据点 double m_slope; // 拟合直线的斜率 double m_intercept; // 拟合直线的截距 void ComputeLeastSquares(); // 计算最小二乘法参数 void DrawDataPoints(CDC* pDC); // 绘制数据点 void DrawFittedLine(CDC* pDC); // 绘制拟合直线 }; ``` ### 最小二乘法计算函数 该函数根据数据点计算最佳拟合直线的斜率和截距。 ```cpp void CLeastSquaresView::ComputeLeastSquares() { int n = m_dataPoints.size(); if (n < 2) return; double sumX = 0.0, sumY = 0.0, sumXY = 0.0, sumXX = 0.0; for (const auto& pt : m_dataPoints) { sumX += pt.x; sumY += pt.y; sumXY += pt.x * pt.y; sumXX += pt.x * pt.x; } m_slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX); m_intercept = (sumY - m_slope * sumX) / n; } ``` ### 绘图功能实现 在 `OnDraw` 函数中调用绘图方法,绘制数据点和拟合直线。 ```cpp void CLeastSquaresView::OnDraw(CDC* pDC) { DrawDataPoints(pDC); if (m_dataPoints.size() >= 2) { ComputeLeastSquares(); DrawFittedLine(pDC); } } void CLeastSquaresView::DrawDataPoints(CDC* pDC) { for (const auto& pt : m_dataPoints) { pDC->Ellipse(pt.x - 3, pt.y - 3, pt.x + 3, pt.y + 3); // 绘制数据点 } } void CLeastSquaresView::DrawFittedLine(CDC* pDC) { int xStart = 0; int xEnd = GetClientRect().right; int yStart = static_cast<int>(m_slope * xStart + m_intercept); int yEnd = static_cast<int>(m_slope * xEnd + m_intercept); pDC->MoveTo(xStart, yStart); pDC->LineTo(xEnd, yEnd); // 绘制拟合直线 } ``` ### 鼠标事件处理 通过鼠标点击添加数据点,并触发重绘。 ```cpp void CLeastSquaresView::OnLButtonDown(UINT nFlags, CPoint point) { m_dataPoints.push_back(point); // 添加新的数据点 Invalidate(); // 触发重绘 CView::OnLButtonDown(nFlags, point); } ``` ### 用户交互 - 用户通过鼠标左键点击视图区域添加数据点。 - 每次添加点后,视图自动重绘,显示最新数据点和拟合直线。 ### 代码整合 确保所有代码在 MFC 项目中正确配置,包括视图类的创建、文档模板的设置以及必要的消息映射。此外,需要包含 `<vector>` 和其他必要的头文件。 ### 总结 上述代码展示了如何使用 Visual C++ 实现最小二乘法拟合直线,并在图形界面中动态展示。通过 MFC 框架,可以方便地处理绘图和用户交互[^2]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值