自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 图形计算器逻辑解析(part8: 智能输入)

由于用户的表达式输入支持实时检查。为避免检查时出现死循环,个别字符被禁止,且部分输入有智能化处理。智能输入主要是对括号的限制,由于拆括号一旦出现括号不匹配的情况容易发生意想不到的后果。自动检测是否为复数输入。禁止这些特殊字符的输入。

2024-11-29 10:02:02 193

原创 图形计算器逻辑解析(part7: 曲线绘制方法)

它们的逻辑极为相似,因此代码合并在了DisplayBase方法中。绘制的逻辑较为简单,仅仅为小线段的拼接。曲线共有三种模式:普通函数y=f(x);极坐标函数r=f(θ);参数曲线(f(t),g(t))。我们还是借鉴渲染图的五种模式对曲线进行染色,此时第四个和第五个模式合并。

2024-11-29 09:48:16 285

原创 图形计算器逻辑解析(part6: 实变量渲染方法)

渲染共有5种模式:Commonplace(普通), Monochromatic(单色), Bichromatic(双色), Kaleidoscopic(彩色), Miscellaneous(复合)。在染色前需要FiniteExtremities率先计算最大值(red)和最小值(blue)。第一种绘制曲线f(x, y) = 0,第二种和第三种均按f的正负号进行染色。我们任取argb方体的两条共顶点棱,使颜色由蓝渐变为紫再渐变为红。第四种模式为等高线染色,第五种为带有阴影效果的等高线染色。

2024-11-29 09:34:27 530

原创 图形计算器逻辑解析(part5: 复变量渲染方法)

Domain coloring的原理是按辐角(argument)染色:将2\pi分成六等份,沿下图的argb(alpha-red-green-blue)方体的棱走一圈,刚好走过六条棱,每条棱对应一个角度等份,在每等份线性依赖。渲染共有5种模式:Commonplace(普通), Monochromatic(单色), Bichromatic(双色), Kaleidoscopic(彩色), Miscellaneous(复合)。这三种渲染均支持Cartesian等值线(横平竖直)和Polar等值线(辐射状)。

2024-11-29 09:19:59 558

原创 图形计算器逻辑解析(part4: 特殊数学函数的算法)

组合数与排列数:使用递归算法。其中组合数利用gamma函数进行了延拓,详情请见。

2024-11-28 14:32:40 241

原创 图形计算器逻辑解析(part3: 无括号表达式的计算)

无括号表达式的计算主要涉及三级算符的拆解。(2) 只有一个"[int]",其中int为一个整数。如果是中括号,则提取相应位置的braValues存储值(这是拆括号的产物);否则判断诸多情况,包括常数与变量。按照判断的加减号进行计算,每段要继续进入第二层拆解。按照判断的乘除号进行计算,每段要继续进入三层拆解。按乘方计算,每段要继续进入最内层判断。如果加减号过多,则分段拆解计算。如果乘除号过多,则分段拆解计算。如果乘方号过多,则分段拆解计算。第一层是加减号的拆解。第二层是乘除号的拆解。第三层是乘方号的拆解。

2024-11-28 14:07:17 197

原创 图形计算器逻辑解析(part2: 下划线函数)

按逗号分割时的很大问题是内层下划线函数的干扰,例如"sum(z + k sum(z - j, j, 1, 5), k, 1, 3)"。因此在拆外层之前要保护内层,即将内层的','用';如之前所说,"下划线函数"指多输入函数,涉及逗号的保护性分割。在ComplexSub类的Obtain方法中,我们在拆其他括号之前率先处理掉所有的下划线函数。从函数名的替换可以看出,下划线函数的函数名被替换为以下划线作为结尾的关键字。我们以Hypergeometric函数为例,谈一谈下划线函数的关键处理。

2024-11-28 12:46:53 261

原创 图形计算器逻辑解析(part1: 拆括号)

如果含有下划线,代表表达式中有“下划线方法”,我们先将其计算并拆除。它们的处理涉及逗号的保护性分割,仍于之后解析。Obtain是求值的公开方法,核心逻辑是拆括号。其中BraFreePart方法为计算无括号表达式的方法,我们会在之后的文章中详细讨论。如果有,需要计算对应关键字的长度(tagL),并且subValue要被其作用。我们从右往左寻找左括号,并定位对应的右括号,提取里面的子表达式进行计算,存到subValue中。首先将输入的实部和虚部转化成复数(Complex结构体),以矩阵形式存储在全局变量z中。

2024-11-28 12:27:42 211

原创 图形计算器优化案例(part 4: 内存的重复利用)

ComplexSub类中,一些重复性很强的循环计算采用Buffer从而无需每轮重新定义新类型。此优化并没有用在RealSub类中,由于RealSub类的计算相对ComplexSub快得多,且RealSub类这部分代码保存了Buffer之前的版本,利于对比和修改。其中braValues存储每次拆括号获得的中间变量:当括号嵌套量巨大时,braValues占用大量内存。我们尽量使用全局变量囊括多次使用的变量,必要时定义中间变量以反复使用。ProcessMinMax方法中的values数组可被反复使用。

2024-11-28 11:38:55 164

原创 图形计算器优化案例(part 3: 指针的使用)

