2025-05-11 19:32:33 +12:00
|
|
|
|
/// Functions for mathematical operations and some useful constants.
|
|
|
|
|
|
2025-02-25 16:10:06 +13:00
|
|
|
|
@no_std
|
2025-05-06 08:44:03 +12:00
|
|
|
|
@settings(defaultLengthUnit = mm, kclVersion = 1.0)
|
2025-02-20 19:33:21 +13:00
|
|
|
|
|
2025-04-22 11:00:53 +12:00
|
|
|
|
import Point2d from "std::types"
|
|
|
|
|
|
2025-02-20 19:33:21 +13:00
|
|
|
|
/// The value of `pi`, Archimedes’ constant (π).
|
|
|
|
|
///
|
2025-05-12 12:59:45 +12:00
|
|
|
|
/// `PI` is a number and is technically a ratio, so you might expect it to have type `number(_)`.
|
|
|
|
|
/// However, `PI` is nearly always used for converting between different units - usually degrees to or
|
|
|
|
|
/// from radians. Therefore, `PI` is treated a bit specially by KCL and always has unknown units. This
|
|
|
|
|
/// means that if you use `PI`, you will need to give KCL some extra information about the units of numbers.
|
|
|
|
|
/// Usually you should use type ascription on the result of calculations, e.g., `(2 * PI): number(rad)`.
|
2025-06-13 02:20:04 +12:00
|
|
|
|
/// It is better to use `units::toRadians` or `units::toDegrees` to convert between angles with
|
|
|
|
|
/// different units where possible.
|
2025-05-12 12:59:45 +12:00
|
|
|
|
///
|
2025-02-20 19:33:21 +13:00
|
|
|
|
/// ```
|
|
|
|
|
/// circumference = 70
|
|
|
|
|
///
|
2025-03-24 21:55:24 +13:00
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
2025-04-29 12:24:18 +12:00
|
|
|
|
/// |> circle(center = [0, 0], radius = (circumference / (2 * PI)): number(mm))
|
2025-02-20 19:33:21 +13:00
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
2025-04-29 12:24:18 +12:00
|
|
|
|
export PI = 3.14159265358979323846264338327950288_?
|
2025-02-20 19:33:21 +13:00
|
|
|
|
|
|
|
|
|
/// The value of Euler’s number `e`.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
2025-03-24 21:55:24 +13:00
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
2025-04-25 16:01:35 -05:00
|
|
|
|
/// |> startProfile(at = [0, 0])
|
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|
|
|
|
/// |> angledLine(
|
2025-06-12 08:44:55 +12:00
|
|
|
|
/// angle = 30deg,
|
2025-02-20 19:33:21 +13:00
|
|
|
|
/// length = 2 * E ^ 2,
|
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|
|
|
|
/// )
|
2025-03-07 22:07:16 -06:00
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
2025-02-20 19:33:21 +13:00
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 10)
|
|
|
|
|
/// ```
|
|
|
|
|
export E = 2.71828182845904523536028747135266250_
|
|
|
|
|
|
|
|
|
|
/// The value of `tau`, the full circle constant (τ). Equal to 2π.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
2025-03-24 21:55:24 +13:00
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
2025-04-25 16:01:35 -05:00
|
|
|
|
/// |> startProfile(at = [0, 0])
|
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|
|
|
|
/// |> angledLine(
|
2025-06-12 08:44:55 +12:00
|
|
|
|
/// angle = 50deg,
|
2025-02-20 19:33:21 +13:00
|
|
|
|
/// length = 10 * TAU,
|
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|
|
|
|
/// )
|
2025-03-07 22:07:16 -06:00
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
2025-02-20 19:33:21 +13:00
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
export TAU = 6.28318530717958647692528676655900577_
|
|
|
|
|
|
2025-04-30 12:40:11 +12:00
|
|
|
|
/// Compute the cosine of a number.
|
2025-02-20 19:33:21 +13:00
|
|
|
|
///
|
|
|
|
|
/// ```
|
2025-03-24 21:55:24 +13:00
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
2025-04-25 16:01:35 -05:00
|
|
|
|
/// |> startProfile(at = [0, 0])
|
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|
|
|
|
/// |> angledLine(
|
2025-06-12 08:44:55 +12:00
|
|
|
|
/// angle = 30deg,
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// length = 3 / cos(30deg),
|
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|
|
|
|
/// )
|
2025-03-07 22:07:16 -06:00
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
2025-02-20 19:33:21 +13:00
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
2025-06-10 20:24:48 -04:00
|
|
|
|
export fn cos(@num: number(Angle)): number {}
|
2025-02-20 19:33:21 +13:00
|
|
|
|
|
2025-04-30 12:40:11 +12:00
|
|
|
|
/// Compute the sine of a number.
|
2025-02-20 19:33:21 +13:00
|
|
|
|
///
|
|
|
|
|
/// ```
|
2025-03-24 21:55:24 +13:00
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
2025-04-25 16:01:35 -05:00
|
|
|
|
/// |> startProfile(at = [0, 0])
|
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|
|
|
|
/// |> angledLine(
|
2025-06-12 08:44:55 +12:00
|
|
|
|
/// angle = 50deg,
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// length = 15 / sin(135deg),
|
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|
|
|
|
/// )
|
2025-03-07 22:07:16 -06:00
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
2025-02-20 19:33:21 +13:00
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
2025-06-10 20:24:48 -04:00
|
|
|
|
export fn sin(@num: number(Angle)): number {}
|
2025-02-20 19:33:21 +13:00
|
|
|
|
|
2025-04-30 12:40:11 +12:00
|
|
|
|
/// Compute the tangent of a number.
|
2025-02-20 19:33:21 +13:00
|
|
|
|
///
|
|
|
|
|
/// ```
|
2025-03-24 21:55:24 +13:00
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
2025-04-25 16:01:35 -05:00
|
|
|
|
/// |> startProfile(at = [0, 0])
|
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|
|
|
|
/// |> angledLine(
|
2025-06-12 08:44:55 +12:00
|
|
|
|
/// angle = 50deg,
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// length = 50 * tan((1/2): number(rad)),
|
KCL: Angled line should use keyword args (#5803)
We continue migrating KCL stdlib functions to use keyword arguments. Next up is the `angledLine` family of functions (except `angledLineThatIntersects, which will be a quick follow-up).
Before vs. after:
`angledLine({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, length = 3, tag = $edge)`
`angledLineOfXLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthX = 3, tag = $edge)`
`angledLineOfYLength({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, lengthY = 3, tag = $edge)`
`angledLineToX({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteX = 3, tag = $edge)`
`angledLineToY({angle = 90, length = 3}, %, $edge)`
=> `angledLine(angle = 90, endAbsoluteY = 3, tag = $edge)`
2025-04-09 14:55:15 -05:00
|
|
|
|
/// )
|
2025-03-07 22:07:16 -06:00
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
2025-02-20 19:33:21 +13:00
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
2025-06-10 20:24:48 -04:00
|
|
|
|
export fn tan(@num: number(Angle)): number {}
|
2025-04-30 15:59:19 +12:00
|
|
|
|
|
|
|
|
|
/// Compute the arccosine of a number.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// sketch001 = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> angledLine(
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// angle = acos(0.5),
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// length = 10,
|
|
|
|
|
/// )
|
|
|
|
|
/// |> line(end = [5, 0])
|
|
|
|
|
/// |> line(endAbsolute = [12, 0])
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// extrude001 = extrude(sketch001, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn acos(@num: number(Count)): number(rad) {}
|
|
|
|
|
|
|
|
|
|
/// Compute the arcsine of a number.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// sketch001 = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> angledLine(
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// angle = asin(0.5),
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// length = 20,
|
|
|
|
|
/// )
|
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// extrude001 = extrude(sketch001, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn asin(@num: number(Count)): number(rad) {}
|
|
|
|
|
|
|
|
|
|
/// Compute the arctangent of a number.
|
|
|
|
|
///
|
|
|
|
|
/// Consider using `atan2()` instead for the true inverse of tangent.
|
|
|
|
|
///
|
|
|
|
|
/// ```no_run
|
|
|
|
|
/// sketch001 = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> angledLine(
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// angle = atan(1.25),
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// length = 20,
|
|
|
|
|
/// )
|
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// extrude001 = extrude(sketch001, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn atan(@num: number(Count)): number(rad) {}
|
|
|
|
|
|
|
|
|
|
/// Compute the four quadrant arctangent of Y and X.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// sketch001 = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> angledLine(
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// angle = atan2(y = 1.25, x = 2),
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// length = 20,
|
|
|
|
|
/// )
|
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// extrude001 = extrude(sketch001, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn atan2(y: number(Length), x: number(Length)): number(rad) {}
|
2025-04-08 08:16:43 +12:00
|
|
|
|
|
|
|
|
|
/// Convert polar/sphere (azimuth, elevation, distance) coordinates to
|
|
|
|
|
/// cartesian (x/y/z grid) coordinates.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
2025-04-25 16:01:35 -05:00
|
|
|
|
/// |> startProfile(at = [0, 0])
|
2025-06-12 08:44:55 +12:00
|
|
|
|
/// |> line(end = polar(angle = 30deg, length = 5), tag = $thing)
|
2025-04-08 08:16:43 +12:00
|
|
|
|
/// |> line(end = [0, 5])
|
|
|
|
|
/// |> line(end = [segEndX(thing), 0])
|
|
|
|
|
/// |> line(end = [-20, 10])
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
2025-04-23 10:58:35 +12:00
|
|
|
|
export fn polar(angle: number(rad), length: number(Length)): Point2d {
|
|
|
|
|
x = length * cos(angle)
|
|
|
|
|
y = length * sin(angle)
|
2025-04-08 08:16:43 +12:00
|
|
|
|
return [x, y]
|
|
|
|
|
}
|
2025-04-30 15:59:19 +12:00
|
|
|
|
|
|
|
|
|
/// Compute the remainder after dividing `num` by `div`.
|
|
|
|
|
/// If `num` is negative, the result will be too.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// import rem from "std::math"
|
|
|
|
|
///
|
|
|
|
|
/// assert(rem( 7, divisor = 4), isEqualTo = 3, error = "remainder is 3")
|
|
|
|
|
/// assert(rem(-7, divisor = 4), isEqualTo = -3, error = "remainder is -3")
|
|
|
|
|
/// assert(rem( 7, divisor = -4), isEqualTo = 3, error = "remainder is 3")
|
|
|
|
|
/// assert(rem( 6, divisor = 2.5), isEqualTo = 1, error = "remainder is 1")
|
|
|
|
|
/// assert(rem( 6.5, divisor = 2.5), isEqualTo = 1.5, error = "remainder is 1.5")
|
|
|
|
|
/// assert(rem( 6.5, divisor = 2), isEqualTo = 0.5, error = "remainder is 0.5")
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn rem(
|
|
|
|
|
/// The number which will be divided by `divisor`.
|
|
|
|
|
@num: number,
|
|
|
|
|
/// The number which will divide `num`.
|
|
|
|
|
divisor: number,
|
|
|
|
|
): number {}
|
|
|
|
|
|
|
|
|
|
/// Compute the square root of a number.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> angledLine(
|
2025-06-12 08:44:55 +12:00
|
|
|
|
/// angle = 50deg,
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// length = sqrt(2500),
|
|
|
|
|
/// )
|
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn sqrt(@input: number): number {}
|
|
|
|
|
|
|
|
|
|
/// Compute the absolute value of a number.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
2025-06-12 08:44:55 +12:00
|
|
|
|
/// myAngle = -120deg
|
2025-04-30 15:59:19 +12:00
|
|
|
|
///
|
|
|
|
|
/// sketch001 = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> line(end = [8, 0])
|
|
|
|
|
/// |> angledLine(
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// angle = abs(myAngle),
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// length = 5,
|
|
|
|
|
/// )
|
|
|
|
|
/// |> line(end = [-5, 0])
|
|
|
|
|
/// |> angledLine(
|
|
|
|
|
/// angle = myAngle,
|
|
|
|
|
/// length = 5,
|
|
|
|
|
/// )
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// baseExtrusion = extrude(sketch001, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn abs(@input: number): number {}
|
|
|
|
|
|
|
|
|
|
/// Round a number to the nearest integer.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// sketch001 = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> line(endAbsolute = [12, 10])
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// |> line(end = [round(7.02986), 0])
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// extrude001 = extrude(sketch001, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn round(@input: number): number {}
|
|
|
|
|
|
|
|
|
|
/// Compute the largest integer less than or equal to a number.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// sketch001 = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> line(endAbsolute = [12, 10])
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// |> line(end = [floor(7.02986), 0])
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// extrude001 = extrude(sketch001, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn floor(@input: number): number {}
|
|
|
|
|
|
|
|
|
|
/// Compute the smallest integer greater than or equal to a number.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// sketch001 = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> line(endAbsolute = [12, 10])
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// |> line(end = [ceil(7.02986), 0])
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// extrude001 = extrude(sketch001, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn ceil(@input: number): number {}
|
|
|
|
|
|
|
|
|
|
/// Compute the minimum of the given arguments.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> angledLine(
|
2025-06-12 08:44:55 +12:00
|
|
|
|
/// angle = 70deg,
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// length = min([15, 31, 4, 13, 22])
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// )
|
|
|
|
|
/// |> line(end = [20, 0])
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn min(
|
|
|
|
|
/// An array of numbers to compute the minimum of.
|
|
|
|
|
@input: [number; 1+],
|
|
|
|
|
): number {}
|
|
|
|
|
|
|
|
|
|
/// Compute the maximum of the given arguments.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> angledLine(
|
2025-06-12 08:44:55 +12:00
|
|
|
|
/// angle = 70deg,
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// length = max([15, 31, 4, 13, 22])
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// )
|
|
|
|
|
/// |> line(end = [20, 0])
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn max(
|
|
|
|
|
/// An array of numbers to compute the maximum of.
|
|
|
|
|
@input: [number; 1+],
|
|
|
|
|
): number {}
|
|
|
|
|
|
|
|
|
|
/// Compute the number to a power.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
|
|
|
|
/// |> angledLine(
|
2025-06-12 08:44:55 +12:00
|
|
|
|
/// angle = 50deg,
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// length = pow(5, exp = 2),
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// )
|
|
|
|
|
/// |> yLine(endAbsolute = 0)
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn pow(
|
|
|
|
|
/// The number to raise.
|
|
|
|
|
@input: number,
|
|
|
|
|
/// The power to raise to.
|
|
|
|
|
exp: number(Count),
|
|
|
|
|
): number {}
|
|
|
|
|
|
|
|
|
|
/// Compute the logarithm of the number with respect to an arbitrary base.
|
|
|
|
|
///
|
|
|
|
|
/// The result might not be correctly rounded owing to implementation
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// details; `log2` can produce more accurate results for base 2,
|
|
|
|
|
/// and `log10` can produce more accurate results for base 10.
|
2025-04-30 15:59:19 +12:00
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// |> line(end = [log(100, base = 5), 0])
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// |> line(end = [5, 8])
|
|
|
|
|
/// |> line(end = [-10, 0])
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn log(
|
|
|
|
|
/// The number to compute the logarithm of.
|
|
|
|
|
@input: number,
|
|
|
|
|
/// The base of the logarithm.
|
|
|
|
|
base: number(Count),
|
|
|
|
|
): number {}
|
|
|
|
|
|
|
|
|
|
/// Compute the base 2 logarithm of the number.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// |> line(end = [log2(100), 0])
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// |> line(end = [5, 8])
|
|
|
|
|
/// |> line(end = [-10, 0])
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn log2(@input: number): number {}
|
|
|
|
|
|
|
|
|
|
/// Compute the base 10 logarithm of the number.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// |> line(end = [log10(100), 0])
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// |> line(end = [5, 8])
|
|
|
|
|
/// |> line(end = [-10, 0])
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn log10(@input: number): number {}
|
|
|
|
|
|
|
|
|
|
/// Compute the natural logarithm of the number.
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// exampleSketch = startSketchOn(XZ)
|
|
|
|
|
/// |> startProfile(at = [0, 0])
|
2025-04-30 11:07:05 -04:00
|
|
|
|
/// |> line(end = [ln(100), 15])
|
2025-04-30 15:59:19 +12:00
|
|
|
|
/// |> line(end = [5, -6])
|
|
|
|
|
/// |> line(end = [-10, -10])
|
|
|
|
|
/// |> close()
|
|
|
|
|
///
|
|
|
|
|
/// example = extrude(exampleSketch, length = 5)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn ln(@input: number): number {}
|
2025-05-13 08:29:38 +12:00
|
|
|
|
|
|
|
|
|
/// Compute the length of the given leg.
|
|
|
|
|
///
|
|
|
|
|
/// ```kcl,no_run
|
|
|
|
|
/// legLen(hypotenuse = 5, leg = 3)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn legLen(
|
|
|
|
|
/// The length of the triangle's hypotenuse.
|
|
|
|
|
hypotenuse: number(Length),
|
|
|
|
|
/// The length of one of the triangle's legs (i.e. non-hypotenuse side).
|
|
|
|
|
leg: number(Length),
|
2025-05-19 16:50:15 +12:00
|
|
|
|
): number(Length) {}
|
2025-05-13 08:29:38 +12:00
|
|
|
|
|
|
|
|
|
/// Compute the angle of the given leg for x.
|
|
|
|
|
///
|
|
|
|
|
/// ```kcl,no_run
|
|
|
|
|
/// legAngX(hypotenuse = 5, leg = 3)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn legAngX(
|
|
|
|
|
/// The length of the triangle's hypotenuse.
|
|
|
|
|
hypotenuse: number(Length),
|
|
|
|
|
/// The length of one of the triangle's legs (i.e. non-hypotenuse side).
|
|
|
|
|
leg: number(Length),
|
|
|
|
|
): number(deg) {}
|
|
|
|
|
|
|
|
|
|
/// Compute the angle of the given leg for y.
|
|
|
|
|
///
|
|
|
|
|
/// ```kcl,no_run
|
|
|
|
|
/// legAngY(hypotenuse = 5, leg = 3)
|
|
|
|
|
/// ```
|
|
|
|
|
@(impl = std_rust)
|
|
|
|
|
export fn legAngY(
|
|
|
|
|
/// The length of the triangle's hypotenuse.
|
|
|
|
|
hypotenuse: number(Length),
|
|
|
|
|
/// The length of one of the triangle's legs (i.e. non-hypotenuse side).
|
|
|
|
|
leg: number(Length),
|
|
|
|
|
): number(deg) {}
|
2025-07-01 15:45:38 -05:00
|
|
|
|
|
|
|
|
|
/// Compute the cross product of two vectors.
|
|
|
|
|
///
|
|
|
|
|
/// ```kcl,no_run
|
|
|
|
|
/// p = XY
|
|
|
|
|
/// cross = crossProduct([planes::xAxis(p), planes::yAxis(p)])
|
|
|
|
|
/// ```
|
|
|
|
|
export fn crossProduct(
|
|
|
|
|
/// Returns the cross product of these two vectors.
|
|
|
|
|
@vectors: [Point3d; 2],
|
|
|
|
|
): Point3d {
|
|
|
|
|
a = vectors[0]
|
|
|
|
|
b = vectors[1]
|
|
|
|
|
x = a[1] * b[2] - (a[2] * b[1])
|
|
|
|
|
y = a[2] * b[0] - (a[0] * b[2])
|
|
|
|
|
z = a[0] * b[1] - (a[1] * b[0])
|
|
|
|
|
return [x,y,z]
|
|
|
|
|
}
|