4 个版本
新 0.2.2 | 2024年8月25日 |
---|---|
0.2.1 | 2024年8月22日 |
0.2.0 | 2024年8月21日 |
0.1.0 | 2024年8月21日 |
#36 在 图形 API 中
398 每月下载量
68KB
1.5K SLoC
elements
一种几何标记语言和绘图渲染器。
开发
本项目的两个主要部分是:标记语言和绘图渲染器。标记语言的函数主要定义在 lang
文件夹中,而词法分析和解析函数分别定义在主 src
文件夹中的 lexer.rs
和 interpreter.rs
文件中。这些函数首先将源字符串转换为 Token
向量,然后将这些标记解析为一系列 Value
。这些 Value
实现了 Element
特性,这将使它们变为持有 Render
特性的 Svg
对象。然后,位于 renderer.rs
文件中的渲染系统将这些对象转换为正确的 svg 代码。
- 实现更好的标签系统
注意:主仓库使用 Mercurial 开发,位于 https://hg.sr.ht/~lnjng/elements。
用法
要安装程序,只需使用 cargo
cargo install elements-lang
要运行程序,请使用以下命令
elements <input file>
程序将然后将 svg 代码输出到 stdout 以及名为 out.svg
的文件。要启用标签系统,可以使用 --label
标志。
以下是一个渲染三角形的示例
(setq A (point 0 0))
(setq B (point 0 3))
(setq C (point 4 0))
(triangle A B C)
更多示例可以在 examples
目录下找到。
参考
该语言使用简单的Lisp语法编写。然而,值得注意的是,您可以简单地写出变量名而不加括号,解释器会自动替换变量的值并渲染相应的对象。例如,以下代码将渲染一个顶点在(0, 0),(0, 3),和(4, 0)的三角形。
; this is a triangle
(setq A (point 0 0))
(setq B (point 0 3))
(setq C (point 4 0))
(setq T (triangle A B C))
T
注意如何使用setq
函数设置变量,以及注释是如何从分号开始的。
函数也经常被重载以提供相同简单语法下的更多功能。以下是可用的几何函数:
point
(point [Int/Float] [Int/Float]) -> Point
point
函数创建一个点,第一个和第二个参数分别表示x和y坐标。
circumcenter
(circumcenter [Triangle]) -> Point
circumcenter
函数接受一个三角形,并返回该三角形的 circumcenter。
orthocenter
(orthocenter [Triangle]) -> Point
orthocenter
函数接受一个三角形,并返回该三角形的 orthocenter。
centroid
(centroid [Triangle]) -> Point
centroid
函数接受一个三角形,并返回该三角形的 centroid。
inradius
(inradius [Triangle]) -> Int/Float
inradius
函数接受一个三角形,并返回该三角形的 inradius。
incenter
(incenter [Triangle]) -> Point
incenter
函数接受一个三角形,并返回该三角形的 incenter。
lineseg
(lineseg [Point] [Point]) -> Lineseg
lineseg
函数使用给定的两个点作为端点创建一个线段。
midpoint
(midpoint [Point] [Point]) -> Point
midpoint
函数返回两个给定点的中点。
triangle
(triangle [Point] [Point] [Point]) -> Triangle
创建三角形的第一个情况涉及三个参数。这三个参数是三角形的三个顶点。
(triangle [Angle]) -> Triangle
创建三角形的第二个情况提供了一个角度(即两个相连的线段),函数将创建一个以角度为顶点的三角形。
(triangle [Circle]) -> Triangle
第三个和模糊的情况,当给定一个圆时,函数将返回一个随机生成的内接三角形。三角形中的点之间的距离将大于半径的一半。
circle
(circle [Point] [Int/Float]) -> Circle
创建圆的第一个情况涉及两个参数。第一个参数表示圆的中心。第二个参数是一个数字,表示圆的半径。
(circle) -> Circle
该函数的一个模糊情况,当没有给出参数时,此函数将在(0, 0)处创建一个标准圆,半径为5。
angle
(angle [Point] [Point] [Point]) -> Angle
angle
函数从三个参数中指定的三个点创建一个角度。
iangle
(iangle [Circle] [Int/Float]) -> Angle
iangle
函数在一个圆中创建一个内切角。第一个参数是圆,第二个参数是角度(以度为单位)。
intersect
(intersect [Lineseg] [Circle] [Int]) -> Point
intersect
函数的第一个情况涉及三个参数。第一个参数是一个线段,第二个是一个圆,第三个是一个表示0或1的int,表示交点的索引。由于一条线最多可以在两个点上与圆相交,因此索引用于确定要返回哪个点。
(intersect [Lineseg] [Lineseg]) -> Point
intersect
函数的第二个情况涉及两个线段。该函数将返回两个线段之间的交点。
依赖项
~315KB