基于VC++的心脏传导系统模拟器设计(2D虚拟心脏)
心脏传导系统模拟器设计
目录
1 引言 2
1.1 临床心律失常分析方法 2
1.2 基于知识规则建模的自动诊断方法研究现状 4
1.3 心脏计算机仿真模型的研究发展现状 7
2 基于心电图生成模型的诊断方法研究 9
2.1 心电图自动诊断模型的设计思路 9
2.2 心电图生成模型的数学结构分析 12
2.3 基于字典法的心脏数学模型研究 15
2.4 心脏传导系统建模 15
3 心脏传导模型设计 17
3.1 心脏与导联电极的空间位置关系 17
3.2 传导单元数学模型 17
3.3 心室肌病变相关参数 21
4 心脏电活动字典结构设计 24
4.1 心脏传导子系统设计 24
4.2 心房激动子系统设计 25
4.3 心室激动子系统设计 26
4.4 字典粒度与容器初始化方法研究 27
4.5 模型预测算法研究 28
5 系统实现 32
5 .1心脏传导模型可视化设计 32
5.2 心脏传导模型仿真实验 33
通过心电图诊断,我们不仅需要知道病的类型,更希望通过对心电图的分析来找到病因,有针对性的制定治疗方案。普通医务工作者仅仅能够通过教科书上的典型波形对比查找病因,而有经验的医学专家能够对心脏电传导理论模型进行分析,推导出复杂心电图现象的形成原因。
随着计算机技术的发展和普及,研究人员早已开始尝试将计算机仿真技术应用于心脏传导研究。Aoki 等人建立了心脏纵切面的模型,该模型设定心内膜为起搏点,研究电传导由心内膜扩展到心外膜的过程。Abboud 建立了理想化的心脏电传导模型。Lorange 的模型考虑了浦肯野网络。Siregar 以及 Berenfeld 建立了针对传导系统的计算模型,能够对束间折返做出仿真。Kim Simeliusa 的模型具有真实解剖结构。曼彻斯特大学的张恒贵等人构造的心脏模型具有精细的心脏解剖结构和准确的细胞电生理参数,能够对多种临床病征的发病机理做出阐释。
虚拟心脏能够解决临床实践中的疑难问题。例如用虚拟心脏模拟验证射频消融除颤手术方案。射频消融技术用于阻断折返回路,对颤源进行治疗,但是手术具有不确定性,需要在相关部位反复尝试,对心脏健康组织破坏较大。采用虚拟心脏技术对射频消融手术方案进行论证,能够提高手术一次性成功的概率。虚拟心脏有以下发展趋势:
(1)采用更高精度的 CT 获得更为精确的心脏物理结构,进一步提高虚拟心脏的模型精度。
(2)虚拟心脏的可视化技术研究。
(3)虚拟心脏的计算方法研究。模型计算量随着模型分辨率的提升呈指数增长。现代虚拟心脏需要在超级计算机上运行数小时才能获得一次心跳的计算结果,需要改进算法进一步降低计算成本。
(4)模拟心内膜-心外膜-体表电动势之间的传导过程,研究心脏正问题和心电逆问题的计算方法。
与虚拟心脏同时出现的一对孪生问题是心电正问题和心电逆问题。心电正问题是在已知心外膜电动势的条件下,求解体表电动势,已知是容易解决的。心电逆问题是在已知体表电动势的条件下,求解心外膜电动势,已知难解。但是心脏逆问题在临床上有重大应用价值,是研究者们努力攻克的目标。本文转载自http://www.biyezuopin.vip/onews.asp?id=15760
// CCAView.h : CCAView 类的接口
//
#pragma once
typedef struct __tag_PIN_POS
{
int x;
int y;
int state;
} PIN_POS;
class CSmartDC;
class CCAView : public CScrollView
{
private:
BOOL m_b1msPerPixel;
CDC* m_pdcBackground;
CDC* m_pdcSinusNode; //窦房结(心房肌A_9_30)
CDC* m_pdcEctopicPacemakerOnRA; //右心房的异位起搏点(心房肌A_8_30)
CDC* m_pdcEctopicPacemakerOnLA; //左心房的异位起搏点(心房肌A_1_0)
CDC* m_pdcEctopicPacemakerOnRV; //右心室的异位起搏点(心室肌V_7_0)
CDC* m_pdcEctopicPacemakerOnLV; //左心室的异位起搏点(心室肌V_2_30)
CDC* m_pdcJunction; //房室交界区自律(房室结下端)
CDC* m_pdcS_A; //房间束(窦房结到房室结上端)
CDC* m_pdcBachmann; //左房间束(窦房结到心房肌A_0_0)
CDC* m_pdcJames; //跨越房室结的James束(房室结上端到房室结下端)
CDC* m_pdcAVFast; //房室结快路径(房室结上端到房室结下端)
CDC* m_pdcAVSlow; //房室结慢路径(房室结上端到房室结下端)
CDC* m_pdcKentLeft; //左Kent束(心房肌A_8_0到心室肌V_8_0)
CDC* m_pdcKentRight; //右Kent束(心房肌A_1_30到心室肌V_1_30)
CDC* m_pdcHisBundle; //希氏束(房室结下端到希氏束下端)
CDC* m_pdcRBB; //右束支
CDC* m_pdcLBB; //左束支
CDC* m_pdcIAS; //房间隔
CDC* m_pdcIVS; //室间隔
CDC* m_pdcAtrium; //心房肌传导环
CDC* m_pdcVentricle; //心室肌传导环
CSmartDC* m_pMemDC;
CSmartDC* m_pBarChartDC;
CSmartDC* m_pLocationDC;
CSmartDC* m_pSketchImageDC;
int m_nLocationBmpW;
int m_nLocationBmpH;
int m_nMousePosX;
int m_nMousePosY;
int m_nMouseDown;
PIN_POS** m_pBarChartBuffer;
int m_nBarChartRow;
POINT** m_pActivePointBuffer;
int m_nActivePointRow;
protected: // 仅从序列化创建
CCAView();
DECLARE_DYNCREATE(CCAView)
// 特性
public:
CCADoc* GetDocument() const;
// 操作
private:
void InitUnitDC(CDC* pDC);
void ReleaseBarChartBuffer();
void ReleaseActivePointBuffer();
void InitSketchConnection(CCADoc* pDoc);
BOOL GetTsPos(int* pTerminalOutput, int* x, int* y, int* myTerminal);
void DrawConnectionLine(int* pInput, int x1, int y1, int* myTerminal);
void DrawSuBlockSign(CDC* pdc, SPONTANEOUS_UNIT* psu);
void DrawCuBlockSign(CDC* pdc, CONDUCTION_UNIT* pcu);
public:
void RenewBarChart();
// 重写
public:
virtual void OnDraw(CDC* pDC); // 重写以绘制该视图
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
// 实现
public:
virtual ~CCAView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
void DrawAll(CCADoc* pDoc, CDC& dc);
void DrawRuler(CDC& dc);
void DrawHeadline(CCADoc* pDoc, CDC& dc);
void DrawActiveBar(CCADoc* pDoc, CDC& dc);
public:
void DrawSketch(CDC* pdc, CARDIAC_MODEL* pModel,
BOOL bSinusNode,
BOOL bPacemakerOnRA,
BOOL bPacemakerOnLA,
BOOL bPacemakerOnRV,
BOOL bPacemakerOnLV,
BOOL bJunction,
BOOL bS_A,
BOOL bBachmann,
BOOL bJames,
BOOL bAVFast,
BOOL bAVSlow,
BOOL bKentLeft,
BOOL bKentRight,
BOOL bHisBundle,
BOOL bRBB,
BOOL bLBB,
BOOL bIAS,
BOOL bIVS,
BOOL bAtrium,
BOOL bVentricule);
// 生成的消息映射函数
protected:
DECLARE_MESSAGE_MAP()
public:
virtual void OnInitialUpdate();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
afx_msg void On1msPerPixel();
afx_msg void On5msPerPixel();
afx_msg void OnEditAttr();
afx_msg void OnExportSequence();
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
};
#ifndef _DEBUG // CCAView.cpp 中的调试版本
inline CCADoc* CCAView::GetDocument() const
{ return reinterpret_cast<CCADoc*>(m_pDocument); }
#endif