#markup-language #triangle #point #renderer #circle #geometry #diagram

app elements-lang

一种几何标记语言和绘图渲染器

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

Download history 398/week @ 2024-08-17

398 每月下载量

MIT 许可证

68KB
1.5K SLoC

elements

一种几何标记语言和绘图渲染器。

开发

本项目的两个主要部分是:标记语言和绘图渲染器。标记语言的函数主要定义在 lang 文件夹中,而词法分析和解析函数分别定义在主 src 文件夹中的 lexer.rsinterpreter.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