Отрезок — базовый и наиболее часто используемый объект чертежа или эскиза. Как вы думаете, сколько у него математических представлений? Пока вы подсчитываете варианты, я расскажу вам об отрезках в C3D Solver и новой опции, которая разрешила им вырождаться. Сразу оговоримся, что вырожденность не несет негативного смысла, а является вполне валидным и даже нужным состоянием.
В параметрическом решателе C3D Solver способов внутреннего представления отрезков два. Один из которых — две несовпадающие упорядоченные точки. Данный способ не допускает вырождение отрезка в точку, т. к. точки не должны совпадать. Такое описание ограничивало возможности пользователей при решении следующих задач:
- построение параметрического контура с исчезающими и вновь появляющимися сегментами (рис. 1);
- построение параметрических 3D-моделей с переменной топологией на основе 2D-контуров;
- построение поверхности по траектории переменного сечения (рис. 2).
Во всех перечисленных случаях необходимо изменение длины отрезка до нулевого значения с возможностью вернуться в исходное состояние.
В C3D Solver уже была представлена вырожденная геометрия, а именно окружности нулевого радиуса. Один из интересных примеров работы данной опции можно продемонстрировать при моделировании поверхности перехода от сечения со скруглением к квадрату. Это может быть какой-нибудь типовой или заказной сегмент воздуховода (рис. 3). Теперь реализована и поддержка отрезков, длина которых варьируется в диапазоне, включающем нуль.
Рис. 3. Модель перехода от скругленного сечения на квадрат демонстрирует окружность (дугу скругления) R=0
Чтобы отрезок умел вырождаться в точку и, наоборот, восстанавливаться из точки, есть второй способ внутреннего представления — через две точки и направляющий вектор. Направляющий вектор полагается отрезку, чтобы он «не забыл» свое направление, пока он существует в форме точки. Этот способ представления также обеспечивает требование об упорядоченности пары точек, чтобы избежать эффекта «выворачивания» отрезка при участии в таких ограничениях, как «касание» и «на расстоянии».
Что же потребуется пользователю, чтобы начать работать с вырожденными отрезком и окружностью? Нужно познакомиться всего с несколькими функциями для обратных вызовов (колбэков) двумерного геометрического решателя.
Для начала необходимо ассоциировать геометрические объекты пользователя с объектами C3D Solver, чтобы настраивать поведение для каждого отрезка в отдельности. Сделать это можно при помощи функции:
void GCE_Bind( GCE_system, geom_item, GCE_app_geom );
Далее необходимо выдать разрешение решателю на нулевую длину кривой через обратный вызов:
GCE_allow_zero_length/GCE_allow_zero_radius.
Есть несколько преимуществ реализации колбэков для каждого объекта в отдельности. Например, рационально запретить нулевую длину для осевого отрезка симметрии. Также, возможно, в САПР потребуется визуализировать вырожденную геометрию, чтобы пользователь видел, что из какой-то точки может снова появиться отрезок (и наоборот).
И последний принципиальный элемент работы с вырожденными отрезками — функция GCE_get_lseg_direction
, которая позволяет получить направляющий вектор отрезка. Она предназначена для того, чтобы приложение не забывало, куда «смотрит» отрезок L=0, когда потребуется снова вернуть ему длину.
Функции обратных вызовов для разрешения кривых L=0, R=0:
/* Функции обратного вызова выдают для каждого объекта свой результат. */ using GCE_allow_zero_radius = bool (*)(GCE_app_geom ag); using GCE_allow_zero_length = bool (*)(GCE_app_geom ag); using GCE_get_lseg_direction = GCE_vec2d (*)(GCE_app_geom ag); struct GCE_callback_table { /* Geometry properties */ GCE_allow_zero_radius allowZeroRadius; // Разрешает окружности R=0. GCE_allow_zero_length allowZeroLength; // Разрешает кривые L=0. GCE_get_lseg_direction getLSegDirection; // Выдает вектор отрезка L=0 или L != 0. // .. };
Вырожденная геометрия, в числе которой окружности и отрезки, уже внедрена и доступна для использования в двумерном решателе C3D Solver. Она позволит более гибко использовать уже имеющиеся примитивы и решать задачи параметризации геометрии более высокого класса.
Ксения Носулько
Математик-программист
C3D Labs