plp626 发表于 2012-6-20 10:04:26

数学公式显示算法

本帖最后由 plp626 于 2012-6-20 11:58 编辑

就如同matlab 的pretty(表达式)那样的字符显示+------------------------------------------------------------------------+
| >> pretty(diff(asin(x)))                                             |
|                                                                        |
|                                        1                               |
|                                 -----------                        |
|                                       2 1/2                        |
|                                 (1 - x )                           |
| >>                                                                     |
+------------------------------------------------------------------------+大家能否提供个算法伪代码,或者比较好的思路?

plp626 发表于 2012-6-20 12:03:44

最直接的想法,先确定高度,再确定宽度,然后计算每个字符相对于左上角定点的位置; 最后全部输出;
感觉计算比较复杂;
然后想到用个递归,逐行打印,在打印某个字符前, 先计算它右下角字符的坐标位置, 然后根据这个位置打印它;。。。

大家讨论讨论实现细节。。

wayne 发表于 2012-6-20 12:27:53

不错,很有趣!期待讨论!

其实很多很多的数学软件都可以的,只要有终端运行的功能即可。



推广言之,不仅仅是数学公式,还有图片,中文汉字,都可以用ascii直观展示。
这叫做 ascii art,我google到了几个链接,可惜打不开。


我见过有的人,把程序代码格式化成自己的照片。。。

plp626 发表于 2012-6-20 15:38:18

+-------------------------------------------------------------------------------------+
| >> pretty(diff(asin(x)*asin(1/x))+diff(asin(1/asin(x)))/diff(asin(1/x)))            |
|                                                                                     |
|                                                2 /   1\1/2                  |
|                                                 x|1 - ----|                     |
|                                                    |      2 |                     |
|      asin(1/x)      asin(x)                      \   x/                     |
|   ----------- - ---------------- + --------------------------------------         |
|         2 1/2    2 /   1\1/2          2       2 1/2 /       1    \1/2         |
|   (1 - x )      x|1 - ----|      asin(x)(1 - x )    |1 - --------|            |
|                      |      2 |                           |         2|            |
|                      \   x/                           \    asin(x) /            |
| >>                                                                                  |
|                                                                                     |
+-------------------------------------------------------------------------------------+能看出matlab处理字符输出的规律ABC图高度一致:+------------------------------------------------------------------------+
|         +-----------------+                                          |
|         |               |                                          |
|         |               |                                          |
|         |               |                                          |
|         |   asin(1/x)   |                                          |
| A =   |-----------    |                                          |
|         |      2 1/2    |                                          |
|         |(1 - x )       |                                          |
|         |               |                                          |
|         |               |                                          |
|         |               |                                          |
|         +-----------------+                                          |
|         +-------------------+                                          |
|         |                   |                                          |
|         |                   |                                          |
|         |                   |                                          |
|         |                   |                                          |
| B =   |      asin(x)      |                                          |
|         |---------------- |                                          |
|         |   2 /   1\1/2 |                                          |
|         |x|1 - ----|    |                                          |
|         |   |      2 |    |                                          |
|         |   \   x/    |                                          |
|         +-------------------+                                          |
|         +---------------------------------------------+                |
|         | ;43                                       |                |
|         |             2 /   1\1/2               |                |
|         |            x|1 - ----|                  |                |
|         |               |      2 |                  |                |
| C =   |               \   x/                  |                |
|         | --------------------------------------      |                |
|         |      2       2 1/2 /       1    \1/2      |                |
|         | asin(x)(1 - x )    |1 - --------|         |                |
|         |                      |         2|         |                |
|         |                      \    asin(x) /         |                |
|         +---------------------------------------------+                |
+------------------------------------------------------------------------+我把2楼第二个思路拓展下。。
把一个式子看做用+-连接的若干个图形,
然后就是图形的拼接,
打印第一个图形,调用三个函数,
一个打印分子,一个打印分数线,一个打印分母,
打印分子,分母的时候,重复图形拼接策略。。。

想来不难,但实现起来挺难。。。
页: [1]
查看完整版本: 数学公式显示算法