Точки, векторы и утилиты

Точки

point3(x, y, z) создаёт трёхмерную точку, point2(x, y) — двумерную. Большинство геометрических функций также принимают кортежи координат.

from zencad import *

p = point3(1, 2, 3)
assert p.value() == (1, 2, 3)
assert float(p.x) == 1

curve = interpolate([(0, 0, 0), (0, 0, 10), (10, 0, 10)])
display(curve)
display(p)
show()

Точка отображается как вершина. При преобразовании к ней применяется и поворот, и перенос.

Векторы

vector3(x, y, z) и vector2(x, y) задают направления и смещения. Перенос на вектор не действует. Для изображения вектора используйте стрелку.

Операция Результат
p - q Вектор между точками
p + v, p - v Смещённая точка
v + w, v - w, v * k Вектор
v.length() Длина
v.normalized() Единичный вектор того же направления
v.dot(w) Скалярное произведение
v.cross(w) Векторное произведение; у Vector2 — его скалярная Z-компонента

Складывать две точки нельзя. Операции создают новые значения, исходные координаты не меняются.

from zencad import *

v = vector3(3, 4, 0)
assert float(v.length()) == 5
assert abs(float(v.normalized().length()) - 1) < 1e-7
assert vector3(1, 0, 0).cross(vector3(0, 1, 0)).value() == (0, 0, 1)

Массивы точек и векторов

points и vectors создают списки трёхмерных точек и векторов. points2 создаёт двумерную сетку трёхмерных точек, например для интерполяции поверхности.

points([(0, 0, 0), (0, 0, 10), (10, 0, 10)])
vectors([(0, 0, 1), (1, 0, 0), (0, 1, 0)])
points2([
    [(0, 0, 0), (10, 0, 5)],
    [(0, 10, 0), (10, 10, 5)],
])

Числа и вычисления

Функции point3, vector3, scalar возвращают объекты Point3, Vector3, Scalar. Они сохраняют зависимости вычислений. .value() возвращает число или кортеж координат, .to_numpy() у точки и вектора — массив NumPy.

from zencad import *

body = box(2)
volume = body.mass()             # Scalar
moved = body.right(volume / 4)   # Перенос зависит от объёма.
assert abs(float(volume) - 8) < 1e-7
coordinates = moved.center().to_numpy()

float, int, bool и сравнения запрашивают численный результат. math.sin(value) также вычисляет число; sin(value) из ZenCad сохраняет зависимость. Подробнее — «Вычисления и кэш».

Радианы и градусы

Углы в API ZenCad задаются в радианах. deg(180) соответствует math.pi; deg2rad — синоним deg, rad2deg выполняет обратное преобразование.

rotateZ(deg(45))

Пустой примитив: nullshape

Пустая форма может участвовать в булевых операциях:

it = nullshape()
for i in range(7):
    it = it + box(20).translate(10*i, 10*i, 10*i)

# То же самое через список:
# union([box(20).translate(10*i, 10*i, 10*i) for i in range(7)])

Регистрация шрифта

register_font(fontpath) регистрирует шрифт FreeType для построения текста.