Чтобы описать вашу геометрию посредством моделирования Конструктивной геометрии тела (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- начальных точек ребра |
Примечание
Ваш многоугольник не может содержать самопересечения. Чтобы проверять, удовлетворяет ли ваш многоугольник этому ограничению, используйте 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 и первой полуосью |