Чтобы описать геометрию с помощью моделирования конструктивной твердотельной геометрии (CSG), используйте три структуры данных.
Матрица, столбцы которой описывают основные фигуры. При экспорте геометрии из приложения PDE Modeler эта матрица имеет имя по умолчанию gd (описание геометрии). См. раздел Создание основных фигур.
Матрица, столбцы которой содержат имена основных фигур. Поместите столбцы с нулями или 32 (пробелы) так, чтобы каждый столбец имел одинаковую длину. См. раздел Создание имен для основных фигур.
Набор символов, описывающих соединения, пересечения и заданные различия базовых форм, образующих геометрию. См. раздел Задание формулы.
Чтобы создать базовые фигуры в командной строке, создайте матрицу, столбцы которой описывают базовую фигуру. При необходимости добавьте дополнительные нули к некоторым столбцам, чтобы все столбцы имели одинаковую длину. Запишите каждый столбец, используя следующую кодировку.
Круг
| Ряд | Стоимость |
|---|---|
1 | 1 (обозначает круг) |
2 | x-координата центра окружности |
3 | координата y центра окружности |
4 | Радиус (строго положительный) |
Многоугольник
| Ряд | Стоимость |
|---|---|
1 | 2 (указывает многоугольник) |
2 | Количество отрезков n |
3 через 3+n-1 | координата X начальных точек кромки |
3+n через 2*n+2 | координата y начальных точек кромки |
Примечание
Полигон не может содержать самопересечений. Чтобы проверить, удовлетворяет ли полигон этому ограничению, используйте csgchk функция.
Прямоугольник
| Ряд | Стоимость |
|---|---|
1 | 3 (обозначает прямоугольник) |
2 | 4 (количество отрезков) |
3 через 6 | координата X начальных точек кромки |
7 через 10 | координата y начальных точек кромки |
Кодировка прямоугольника аналогична кодировке многоугольника, за исключением того, что первая строка 3 вместо 2.
Эллипс
| Ряд | Стоимость |
|---|---|
1 | 4 (обозначает эллипс) |
2 | x-координата центра эллипса |
3 | y-координата центра эллипса |
4 | Длина первой полуоси (строго положительная) |
5 | Длина второй полуоси (строго положительная) |
6 | Угол в радианах от оси x до первой полуоси |
Например, укажите матрицу, которая имеет прямоугольник с круговой торцевой крышкой и другим круговым вырезом. Сначала создайте прямоугольник и две примыкающие окружности.
rect1 = [3
4
-1
1
1
-1
0
0
-0.5
-0.5];
C1 = [1
1
-0.25
0.25];
C2 = [1
-1
-0.25
0.25];Добавьте дополнительные нули к окружностям, чтобы они имели то же количество строк, что и прямоугольник.
C1 = [C1;zeros(length(rect1) - length(C1),1)]; C2 = [C2;zeros(length(rect1) - length(C2),1)];
Объединение фигур в одну матрицу.
gd = [rect1,C1,C2];
Для создания формулы, описывающей соединения и пересечения базовых фигур, необходимо имя для каждой базовой фигуры. Введите имена в виде матрицы, столбцы которой содержат имена соответствующих столбцов в основной матрице формы. При необходимости поместите столбцы на 0 или 32, чтобы каждый из них имел одинаковую длину.
Одним из простых способов создания имен является указание символьного массива, строки которого содержат имена, а затем перенос. Используйте char для создания массива. char размещает строки по мере необходимости, так что все они имеют одинаковую длину. Продолжая пример, задайте имена для трех фигур.
ns = char('rect1','C1','C2'); ns = ns';
Конечную геометрию можно получить, написав набор символов, описывающих соединения и пересечения основных форм. Использовать + для союза, * для пересечения, - для разности наборов и круглые скобки для группировки. + и * имеют одинаковый приоритет группировки. - имеет более высокий приоритет группировки.
Продолжая пример, задайте объединение прямоугольника и C1и вычесть C2.
sf = '(rect1+C1)-C2';После создания базовых фигур, присвоения им имен и задания заданной формулы создайте геометрию с помощью decsg. Часто также удаляются некоторые или все результирующие границы граней. Завершая пример, объедините основные фигуры, используя формулу набора.
[dl,bt] = decsg(gd,sf,ns);
Просмотр геометрии с удалением границ и без него.
pdegplot(dl,'EdgeLabels','on','FaceLabels','on') xlim([-1.5,1.5]) axis equal

Удалите границы граней.
[dl2,bt2] = csgdel(dl,bt); % removes face boundaries figure pdegplot(dl2,'EdgeLabels','on','FaceLabels','on') xlim([-1.5,1.5]) axis equal

Разложенная геометрическая матрица имеет следующее кодирование. Каждый столбец матрицы соответствует одному граничному сегменту. Любая запись 0 означает, что кодирование для этой строки не требуется. Так, например, если в матрице появляются только отрезки линии, то матрица имеет 7 строк. Но если есть и круговой сегмент, то матрица имеет 10 строк. Дополнительные три строки столбцов строки заполняются 0.
| Ряд | Круг | Линия | Эллипс |
|---|---|---|---|
1 | 1 | 2 | 4 |
2 | Начальная координата x | Начальная координата x | Начальная координата x |
3 | Окончание координаты x | Окончание координаты x | Окончание координаты x |
4 | Начало координат y | Начало координат y | Начало координат y |
5 | Окончание координаты y | Окончание координаты y | Окончание координаты y |
6 | Метка области слева от сегмента с направлением, наведенным начальной и конечной точками (0 - внешняя метка) | Метка области слева от сегмента с направлением, наведенным начальной и конечной точками (0 - внешняя метка) | Метка области слева от сегмента с направлением, наведенным начальной и конечной точками (0 - внешняя метка) |
7 | Метка области справа от сегмента с направлением, наведенным начальной и конечной точками (0 - внешняя метка) | Метка области справа от сегмента с направлением, наведенным начальной и конечной точками (0 - внешняя метка) | Метка области справа от сегмента с направлением, наведенным начальной и конечной точками (0 - внешняя метка) |
8 | координата x центра окружности | 0 | координата x центра эллипса |
9 | координата y центра окружности | 0 | координата y центра эллипса |
10 | Радиус | 0 | Длина первой полуоси |
11 | 0 | 0 | Длина второй полуоси |
12 | 0 | 0 | Угол в радианах между осью x и первой полуосью |