新增几何构造
这些对象可以通过脚本创建,在 App 与 Viewer 中显示,并随输入点、参数及动画更新。名称仍需唯一;e、sphere、surface 等常量或命令名不能作为对象名。
工具箱
App 左侧工具箱中的新增工具均按步骤点选画布或「对象」列表中的现有对象,命令面板也会激活同样的工具。已选对象高亮显示;误选类型会被忽略。当前步骤需要点时,点击没有点的位置会新建一个点,吸附规则与基础绘图工具一致:附近有点就复用,点在曲线上或附近则新建绑定在该曲线上的点,否则新建自由点(3D 中吸附到附近对象,或落在落点平面上——默认 z = 0,可在状态栏的 落点 z 修改)。新建的点会立即显示,但只在构造完成时才与构造一起写入脚本;当前步骤需要的不是点时,点击空白不会创建任何对象。Backspace 或「撤回上一步」撤回最后一次点选(包括由它新建的点),Esc 或「取消点选」清空未完成的构造,不修改脚本。创建前校验几何,成功后连同新建的点作为一次可撤销的脚本修改;移动所引用的对象会自动更新结果。
工具按几何类型和用途归组,分组提示显示类别名称,每组记住上次使用的工具。工具栏和命令面板使用同一份工具表,原有快捷键保持可用。
| 空间 | 类别 | 工具 |
|---|---|---|
| 2D | 点与中心 | 点、内心、外心、垂心、重心 |
| 2D | 线性对象 | 线段、向量、直线、射线 |
| 2D | 辅助线 | 垂线、平行线、切线、法线、过点圆切线、角平分线 |
| 2D | 圆与圆弧 | 圆、圆弧、三点圆、内切圆 |
| 2D | 圆锥曲线 | 椭圆、抛物线、双曲线 |
| 2D | 曲线 | Bézier、样条 |
| 2D | 多边形与区域 | 正多边形、扇形、弓形、不等式区域 |
| 3D | 线性对象 | 空间线段、向量、直线 |
| 3D | 空间圆与曲线 | 空间圆、圆弧、椭圆 |
| 3D | 平面图形与截面 | 平面、空间多边形、平面截面 |
| 3D | 多面体 | 长方体、棱柱、棱锥、多面体、棱台 |
| 3D | 柱锥台体 | 圆柱、圆锥、圆台 |
| 3D | 球与球体部分 | 球、球缺、半球、球带、球扇形 |
| 3D | 生成构造 | 拉伸、旋转 |
| 3D | 数学曲面 | 参数曲面、隐式曲面 |
指针、3D 点工具和 2D 文本框保留独立入口。「空间直线」(快捷键 L)点选两个位置不同的已有点,创建 line3;「平面」点选三个不共线的已有点。需要时先用 Point3 创建或抬高点。所建直线可用作旋转轴,平面可用作截平面;移动输入点时构造自动更新,支持撤回点选及一次撤销。
| 工具 | 点选顺序 |
|---|---|
| 切线/法线 | 曲线、点(取该点在曲线上的投影位置) |
| 过点圆切线 | 圆、圆外点 |
| 角平分线 | 点、顶点、点;再选择内角/外角 |
| 三点圆、内切圆、三角形中心 | 三个三角形顶点 |
| 抛物线 | 焦点、准线(直线、线段或射线) |
| 双曲线 | 第一焦点、第二焦点、曲线上一点 |
| Bézier、样条 | 依次选控制点,Enter 或「完成」结束;Bézier 选满四点也会完成 |
| 正多边形 | 中心、顶点;再设置边数 |
| 扇形、弓形 | 中心、起始半径点、结束方向点(逆时针) |
| 空间直线/平面 | 两个位置不同的点/三个不共线的点 |
| 空间圆、圆弧 | 三个点;圆弧的中间点为经过点 |
| 空间椭圆 | 中心、长轴端点、短轴测量点;第三点确定所在平面,到长轴的垂距确定第二半径 |
| 空间多边形、多面体 | 依次点选顶点/多边形面,Enter、「完成」或再次点选第一个对象结束 |
| 平面截面 | 立体、截平面 |
| 圆台 | 底面中心、底面半径点、顶面中心、顶面半径点 |
| 棱台 | 底面多边形、顶面中心、顶面半径点(相对底面第一个顶点的中心距离确定比例) |
| 拉伸 | 轮廓、表示位移的向量或线段 |
| 旋转体 | 轮廓、旋转轴直线(整周旋转) |
| 球冠、半球、球带、球扇形 | 球体、法向向量/线段/直线/射线/平面;球冠和球扇形再选截平面上的点,球带再选两个截平面上的点,半球不需要截取点 |
| 不等式、隐式曲面、参数曲面 | 两个范围角点,再输入数学表达式 |
多边形与 Bézier 至少选三个点,样条至少两个点,多面体至少四个面。样条完成时可选择是否闭合。定义域由两角点的 x/y 坐标确定,隐式曲面还使用 z;参数曲面的 x/y 分别对应 u/v。
2D
| 对象 | 语法 |
|---|---|
| 外接圆、内切圆 | circumcircle cc A B C、incircle ic A B C |
| 内/外角平分线 | angle_bisector bis A V B [external] |
| 切线、法线 | tangent t path at 0.5、normal n path at 0.5 |
| 从点引圆切线 | tangents pair c from P,返回直线列表 |
| 抛物线 | parabola p F directrix l [from -10] [to 10];l 可为直线、线段或射线,线段/射线按其所在直线计算 |
| 双曲线 | hyperbola h F1 F2 through P [from -3] [to 3] |
| Bézier | bezier b P0 P1 P2 [P3] |
| 正多边形 | regular_polygon hex O V sides 6 |
| 插值样条 | spline s A B C [closed] |
| 扇形、弓形 | sector s O radius 2 from 0 to 90deg、circular_segment cap O radius 2 from 0 to 90deg |
| 不等式区域 | inequality r (x^2+y^2 <= 4) domain -3 3 -3 3 |
incenter(A,B,C)、circumcenter(A,B,C)、orthocenter(A,B,C)、centroid(A,B,C) 返回三角形的内心、外心、垂心、重心。
新曲线支持 point(t)、project(P)、param(P)、tangent(t)、.length、点绑定、求交与动画。Bézier 的参数范围是 [0,1];样条用控制点区间索引加比例。双曲线显示两个分支,合并参数 [0,1) 对应左支、[1,2] 对应右支,在 1 处跳转;h.left、h.right 分别使用原始双曲参数,适合单支连续动画。
扇形、弓形是不带点绑定的区域对象,提供精确 .area、.contains(P) 与 .arc 路径。不等式区域被裁剪到 domain,面积和边界为采样近似。多个约束用 intersection 合并。
3D
space solid
point3 O 0 0 0
point3 A 3 0 0
point3 B 0 2 0
circle3 orbit O normal (0,0,1) radius 2
arc3 arc O normal (0,0,1) radius 2 from 0 to 90deg
ellipse3 ellipse O normal (0,0,1) radii 3 2
ellipse3 oriented O normal (cross3(vec3(O,A),vec3(O,B))) axis (vec3(O,A)) radii 3 2
polygon3 base (0,0,0) (4,0,0) (4,4,0) (0,4,0)
extrude body base by (0,0,3)
plane slicing (0,0,1) normal (0,0,1)
section cut body by slicing
point3 P on orbit at 0
animate P duration 4sellipse3 可用 axis <向量> 代替 angle 指定第一轴方向,向量在所在平面上的投影必须非零;两种子句不能同时使用。
circle3 c A B C、arc3 a A B C 也支持三点定义。圆弧经过中间点。polygon3 支持凹多边形;polygon3 ring outer holes inner 支持带孔面。所有顶点必须共面,边界不能自交或互相接触。
| 对象 | 语法与结果 |
|---|---|
| 自定义多面体 | polyhedron s face1 face2 face3 face4 ...,面为 polygon3,每条边属于两个面 |
| 截面 | section cut s by pl,多面体返回带面积、边界的 polygon3,球返回 circle3 |
| 圆台 | frustum f baseCenter topCenter radii 2 1 |
| 棱台 | pyramid_frustum f baseFace top topCenter scale 0.5 |
| 挤出体 | extrude s profile by (0,0,3) [samples 96],支持带孔面、圆和椭圆 |
| 旋转面/体 | revolve s profile around axis [from 0] [to 2pi] [samples 64] |
| 参数曲面 | parametric_surface s (u,v,u*v) domain -2 2 -2 2 [samples 48] |
| 隐式曲面 | equation3 s (x^2+y^2+z^2-4) domain -3 3 -3 3 -3 3 [samples 32] |
旋转曲线生成曲面,旋转简单多边形生成封闭实体;旋转轴必须在生成面的平面内,生成面须位于轴的一侧,暂不接受带孔生成面。部分旋转会封闭两端。equation3 绘制表达式等于零的曲面,因此一般方程写成左边减右边。
curve3、locus3、空间圆/圆弧/椭圆和多边形边界现在都支持:
point3 P on helix at 0.5
let Q = helix.project(A)
let t = helix.param(A)
let direction = helix.tangent(0.5)
animate P duration 4s mode pingpongcurve3 使用精确表达式求点,locus3 在连续采样段内插值;未定义间隙保持无效,不会连线穿越。字面量 at 支持拖动、动画和保留角度单位的源码写回。球面仍用两个 atAngles 参数。参数曲面提供 s.point(u,v)、s.normal(u,v),暂不作为绑定点的曲面载体。
多面体截面、面面积和多边形挤出测量使用实际几何;球截圆、圆台测量使用解析公式。圆柱/圆锥截面的曲线边界、圆/椭圆挤出、旋转体及曲面面积使用网格近似。没有面积的截切返回空列表与警告。
参数曲面采样限制为每轴 8–160,隐式曲面为 8–64;旋转体限制为 30,000 个生成顶点,隐式网格限制为 250,000 个顶点。Viewer 的求值预算比编辑器更小,高采样脚本可能超出预算。
球的部分实体
sphere_cap cap ball normal (0,0,1) height 1 samples 32
hemisphere half ball normal (0,0,1) samples 32
sphere_zone band ball normal (0,0,1) from -1 to 1 samples 32
sphere_sector radial ball normal (0,0,1) height 1 samples 32ball 是已有球,normal 指向正轴。球冠高度满足 0 < height <= 2r;半球使用高度 r。球带是两个轴向位置之间的球体切片,满足 -r <= from < to <= r。球扇形将球冠的球面部分沿半径连接到球心。显示网格复用旋转生成,体积、总表面积、重心、高度和球面部分面积 .curvedArea 使用精确公式。总表面积包含封闭所需的底面或锥面。采样默认 32,限制为 8–96。
