跳转至

PrairieDraw

Warning

本页介绍旧的 PrairieDraw 库。该库将无限期支持,但强烈建议所有新问题都使用 pl-drawing 元素。


PrairieDraw 库 (PrairieDraw.js) 是一个图形绘制库,允许通过 pl-prairiedraw-figure 元素 渲染动态图形。

pl-prairiedraw-figure 元素中的 params-names 选项传递到脚本的任何参数都可以使用 this.params.get([parameter]) 进行访问

Sylvester.js 库和所选方法

PrairieDraw 使用 Sylvester.Vector 类来指定绘图的位置和方向;下面列出的任何向量类型参数都属于这种类型。

以下是 Vector 上有用操作的不完整选择;完整的文档可以在 Sylvester 库的文档 中找到。

Sylvester.Vector.create(elements) 从数组 elements 创建并返回一个新 Vector。在脚本中将此命令别名为 var $V = Sylvester.Vector.create 通常很有用,因此您可以稍后编写 $V([x,y])

add(vector) 返回一个新的 Vector,它是接收者和参数的总和。

subtract(vector) 返回一个新的 Vector,它是接收者和参数之间的差异;即,a.subtract(b) 返回向量差 a-b

multiply(scalar)x(scalar) 返回一个新的 Vector,它是按参数缩放的接收器。 a.multiply(k)a.x(k) 等效。

dot(vector) 返回接收者和参数的标量积。

cross(vector) 返回一个新的 Vector,它是按从左到右顺序的叉积;即,A.cross(B) 返回 A x B

modulus() 返回向量的 (2) 范数。

toUnitVector() 返回一个新的 Vector,它是缩放为模数为 1 的接收器。

rotate(angle, axis) 返回一个新的向量,该向量是通过使用向量 axis 作为中心点逆时针旋转接收器 angle(以弧度为单位)而形成的。例如。,

a = $V([10, 5]);
b = $V([5, 5]);
c = a.rotate(Math.PI / 2, b); // c = [5, 10]

PrairieDraw.js

script_name提供的脚本可以通过this.pd访问PrairieDraw图形。下面的操作允许更改图形的方向或缩放比例,以及向其中添加绘图元素。

一般来说,绘图对象是不透明的,因此添加项目的顺序会影响图形的最终外观。

以下是 PrairieDraw 可用操作的不完整列表;库源代码可以在ZJUI-Learn存储库中找到。

PrairieDraw提供的常量

goldenRatio 返回黄金比例;对于在 setUnits 的参数中创建比例合适的图形很有用。

milesPerKilometer 返回转换系数 0.621371

设置和更改坐标系

setUnits(xSize, ySize [, canvasWidth, preserveCanvasSize]) 以绘图单位设置画布的大小,原点位于绘图的中心。可选的 canvasWidth 参数指定(以像素为单位)图形的宽度,而 preserveCanvasSize 则防止重塑画布以匹配坐标比。

scale(factor) 按给定因子(即坐标和像素之间的关系)缩放绘图坐标。

translate(offset) 通过向量 offset 平移坐标系原点。

rotate(angle) 将坐标系逆时针旋转 angle 弧度。

transformByPoints(old1, old2, new1, new2) 执行 scaletranslaterotate 的组合,使矢量点 old1old2 映射到 new1new2

绘图对象选项

下面的一些绘图对象具有可选的 type 参数来指定线条/箭头的物理含义。指定后,将根据 TAM 2XX 风格指南 为对象选择相应的颜色。

类型 颜色
grid rgb(200,200,200)
position rgb(0,0,255)
angle rgb(0,100,180)
velocity rgb(0,200,0)
angVel rgb(100,180,0)
acceleration rgb(255,0,255)
rotation rgb(150,0,150)
angAcc rgb(100,0,180)
angMom rgb(255,0,0)
force rgb(210,105,30)
moment rbg(255,102,80)

可选的 filled 参数(默认为 false)是一个布尔值,用于指定形状是否应着色。

绘制点和线

point(vector)vector 给出的坐标处绘制一个点。

line(start, end [, type]) 从矢量位置 startstop 绘制一条线段。

polyline(points [, closed, filled]) 绘制一系列连接 points 阵列的线段。可选参数(默认为 false)确定是否应通过连接 points 的第一个和最后一个元素的线来闭合折线。

arc(center, radius, startAngle, endAngle [, filled, aspect]) 绘制以 center 为中心、半径为 radius、从角度 startAngleendAngle(以弧度表示)的圆弧。当提供 aspect 时,将绘制具有长轴 radius 和短轴 radius / aspect 的椭圆的圆弧(即,aspect 是长轴/短轴)。

circle(center, radius [, filled]) 绘制一个以 center 为中心、半径为 radius 的圆。

rectangle(width, height [, center, angle, filled]) 绘制给定宽度和高度的矩形(与轴对齐)。如果未指定,则假定 center 为原点。还可以给出用于旋转的 angle

rectangleGeneric(bottomLeft, bottomRight, height) 绘制一个矩形,其一侧连接给定 heightbottomLeftbottomRight。该矩形垂直于该线延伸 (counterclockwise)。

绘制矢量箭头

arrow(start, end [, type]) 绘制从 startstop 的箭头(箭头位于 stop)。

arrowFrom(start, offset [, type]) 绘制从 startstart.add(offset) 的箭头。

