Чтобы описать вашу геометрию посредством моделирования Конструктивной геометрии тела (CSG), используйте три структуры данных.
Матрица A, столбцы которой описывают основные формы. Когда вы экспортируете геометрию из приложения PDE Modeler, эта матрица имеет имя по умолчанию gd
(описание геометрии).
Матрица A, столбцы которой содержат имена для основных форм. Заполните столбцы нулями или 32 (пробелы) так, чтобы каждый столбец имел ту же длину.
Набор символов, описывающих объединения, пересечения и разности множеств основных форм, которые делают геометрию.
Чтобы создать основные формы в командной строке, создайте матрицу, столбцы которой каждый описывает основную форму. При необходимости добавьте дополнительные нули в некоторые столбцы так, чтобы все столбцы имели ту же длину. Запишите каждый столбец с помощью следующего кодирования.
Круг
Строка | Значение |
---|---|
1
| 1 (указывает на круг), |
2
| x- центра круга |
3
| y- центра круга |
4
| (Строго положительный) радиус |
Многоугольник
Строка | Значение |
---|---|
1
| 2 (указывает на многоугольник), |
2
| Количество линейных сегментов n |
3 через 3+n-1 | x- начальных точек ребра |
3+n через 2*n+2 | y- начальных точек ребра |
Примечание
Ваш многоугольник не должен содержать самопересечения.
Прямоугольник
Строка | Значение |
---|---|
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
функция, чтобы создать массив. Эта функция заполняет строки по мере необходимости, таким образом, у всех есть та же длина. При продолжении примера дайте имена для трех форм.
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); 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 и первой полуосью |