我正在尝试用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
似乎是强烈不鼓励的。当然也不是每一帧。
- https://en.sfml-dev.org/forums/index.php?topic=17566.0
- https://en.sfml-dev.org/forums/index.php?topic=18020.0
- https://en.sfml-dev.org/forums/index.php?topic=10512.0
我还研究了其他API/库,看看是否有什么可以在C中使用(因为我不想重新发明轮子),MathJax似乎使用了很多(Mathjax in C++ console),但在浏览器中。
所以,
1.有没有比合并/复制sf::Texture
和sf::RenderTexture
(或者我可能忽略的一些完全不同的安排)更好的方法?
以及
1.如果没有,有没有其他的C库支持它?
1条答案
按热度按时间3hvapo4f1#
假设每个数学符号都是
sf::Int/FloatRect
,这是它们在sf::Texture
中的位置,sf::Texture
包含它们中的每一个。然后你可以计算它们在一条线上的位置,即如果你想画它们,它们将如何定位。
然后把这些画成
sf::Sprite
或sf:RectangleShape
到一个sf::RenderTexture
,显示它,现在你有了一个纹理,这是由你的符号。这样你就不用画所有的纹理,也不用从头开始每帧都创建
sf::RenderTexture
,而且,把另一个数学方程变成纹理只需要调用sf::RenderTexture::clear(sf::Color::Transparent)
并重复前面的步骤。这样就没有纹理的合并和复制,只有一个绘制到一个renderTexture中的符号的纹理表。