arrowTo(end, offset [, type]) 绘制从 end.subtract(offset)end 的箭头。

arrowOutOfPage(vector [, type])vector 处画出屏幕外的箭头(带中心点的圆圈)。

arrowIntoPage(vector [, type])vector 处向屏幕中绘制一个箭头(以 x 为中心的圆圈)。

circleArrow(center, radius, startAngle, endAngle [, type, fixedRad, idealSegmentSize]) 绘制一条以 center 为中心、半径为 radius、从 startAngleendAngle(以弧度表示)的箭头圆弧。 fixedRad 选项(默认 false)指定是否应使用恒定半径(与开始/结束时的卷曲相反)。

circleArrowCentered(center, radius, centerAngle, extentAngle [, type, fixedRad]) 绘制一条以 center 为中心、半径为 radius、以 centerAngle 为中心、跨越 extentAngle(以弧度表示)的箭头圆弧。

triangularDistributedLoad(start, end, startSize, endSize, startLabel, endLabel, arrowToLine, arrowDown) 这将创建作用在 startend 之间的线上的 (trapezoidal) 分布式负载,一侧高度为 startSize,另一侧高度为 endSize,并具有相应的标签 startLabelendLabel。如果箭头指向 startend 之间的线,则 arrowToLine 为 true,否则为 false。如果箭头向下(y 负方向),则 arrowDown 为 true,否则为 false。最后两个选项确定箭头是出现在线条上方还是下方。

此函数假设从 startend 的线是水平的,如果不是水平的,则会出现意外行为。

绘制机械形状

rod(start, end, width) 绘制一根端点销位于 startend 的杆。杆的圆形端部将稍微延伸超出这些点。

LshapeRod(start, middle, end, width) 绘制一个 L 形杆,其端点为 startend,角点为 middle

TshapeRod(start, center, end, centerEnd, width) 绘制一个 T 形杆,在列出的四个点处带有铰链。要绘制具有三个臂的形状良好的杆,令 center 为臂的交点,顺序 startendcenterEnd 表示三个端点的顺时针顺序。

pivot(baseCenter, center, width) 创建一个铰接点位于 center 且另一端位于 baseCenter 的枢轴底座。当与下面的ground结合时,baseCenter通常是接地元件的中点。

ground(baseCenter, normal, width) 绘制以 baseCenter 为中心、宽度为 width 的 (shaded) 接地单元。 normal的方向垂直且远离地面。

arcGround(center, radius, startAngle, endAngle, outside) 使用与上面的 arc 命令类似的参数绘制弯曲的地面元素。如果阴影位于曲线外侧,则 outsidetrue,否则为 false

绘制文本和/或 LaTex 标签

有关格式化这些命令中的 text 参数的说明,请参阅下文

text(position, anchor, text [, boxed, angle]) 在给定的 position 处绘制文本。 anchor 是一个向量,其组件来自 (-1,0,1) 指定对齐方式;即,$V([-1,-1]) 对应于文本的“左”和“下”对齐; $V([1,1])对应于“右”和“上”。可选的 boxed 对文本进行框架,angle 将其旋转到位。

labelLine(start, end, pos, text [, anchor]) 沿 startend 之间的线放置文本。 pos 从 (-1,1) 获取局部坐标值,指定沿线以及线上方/下方的位置。可选的 anchor 使用与上述相同的图案。

labelCircleLine(center, radius, startAngle, endAngle, pos, text) 沿 centerradiusstartAngleendAngle 指定的圆弧放置文本。 pos 从 (-1,1) 沿曲线、上方/下方获取局部坐标值。

在图形上生成 LaTeX 标签

当使用 PrairieDraw.js 绘制问题中的图形时,可以使用纯文本(如 pd.text(..., "label"))或 LaTeX(如 pd.text(..., "TEX:$x$"))包含图形标签。如果您使用 LaTeX 标签,则必须先将它们渲染为图像文件,然后才能显示。这是通过运行以下命令来完成的:

docker run -it --rm -v PATH_TO_MY_COURSE:/course prairielearn/prairielearn /PrairieLearn/contrib/generate_text.py

将上面的 PATH_TO_MY_COURSE 替换为您的本地课程路径目录,例如 /Users/mwest/git/pl-tam212C:/GitHub/pl-tam212

通过查找 "TEX:..."'TEX:...' 形式的字符串来搜索 LaTeX 标签(注意不同的引用类型)。如果您希望字符串本身包含 ' 字符,请使用 "" 形式,反之亦然。

在问题中添加或更改任何 LaTeX 标签后,需要重复上述命令。

LaTeX 标签图像的文件名如下所示:

pl-tam212/questions/QID/text/186b41e2a92b8b22694dda1305699937df032555.png
pl-tam212/questions/QID/text/186b41e2a92b8b22694dda1305699937df032555_hi.png
pl-tam212/questions/QID/text/d68de4af4e4de5858554f8a90c5a519d9d435589.png
pl-tam212/questions/QID/text/d68de4af4e4de5858554f8a90c5a519d9d435589_hi.png

这些文件应提交到 git 存储库并推送到实时服务器,以便它们与问题一起可用。

高级:不使用 Docker 运行

如果您想在不使用 Docker 的情况下生成 LaTeX 标签图像,则需要安装 PythonImageMagickLaTeX,然后在 ZJUI-Learn 存储库的根目录中运行以下命令:

python contrib/generate_text.py --subdir /path/to/course