计算的内核极致优化,使用Parallel.For并行计算,指针遍历。Unsafe.CopyBlock是底层的高效复制比特值方法,与之相仿的是Buffer.MemoryCopy(复数版本同理)。指针是C语言的特色。但在C#中若有计算性能上的强烈需求,可以在unsafe关键字之下使用指针直接操控存储空间,从而大幅度提升性能。遍历像素点染色的方法(实数版本&复数版本)。设置像素点颜色的内核函数与清空函数。数学中的特殊函数(复数版本同理)。像素点到坐标点的转换。迭代图逐步显示的函数。

2024-11-28 10:57:25 202

原创 图形计算器优化案例(part 2: 高级&底层方法的结合)

MyString类的Parenthesis区域中,我们减少了for循环的上下界检查,使用String.Concat代替字符串串联运算符‘+’以优化短字符串串联的构造。MyString类的Manipulations区域中,我们使用StringBuilder优化字符串的构造,减少中间变量。MyString类的Manipulations区域中,我们使用String.Create代替串联以优化子字符串替换。MyString类的Substitutions区域中,使用Regex.Replace优化多子字符串同时替换。

2024-11-28 10:40:23 177

原创 图形计算器优化案例(part 1: 代码的简化)

Graph类的Miscellaneous区域中,SetValuesForSelectedIndex方法使用中间变量结合switch-case语句极大减少了冗杂的重复。Graph类的Pre-Graphing区域中,实变量函数的渲染在不同模式中享有类似的内核,因此统一书写;由早期的17k+到如今的3k+,代码经历的极大的瘦身,但同时又保证了功能的完整性。Graph类的Mouse区域中,HandleMouseAction方法包含了鼠标点击和移动方法的公共逻辑。三个消息框类均继承自同一个基类。

2024-11-28 10:14:40 304

原创 图形计算器代码解析(part 17: 复数替换类的整合)

计算的整合,先拆括号后计算。计算的内核,性能的瓶颈。

2024-11-28 09:17:40 184

原创 图形计算器代码解析(part 16: 复数替换类的特殊计算)

复数的特殊函数计算,可随时扩展。

2024-11-28 09:15:42 241

原创 图形计算器代码解析(part 15: 复数替换类的构造)

【代码】图形计算器代码解析(part 15: 复数替换类的构造)

2024-11-27 10:06:44 240 1

原创 图形计算器代码解析(part 14: 实数替换类的整合)

计算的整合,先拆括号后计算。计算的内核,性能的瓶颈。

2024-11-27 10:04:46 221

原创 图形计算器代码解析(part 13: 实数替换类的特殊计算)

一些实数运算独有的简单计算。

2024-11-27 10:02:13 347

原创 图形计算器代码解析(part 12: 实数替换类的构造)

【代码】图形计算器代码解析(part 12: 实数替换类的构造)

2024-11-27 09:59:50 190

原创 图形计算器代码解析(part 11: 乘号的添加)

用于添加省略的代数表达式中的乘号。

2024-11-27 09:56:45 205

原创 图形计算器代码解析(part 10: 字符串的处理)

替换一些数学函数名为可读关键字。

2024-11-27 09:54:38 174

原创 图形计算器代码解析(part 9: 消息框)

显示各个具体功能的使用提示。显示说明书与作者信息弹窗。

2024-11-27 09:51:16 218

原创 图形计算器代码解析(part 8: 其他显示特效)

【代码】图形计算器代码解析(part 8: 其他显示特效)

2024-11-27 09:49:41 345

原创 图形计算器代码解析(part 7: 键盘操作)

智能化输入与快捷键。

2024-11-27 09:47:20 218

原创 图形计算器代码解析(part 6: 鼠标操作)

鼠标移动时的特殊效果。画图键点击后的任务。保存键点击后的任务。

2024-11-27 09:41:55 429

原创 图形计算器代码解析(part 5: 画图的执行)

【代码】图形计算器代码解析(part 5: 画图的执行)

2024-11-27 09:38:31 267

原创 图形计算器代码解析(part 4: 画图的准备)

渲染核、计算汇总、坐标轴与参考线绘制。

2024-11-27 09:34:49 338

原创 图形计算器代码解析(part 3: 界面初始化)

一些对Windows默认功能的重载。初始显示效果与参数设置。一些主要的初始化方法。后台初始化的具体方法。

2024-11-27 09:30:14 281

原创 图形计算器代码解析(part 2: 结构体)

由于画图的需求,代码运行中有大量矩阵的逐元素计算,因此定义这两个高效的结构体。本结构体构造了复数,定义了复数的基本运算符与函数。

2024-11-27 09:23:54 199

原创 图形计算器代码解析(part 1: 概况)

CustomMessageBox类:显示各个具体功能的使用提示。FormalMessageBox类:显示说明书与作者信息弹窗。RecoverMultiply类:添加省略的乘号的相关方法。ExceptionMessageBox类:显示报错信息。ComplexMatrix结构体:双精度浮点复数矩阵。BaseMessageBox类:三种消息框的基类。ComplexSub类:复变量代数式数值计算。MyString类:处理字符串的诸多方法。RealSub类:实变量代数式。Graph类:主窗体的显示。

2024-11-27 09:18:47 275

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除