19.12.2024 • C3D Solver

От отрезка к точке и обратно. Эволюция геометрии с C3D Solver

Отрезок — базовый и наиболее часто используемый объект чертежа или эскиза. Как вы думаете, сколько у него математических представлений? Пока вы подсчитываете варианты, я расскажу вам об отрезках в C3D Solver и новой опции, которая разрешила им вырождаться. Сразу оговоримся, что вырожденность не несет негативного смысла, а является вполне валидным и даже нужным состоянием.

В параметрическом решателе C3D Solver способов внутреннего представления отрезков два. Один из которых — две несовпадающие упорядоченные точки. Данный способ не допускает вырождение отрезка в точку, т. к. точки не должны совпадать. Такое описание ограничивало возможности пользователей при решении следующих задач:

  • построение параметрического контура с исчезающими и вновь появляющимися сегментами (рис. 1);
  • построение параметрических 3D-моделей с переменной топологией на основе 2D-контуров;
  • построение поверхности по траектории переменного сечения (рис. 2).
От отрезка к точке и обратно. Эволюция геометрии с C3D Solver, фото 1
Рис. 1. Параметрические контуры с исчезающими сегментами (конфигурация параметров)

От отрезка к точке и обратно. Эволюция геометрии с C3D Solver, фото 2
Рис. 2. Модель перехода с L-сечения на квадратное сечение демонстрирует работу отрезка L=0

Во всех перечисленных случаях необходимо изменение длины отрезка до нулевого значения с возможностью вернуться в исходное состояние.

В C3D Solver уже была представлена вырожденная геометрия, а именно окружности нулевого радиуса. Один из интересных примеров работы данной опции можно продемонстрировать при моделировании поверхности перехода от сечения со скруглением к квадрату. Это может быть какой-нибудь типовой или заказной сегмент воздуховода (рис. 3). Теперь реализована и поддержка отрезков, длина которых варьируется в диапазоне, включающем нуль.

От отрезка к точке и обратно. Эволюция геометрии с 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
Ксения Носулько
Математик-программист
C3D Labs
Поделиться материалом
Вверх