Чтобы описать геометрию с помощью моделирования конструктивной стереометрии (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 и первой полуосью |