#include "pch.h"
#include "MathRender.h"
#include "Canvas.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CMathRender::CMathRender(const IMathExpression::ICalculateProcess::IProcessTokensList* lpMathTokensList)
{
int nTokenCount = lpMathTokensList->GetCount();
for (int i = 0; i < nTokenCount; i++)
{
const IMathExpression::IMathToken* lpIMathToken = lpMathTokensList->GetToken(i);
if (m_strHints.IsEmpty())
{
LPCTSTR lpszHints = lpIMathToken->GetHints();
if (lpszHints && *lpszHints)
{
m_strHints = lpszHints;
}
}
m_arrayMathTokens.Add(new CMathToken(lpIMathToken));
}
CMathToken::Merge(m_arrayMathTokens);
}
CMathRender::~CMathRender(void)
{
for (int i = 0; i < m_arrayMathTokens.GetCount(); i++)
{
m_arrayMathTokens[i]->Release();
}
}
CRect CMathRender::CalcRect(ICanvas* lpCanvas, float fFontSize)
{
CRect rectDraw(0, 0, 0, 0);
for (int i = 0; i < m_arrayMathTokens.GetCount(); i++)
{
CRect rect = m_arrayMathTokens[i]->CalcRect(lpCanvas, fFontSize);
rectDraw.right += rect.Width();
rectDraw.bottom = max(rectDraw.bottom, rect.Height());
}
rectDraw.bottom += 1;
return rectDraw;
}
CRect CMathRender::Draw(ICanvas* lpCanvas, float fFontSize, int nLineHeight, int& x, int& y)
{
const int nOldX = x;
const int nOldY = y;
CRect rectDraw = CalcRect(lpCanvas, fFontSize);
const int nOffsetY = (nLineHeight - rectDraw.Height()) / 2;
for (int i = 0; i < m_arrayMathTokens.GetCount(); i++)
{
y = nOldY + nOffsetY;
m_arrayMathTokens[i]->Draw(lpCanvas, fFontSize, rectDraw.Height(), x, y);
}
if (!m_strHints.IsEmpty())
{
CString strHints = L"…………" + m_strHints;
lpCanvas->DrawString(strHints, x, y + nOffsetY, 1000, rectDraw.Height(), fFontSize,
TextAlignment::TextAlignmentLeft, TextAlignment::TextAlignmentCenter, RGB(0xA0, 0x00, 0x00));
}
int nHeight = rectDraw.Height();
rectDraw.top = y;
rectDraw.bottom = y + nHeight;
y = rectDraw.bottom;
return rectDraw;
}
CMathRender::CMathToken::CMathToken(CMathToken* lpParentToken, LPCWSTR lpszText, TextAlignment textAlignment)
: m_lpParentToken(lpParentToken), m_lpToken(NULL), m_strName(lpszText), m_MathTokenType(MTT_TEXT), m_TextAlignment(textAlignment)
{
}
CMathRender::CMathToken::CMathToken(const IMathExpression::IMathToken* lpToken)
: m_lpParentToken(NULL), m_lpToken(lpToken), m_MathTokenType(MTT_COMMON), m_TextAlignment(TextAlignment::TextAlignmentCenter)
{
}
CMathRender::CMathToken::CMathToken(CMathToken* lpParentToken, LPCWSTR lpszName, const CDynamicArray<CMathToken*>& arrayMathTokens)
: m_lpParentToken(lpParentToken), m_lpToken(NULL), m_strName(lpszName), m_MathTokenType(MTT_FUNCTION), m_TextAlignment(TextAlignment::TextAlignmentCenter)
{
CMathToken* lpMathToken = new CMathToken(lpParentToken, lpszName, TextAlignment::TextAlignmentRight);
m_arrayMathTokens.Add(lpMathToken);
for (int i = 0; i < arrayMathTokens.GetCount(); i++)
{
lpMathToken = arrayMathTokens[i];
lpMathToken->SetParent(this);
m_arrayMathTokens.Add(lpMathToken);
}
MergeStyle(m_arrayMathTokens);
}
CMathRender::CMathToken::CMathToken(EMathTokenType MathTokenType, const CDynamicArray<CMathToken*>& arrayMathTokens)
: m_lpParentToken(NULL), m_lpToken(NULL), m_MathTokenType(MathTokenType), m_TextAlignment(TextAlignment::TextAlignmentCenter)
{
if (m_MathTokenType == MTT_ABS)
{
for (int i = 0; i < arrayMathTokens.GetCount(); i++)
{
arrayMathTokens[i]->ClearBrackets();
}
}
m_arrayMathTokens.Copy(arrayMathTokens);
MergeStyle(m_arrayMathTokens);
}
CMathRender::CMathToken::CMathToken(EMathTokenType MathTokenType, CMathToken* lpMathToken)
: m_lpParentToken(NULL), m_lpToken(NULL), m_MathTokenType(MathTokenType), m_TextAlignment(TextAlignment::TextAlignmentCenter)
{
if (m_MathTokenType == MTT_ABS)
{
lpMathToken->ClearBrackets();
}
else if (m_MathTokenType == MTT_SIGMA)
{//求和∑函数,只有一个参数时当成上界,需要在前面增加一个下界i=1
m_arrayMathTokens.Add(new CMathToken(NULL, _T("i=1")));
}
m_arrayMathTokens.Add(lpMathToken);
MergeStyle(m_arrayMathTokens);
}
CMathRender::CMathToken::CMathToken(EMathTokenType MathTokenType, CMathToken* lpMathToken1, CMathToken* lpMathToken2)
: m_lpParentToken(NULL), m_lpToken(NULL), m_MathTokenType(MathTokenType), m_TextAlignment(TextAlignment::TextAlignmentCenter)
{
if (m_MathTokenType == MTT_POW)
{
if (lpMathToken1->m_arrayMathTokens.GetCount() < 3)
{
lpMathToken1->ClearBrackets();
}
else if (lpMathToken1->m_arrayMathTokens.GetCount() == 3)
{
const CMathToken* lpValueToken = lpMathToken1->m_arrayMathTokens[1];
if (lpValueToken->m_lpToken != NULL && lpValueToken->m_lpToken->GetType() == IMathExpression::IMathToken::EMathTokenType::DATATYPE_VALUE)
{
LPCTSTR lpszText = lpValueToken->m_lpToken->GetText();
while (*lpszText >= '0' && *lpszText <= '9')
{
lpszText++;
}
if (*lpszText == '.')
{
lpszText++;
while (*lpszText >= '0' && *lpszText <= '9')
{
lpszText++;
}
}
if (*lpszText == '\0')
{
lpMathToken1->ClearBrackets();
}
}
}
lpMathToken2->ClearBrackets();
}
else if (m_MathTokenType == MTT_DIVISION || m_MathTokenType == MTT_SQRT)
{
lpMathToken1->ClearBrackets();
lpMathToken2->ClearBrackets();
}
else if (m_MathTokenType == MTT_SIGMA)
{
lpMathToken1->ClearBrackets();
lpMathToken2->ClearBrackets();
CMathToken* lpMathToken3 = new CMathToken(NULL, _T("i="));
CMathToken* lpMathToken4 = new CMathToken(EMathTokenType::MTT_COMMON, lpMathToken3, lpMathToken1);
lpMathToken1 = lpMathToken4;
}
m_arrayMathTokens.Add(lpMathToken1);
m_arrayMathTokens.Add(lpMathToken2);
MergeStyle(m_arrayMathTokens);
}
CMathRender::CMathToken::CMathToken(EMathTokenType MathTokenType, CMathToken* lpMathToken1, CMathToken* lpMathToken2, CMathToken* lpMathToken3)
: m_lpParentToken(NULL), m_lpToken(NULL), m_MathTokenType(MathTokenType), m_TextAlignment(TextAlignment::TextAlignmentCenter)
{
m_arrayMathTokens.Add(lpMathToken1);
m_arrayMathTokens.Add(lpMathToken2);
m_arrayMathTokens.Add(lpMathToken3);
MergeStyle(m_arrayMathTokens);
}
CMathRender::CMathToken::~CMathToken()
{
m_lpToken = NULL;
for (int i = 0; i < m_arrayMathTokens.GetCount(); i++)
{
m_arrayMathTokens[i]->Release();
}
}
int CMathRender::CMathToken::ClearBrackets()
{
if (m_arrayMathTokens.GetCount() > 2)
{
const int nTokenCount = m_arrayMathTokens.GetCount();
const IMathExpression::IMathToken* lpTokenH = m_arrayMathTokens[0]->m_lpToken;
const IMathExpression::IMathToken* lpTokenE = m_arrayMathTokens[nTokenCount - 1]->m_lpToken;
if (lpTokenH != NULL && lpTokenH->isOperator('(') && lpTokenE->isOperator(')'))
{
int nCount = 1;
for (int i = 1; nCount > 0 && i < nTokenCount - 1; i++)
{
const IMathExpression::IMathToken* lpToken = m_arrayMathTokens[i]->m_lpToken;
if (lpToken != NULL)
{
if (lpToken->isOperator('('))
{
nCount++;
}
else if (lpToken->isOperator(')'))
{
nCount--;
}
}
}
if (nCount == 1)
{
m_arrayMathTokens[nTokenCount - 1]->Release();
m_arrayMathTokens.RemoveAt(nTokenCount - 1);
m_arrayMathTokens[0]->Release();
m_arrayMathTokens.RemoveAt(0);
}
}
}
return m_arrayMathTokens.GetCount();
}
int CMathRender::CMathToken::ReadSection(CDynamicArray<CMathToken*>& arrayMathTokens, int nIndex, CDynamicArray<CMathToken*>& sectionMathTokens)
{
sectionMathTokens.RemoveAll();
const IMathExpression::IMathToken* lpToken = arrayMathTokens[nIndex]->m_lpToken;
if (lpToken != NULL)
{
if (lpToken->isOperator('('))
{
sectionMathTokens.Add(arrayMathTokens[nIndex]);
arrayMathTokens.RemoveAt(nIndex);
while (arrayMathTokens.GetCount() > nIndex)
{
没有合适的资源?快使用搜索试试~ 我知道了~
符号运算、数学表达式求值和数学表达式绘制c++源码,方便自己定义数学函数
共55个文件
h:28个
cpp:13个
ico:2个
需积分: 1 0 下载量 39 浏览量
2024-03-26
16:59:53
上传
评论
收藏 1.65MB ZIP 举报
温馨提示
基于SlotScriptCore的符号计算、数学表达式求值和绘制,支持自定义数学函数。 如果你想开发数学表达式转成图片的功能(比如在网站上显示数学公式),可以参数此源码,只是把往窗口中的绘制改成生成图片即可。 如果你想做符号计算,对此源码进行改造就可以,自定义运算函数以及相应的绘制模块即可。此源码也演示了“带单位的数值计算”(类似于c++语言的“自定义字面量”),可以方便做物理计算,也可以在你开发的电子表格类应用中增加此功能,比如:(50千克/米*开方(400平方米)+一斤半+五斤八两+四两)/(三厘米*七十毫米*5米)
资源推荐
资源详情
资源评论
收起资源包目录
MathStudio.zip (55个子文件)
Source
MathStudio.aps 118KB
ConsoleBufferManager.h 10KB
MathStudioDoc.cpp 3KB
MathExpressEdit.h 395B
MathStudio.h 1KB
MathStudio.vcxproj 12KB
SlotScriptLib
SystemMathLib.h 111B
pch.h 402B
SystemMathLib.cpp 13KB
framework.h 1KB
ScriptInclude
INumberUnitManager.h 6KB
ISlotScriptCore.h 10KB
IMathExpression.h 7KB
IScriptBufferManager.h 12KB
IJsonReader.h 705B
BasicDataType.h 1007B
ISlotScriptHost.h 15KB
IOntology.h 4KB
IScriptBufferCore.h 10KB
IDataObject.h 8KB
MathStudioView.h 2KB
MainFrm.cpp 1KB
VirtualConsoleCtrl.h 18KB
res
MathStudioDoc.ico 5KB
Toolbar.bmp 1KB
MathStudio.rc2 676B
MathStudio.ico 66KB
ConsoleBufferManager.cpp 7KB
Resource.h 474B
pch.h 670B
MathRender.cpp 41KB
SlotScriptHost.h 13KB
MathStudio.vcxproj.user 236B
SlotScriptCoreLoader.h 4KB
MainFrm.h 645B
VirtualConsoleCtrl.cpp 37KB
Canvas.h 1KB
SlotScriptHost.cpp 9KB
Canvas.cpp 3KB
MathStudioView.cpp 8KB
MathStudio.sln 1KB
pch.cpp 158B
DynamicArray.h 19KB
MathRender.h 4KB
MathStudio.rc 21KB
MathExpressEdit.cpp 761B
MathStudio.vcxproj.filters 6KB
MathStudio.reg 698B
MathStudioDoc.h 928B
SlotScriptCoreLoader.cpp 7KB
targetver.h 295B
MathStudio.cpp 6KB
bin
SlotScriptCore.dll 515KB
MathStudio.exe 2.67MB
SlotScriptCore.lib 3KB
共 55 条
- 1
资源评论
裸码之道
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Javascript的诊所管理系统设计源码
- 人工智能在电子信息管理系统中的应用与效率优化研究
- 详解protobuf-c之在C语言中如何使用repeated生成数组和字符串(包含配置pb-callback-t)
- Python 程序语言设计模式思路-并发模式:消费者模式:协调生产者和消费者之间的数据交换
- pythonA*算法(A-star algorithm),寻路算法
- guitest.zip
- udp_echo.v
- udp_echo_server.v
- python双向广度优先搜索算法(Bidirectional Breadth-First Search, BBFS),寻路算法
- python迭代加深算法(Iterative Deepening Depth-First Search, IDDFS),寻路算法
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功