- 博客(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
原创 图形计算器逻辑解析(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 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关注的人
RSS订阅
1