在SFML C++中用AST绘制数学方程组

kd3sttzy  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(116)

我正在尝试用SFML从AST树中呈现一个数学方程。
我目前的方法是使用一个函数从字符创建基本sf::Texture,例如:

sf::Texture ASTHelper::GetTextureFromDefaultChar(char c) {
    sf::Text tmp;
    tmp.setFillColor(sf::Color::Black);
    tmp.setString(std::string(1, c));
    tmp.setFont(this->textFont);
    tmp.setCharacterSize(this->fontSize);

    int x = tmp.getLocalBounds().width;
    int y = tmp.getLocalBounds().height;

    sf::RenderTexture tex;
    tex.create(x, y);
    tex.clear();
    tex.draw(tmp);
    tex.display();

    sf::Texture returnTex = tex.getTexture();
    
    return returnTex;
}

然后在遍历AST树时将那些纹理合并/移动/复制到更卷积的方程中。

例如,给定(x+1)这样的表达式,我可以对每个字符使用GetTextureFromDefaultChar(),然后将纹理水平合并在一起。
问题是,合并和复制sf::Texture/sf::RenderTexture似乎是强烈不鼓励的。当然也不是每一帧

我还研究了其他API/库,看看是否有什么可以在C中使用(因为我不想重新发明轮子),MathJax似乎使用了很多(Mathjax in C++ console),但在浏览器中。
所以,
1.有没有比合并/复制sf::Texturesf::RenderTexture(或者我可能忽略的一些完全不同的安排)更好的方法?
以及
1.如果没有,有没有其他的C
库支持它?

3hvapo4f

3hvapo4f1#

假设每个数学符号都是sf::Int/FloatRect,这是它们在sf::Texture中的位置,sf::Texture包含它们中的每一个。
然后你可以计算它们在一条线上的位置,即如果你想画它们,它们将如何定位。
然后把这些画成sf::Spritesf:RectangleShape到一个sf::RenderTexture,显示它,现在你有了一个纹理,这是由你的符号。
这样你就不用画所有的纹理,也不用从头开始每帧都创建sf::RenderTexture,而且,把另一个数学方程变成纹理只需要调用sf::RenderTexture::clear(sf::Color::Transparent)并重复前面的步骤。
这样就没有纹理的合并和复制,只有一个绘制到一个renderTexture中的符号的纹理表。

相关问题