Булевые операции. Булевы операции

Булевы операции и математическая логика

Булевы операции очень близки (хотя и не тождественны) логическим связкам в классической логике . Бит можно рассматривать как логическое суждение - его значениями являются 1 «истина» и 0 «ложь». При такой интерпретации известные в логике связки конъюнкции , дизъюнкции , импликации , отрицания и другие имеют представление на языке битов. И наоборот, битовые операции легко описываются на языке исчисления высказываний .

Однако, связкам математической логики более соответствуют логические операции в т.ч. в программировании, нежели собственно битовые операции.

Булевы операции как основа цифровой техники

Булевы операции лежат в основе обработки цифровых сигналов . А именно, посредством них мы можем из одного или нескольких сигналов на входе получить новый сигнал, который в свою очередь может быть подан на вход одной или нескольким таким операциям. По сути, именно булевы операции в сочетании с запоминающими элементами (напр. триггерами) реализуют всё богатство возможностей современной цифровой техники.

Список битовых операций

И

«(Логическое) И» (and) - аналог конъюнкции в логике. Иногда называется логическим умножением.

Выдаёт 1 если оба входа равны 1, в противном случае 0. Если один из аргументов равен 1, то результат «И» равен другому. Если один из аргументов равен 0, то результат «И» равен 0 независимо от значения другого аргумента.

НЕ

«(Логическое) НЕ» (not), инвертирование - аналог отрицания в логике.

Данная унарная операция (с одним входом) заменяет 0 на 1 и наоборот. Реализующий её элемент называется инвертором .

ИЛИ

«(Логическое) ИЛИ» (or) - аналог дизъюнкции в логике.

Выдаёт 1 если и только если хотя бы один из входов равен 1. Операция, двойственная AND: при инвертировании выхода и всех входов (т.е. при замене 0 и 1 местами) «И» и «ИЛИ» взаимно превращается друг в друга.

Исключающее ИЛИ

«Исключающее ИЛИ» (xor), «сложение по модулю 2» - аналог исключающего ИЛИ в логике.

Если один из аргументов равен 0, то результат равен другому. Если один из аргументов равен 1, то результат равен отрицанию другого аргумента. Первое русское название операции обусловлено тем, что результат данной операции отличается от результата «ИЛИ» только в одном случае из 4 случаев входа - обоих 1 (случай одновременной истинности аргументов «исключается»). Ещё в русской грамматике значение данной логической связки передаётся союзом «либо».

Второе название - тем, что действительно является сложением в кольце вычетов по модулю 2, из чего следуют некоторые интересные свойства. Например, в отличие от вышеописанных «И» и «ИЛИ» данная операция является обратимой, или инволютивной: .

Операции от многих аргументов

Операции «И», «ИЛИ» и «исключающее ИЛИ» являются не только коммутативными, но и ассоциативными , и потому легко обобщаются на случай нескольких аргументов (входов).

Прочие бинарные операции

Стрелка Пирса является результатом инвертирования результата «ИЛИ» своих аргументов, выдаёт значение 1 только когда оба входа 0.

«И-НЕ» (nand), или «штрих Шеффера» .

Двойственная стрелке Пирса операция: является результатом инвертирования результата «И» своих аргументов, выдаёт значение 0 только когда оба входа 1. Известна простотой реализации в ТТЛ .

Импликация («если-то») - аналог импликации в логике.

Совпадает с «ИЛИ» с инвертированным первым аргументом, выдаёт значение 0 только когда первый вход 1 а второй - 0. Данная операция не является коммутативной , в отличие от всех вышеописанных бинарных операций. Её можно понимать как арифметическое (меньше или равно).

Эквиваленция . Выдаёт 1 если и только если оба аргумента равны между собой. Является результатом инвертирования результата «исключающего ИЛИ» своих аргументов. Она же и двойственна исключающему «ИЛИ» в вышеописанном смысле.

Сводная таблица истинности булевых операций

Название→
Аргументы
И (AND) НЕ (NOT) ИЛИ (OR) искл. ИЛИ(XOR) импликация стрелка
Пирса
штрих
Шеффера
x y ()
(x&y)
()
(~x)
()
(x|y)
()
(x^y)
()
((~x)|y)

((~x)&(~y))

(~(x&y))
0 0 0 1 0 0 1 1 1
0 1 0 1 1 1 1 0 1
1 0 0 0 1 1 0 0 1
1 1 1 0 1 0 1 0 0

Операции над битовыми векторами

Обобщение операций на булеву алгебру

Вместо одиночных битов мы можем рассмотреть векторы из фиксированного количества битов (в программировании их называют регистрами), например, байты . В программировании регистры рассматривают как двоичное разложение целого числа: b = b 0 + 2b 1 + 2 2 b 2 + ... + 2 N − 1 b N − 1 , где N - количество битов в регистре.

Тем не менее, ничто не мешает рассматривать эти регистры именно как битовые векторы и проводить булевые операции покомпонентно (бит номер k значения есть результат операция от битов номер k аргументов). Кстати, математически говоря, булевы операции распространяются таким образом на произвольную булеву алгебру . Таким образом мы получаем операции побитового И, ИЛИ, НЕ, искл. ИЛИ и т. д. Как арифметические, данные операции не обладают хорошими свойствами за исключением побитового НЕ, которое для чисел в дополнительном коде совпадает с вычитанием из −1 (~x == -1-x). Однако, они очень полезны в программировании.

Битовые сдвиги

К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига. Различают несколько видов сдвигов - логический , арифметический и циклический , в зависимости от обработки крайних битов.

Также различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).

Арифметический сдвиг (правый)

Циклический сдвиг

Циклический сдвиг через перенос

Логический сдвиг

При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.

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

Арифметический сдвиг

Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом представленному дополнительным кодом. Так при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.

Циклический сдвиг

При циклическом сдвиге, значение последнего бита по направлению сдвига копируется в первый бит (и копируется в бит переноса).

Также различают циклический сдвиг через бит переноса - при нем первый бит по направлению сдвига получает значение из бита переноса, а значение последнего бита сдвигается в бит переноса.

2-адическая интерпретация

Целое число, записанное (в дополнительном коде) в бесконечный (в сторону положительных степеней двойки) двоичный регистр является естественным объектом для теории p-адических чисел при p = 2 . Множество целых 2-адических чисел (т.е. произвольных бесконечных битовых последовательностей) может быть рассмотрено как булева алгебра точно так же как и множество значений битового регистра конечной длины. Все вышеперечисленные битовые операции оказываются непрерывными отображениями . Хотя практическое программирование не располагает регистрами бесконечной длины, это не мешает использовать данный теоретический факт в криптографии для создания быстродействующих алгоритмов шифрования.

Практические применения

Физическая реализация битовых операций

Реализация битовых операций может в принципе быть любой: механической, электромеханической , гидравлической, пневматической, оптической и даже химической.

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

Наиболее распространены электронные реализации битовых операций при помощи транзисторов , например резисторно-транзисторная логика (РТЛ), диодно-транзисторная логика (ДТЛ), эмиттерно-связанная логика (ЭСЛ), транзисторно-транзисторная логика (ТТЛ), N-МОП логика, КМОП логика и др..

В квантовых вычислениях из перечисленных булевых операций реализуются только НЕ и искл. ИЛИ (с некоторыми оговорками). Квантовых аналогов И, ИЛИ и т.д. не существует.

Схемы аппаратной логики

Результат операции ИЛИ-НЕ или ИЛИ ото всех битов двоичного регистра проверяет, равно ли значение регистра нулю; то же самое взятое от выхода искл. ИЛИ двух регистров проверяет равенство их значений между собой.

Битовые операции применяются в знакогенераторах и графических адаптерах ; особенно велика была их роль в адаптере графический ускоритель.

Использование в программировании

Благодаря реализации в арифметическом логическом устройстве (АЛУ) процессора многие их регистровые битовые операции аппаратно доступны в языках низкого уровня . В большинстве процессоров реализованы в качестве инструкции регистровый НЕ; регистровые двухаргументные И, ИЛИ, исключающее ИЛИ; проверка равенства нулю (см. выше); три типа битовых сдвигов, а также циклические битовые сдвиги.

Регистровая операция И используется для сброса конкретных битов по битовой маске, ИЛИ - для установки, исключающее ИЛИ - для инвертирования битов регистра по маске.

Моделирование с помощью булевых операций - это общая и часто используемая методика. Булевы операции весьма близки к традиционным методам создания скульптур и моделирования. В 3D Studio MAX булево моделирование становится еще более полезным за счет реализации составного булевого объекта. В отличие от модификатора моделирования составной булев объект состоит из двух объектов, называемых операндами, которые представляют булеву операцию. Эти операнды остаются в виде объектов столько, сколько необходимо, и обеспечивают возможность доступа к своим параметрам и стекам модификаторов.

Составной булев объект отличается от многих программных понятий булевых операций, поскольку он не изменяет на постоянной основе формы, определяющие геометрию операндов. Позже эту геометрию можно перемещать, переопределять и производить обмен. Поскольку операнды остаются объектами, с ними можно взаимодействовать как с любым другим объектом. Для них можно даже выполнять анимацию, создавая поразительные эффекты. Затененные видовые окна 3DS МАХ позволяют видеть результат булевой операции в случае изменения операндов. Последнее является преимуществом интерактивного режима работы и вызывает ощущение, что один объект используется для вырезания другого. Оставаясь весьма полезными и развлекательными, сложность булевых операций может возрасти при вложении их одна в другую. В этой главе приводится информация, позволяющая упростить использование булевых операций. Внимание уделяется:

  • Основам булевых операций и способам увеличения их интерактивности
  • Работе со вложенными булевыми объектами
  • Использованию различных булевых операций для создания скульптур и моделирования
  • Соображениям, которые необходимо учитывать для успешного выполнения булевых операций

Основы булевых операций

Как и для многих терминов компьютерной графики, термин "булева" происходит от имени человека, который ввел это понятие (в данном случае это Джордж Буль). В математике термин "булева" появился для обозначения операции сравнения между множествами; в 3D Studio MAX подобное сравнение выполняется между геометрическими объектами. Хотя булева операция выглядит во многом похожей на модификатор, она находится на панели Create, а не на панели Modify, поскольку выполняется определение нового объекта из двух существующих (аналогично созданию loft- или morph-объектов). Булева операция в 3D Studio MAX выполняется путем создания булевого составного объекта из двух существующих объектов, которые называются операндами , при этом выполняются следующие шаги:

  1. Выберите начальный объект для булевой операции.
  2. Выберите Compound Objects (составные объекты) из списка выборки Geometry в панели Modify и затем щелкните на кнопке Boolean.
    Выбранный объект становится операндом А для составного булевого объекта. Теперь можно выбрать операнд В.
  3. Выберите требуемый тип операции (Operation:).
  4. Щелкните на Pick Operand В (выбрать операнд В) и затем выберите второй объект.
    Объекты сравниваются для определения их действительности (с точки зрения выполнения булевой операции) и, если они действительны, булева операция выполняется.
    Теперь можно изменить тип операции и увидеть различные булевы результаты.

Типы операции подобны многим традиционным методам. Объединение соединяет объекты подобно работе с глиной; при вычитании один объект вырезается из другого, как в скульптуре; пересечение оставляет то, что должно было бы быть вырезано или выбито из вычитания. Объединение и вычитание всегда возвращают одинаковый результат независимо от порядка выбора операндов. Предусмотрены две опции (А-В и В-А), поэтому при неправильном начальном выборе можно быстро переключиться. Результаты этих основных операций показаны на рисунке 11.1.

ПРЕДУПРЕЖДЕНИЕ Можно щелкнуть на кнопке Pick Operand В и выбрать другой Operand В произвольное количество раз. При выборе нового операнда В первоначальный операнд со сцены удаляется. При выборе в качестве операнда В неправильного объекта щелкните на кнопке Undo перед выбором другого операнда В.

Булевы выражения в качестве составных объектов

Чрезвычайная гибкость булевых операций в 3DS МАХ состоит в том, что объекты, содержащие булевы операнды, по-прежнему существуют как объекты. Каждый операнд сохраняет свой первоначальный стек Edit History (отредактировать историю) и его можно модифицировать из панели Command. Операнды можно даже трансформировать на уровне подобъекта. На рисунке 11.2 показан результат в Track View после создания булевого объекта.

Архитектура ссылок и экземпляров 3DS МАХ демонстрирует свою мощь при работе с булевыми объектами. При первом создании булевого составного объекта можно выбирать опцию перемещения, создания копии, экземпляра или ссылки объекта, выбранного в качестве операнда В. Опцией по умолчанию является Move (переместить) и кажется, что она создает явное действие, поскольку остается только булев результат. Оба объекта, выбранные для булевой операции, теперь являются операндами подобъектов. Остальные опции выполняют булев результат с копией, экземпляром или ссылкой на выбранный объект. Во всех трех случаях объект, выбранный для операнда В, остается без изменений, а булев результат получается с использованием нового объекта в качестве операнда. В таких случаях может показаться, что ничего не произошло, до тех пор пока не переместить или не скрыть один из этих двух объектов.

ПРИМЕЧАНИЕ Из объекта, выбранного в качестве операнда В, удаляется любая анимация трансформации, в то время как операнд А (первоначальный объект) оставляет анимацию трансформации. Если операнд А имеет анимацию трансформации, для нового статического операнда используется текущее расположение кадра, его позиция и масштаб.

Хотя можно сделать копию, экземпляр или ссылку операнда В, для операнда А такой опции не существует (объект выбирается после щелчка на Boolean). Гибкий метод обхода такого ограничения заключается в кло-нировании до экземпляров всех объектов, которые предполагается использовать в булевых операциях. После этого следует использовать опцию по умолчанию Move для выборок операнда В, обеспечив возможность модификации любых объектов в рамках булевого объекта и сохранения их отношений.

СОВЕТ Чтобы создать экземпляр из объекта, который уже является операндом, войдите в Track View. Скопируйте определение объекта операнда (указано синим кружком) в буфер обмена и вставьте его в определение другого объекта в виде экземпляра. Этот метод можно также использовать в обратном порядке, полностью переопределяя геометрию операндов, например путем изменения всех квадратных отверстий на круглые.

После создания булевого объекта можно заменить операнд В из панели Modify булевого объекта с теми же самыми выборами, предоставленными при создании. Используйте эту опцию осторожно, поскольку она уничтожает со сцены первоначально выбранный операнд В. Уничтожение оригинала может создать проблему при первоначальном использовании опции Move и представлении геометрии, которая уже не существует в виде отдельного объекта. Выбор другого операнда - это то же самое, что и замена определения объекта операнда в Track View, за исключением случая, когда необходимо сделать ссылку, которая не присутствует в Track View.

После создания булевого объекта можно вернуться к каждому Modifier Stack операнда на панели Modify (см. рис. 11.3). При первом входе в панель Modify булевого объекта не выбран ни один из операндов, поэтому Modifier Stack показывает только Boolean. Для модификации стека конкретного операнда необходимо произвести выбор из списка Operands. Теперь выбранный операнд отображает свой стек. Можно настроить любой модификатор в стеке или добавить новые модификаторы для оказания влияния на объект операнда перед булевой операцией. На параметры, с которыми можно выполнять анимацию, дополнительных ограничений не существует. Для трансформации операнда необходимо активизировать режим Sub-Object для булевого объекта. При таком подходе операнды можно считать подобными гизмо за тем исключением, что в отличие от гизмо, у операндов имеются собственные Modifier Stack.

Опции обновления

Опции Update (обновления) для булевых операций управляют тем, как фактически выполняются булевы вычисления. Для сложных объектов булевы вычисления могут занимать достаточно большое время. Эти вычисления замедляют редактирование других объектов, если они являются экземплярами или ссылками на булевы операнды. Если при моделировании возникают паузы, измените опцию Update. Опция Manually (вручную) является одним из наиболее консервативных методов и обеспечивает наибольшее управление вычислением операций. Такой режим наиболее пригоден для сложных моделей. Метод When Rendering (во время визуализации) не вычисляет операцию до тех пор, пока не будет выполнена окончательная визуализация, после чего производится возврат откорректированного результата на сцену. Метод When Selected (при выборе) несколько ненадежен в обновлении результата и на него не следует полагаться.

Для ускорения операций моделирования операнды должны быть простыми. После завершения булевых операций и модификаций возвратитесь к прежним определениям операндов и увеличьте их плотность. Если они являются экземплярами, увеличьте их сложность и затем вручную отрегулируйте результат.

СОВЕТ Длительные булевы вычисления можно завершить, нажав клавишу Escape во время отображения курсора ожидания. После такого завершения режим Update автоматически переходит в Manually, поэтому теперь можно точно управлять временем вычисления обновления (поскольку геометрия, по всей вероятности, является сложной).

Интерактивные булевы операции

При входе в режим Sub-Object булевого объекта операнды можно регулировать независимо друг от друга. В списке перечислены имена операндов, подходящих для перемещения, вращения или масштабирования. При манипуляции операндом на уровне подобъектов фактически выполняется интерактивная булева операция, поскольку при перемещении любого из операндов другой остается неподвижным, и по мере перемещения операнда отображается обновленный булев результат. Для несложных моделей или при использовании быстродействующих машин это часто выполняется в реальном времени.

ПРИМЕЧАНИЕ Для сложных булевых операций режим Update для булева выражения должен быть установлен в Manually, чтобы операнд можно было позиционировать без дополнительных задержек на вычисления. После помещения операнда на требуемое место щелкните на Update для просмотра нового результата.

Понимание опций Display (отображения) булевой операции является ключевым моментом при выполнении интерактивных изменений. Результат булевой операции показывает опция по умолчанию Result (результат). При изменении опции на Operands (операнды) отображаются оба операнда А и В так, как будто булевой операции не выполнялось. Полностью отображенный операнд скрывает булев результат, поэтому в некоторой степени приходится работать вслепую. На практике лучше всего является комбинация, при которой выбирается Result и активизируется опция Show Hidden Ops (показать скрытые операнды). При этом недостающие операнды отображаются в виде проволочных каркасов (но только в затененных видовых окнах) и обеспечивается информация о точном местонахождении операнда и о его текущем влиянии на булеву операцию.

ПРИМЕЧАНИЕ Помните, что операнд всегда можно присвоить другому контроллеру объекта или контроллеру уникального Path, Look At (посмотреть на) или Expression (выражение) для создания эффектов, подобных анимированным кусочкам сверла или ожогам лазера.

Вложенные булевы объекты

Для одного объекта можно выполнить любое число булевых операций, причем каждая операция создает собственный набор операндов, вложенных друг в друга. Единственным "пределом" является практичное количество операций, по которыми необходимо перемещаться.

После создания булевого объекта на той же самой геометрии можно выполнять дополнительные булевы операции путем выбора объекта в качестве операнда А для нового составного булевого объекта. Каждый раз при выполнении на объекте булевой операции фактически создается оригинал операнда нового булевого объекта. Таким образом определяется "булево дерево", состоящее из одиночных ветвей - весьма линейная прогрессия шагов. К каждой выполняемой булевой операции можно осуществить доступ позже, хотя применяемый для этого метод требует небольшой практики, поскольку все это происходит на панели Modify. Результаты выполнения трех последовательных булевых операций показаны на рисунке 11.4. Коробка вычитает сферу, затем цилиндр и, в конце концов, конус.

СОВЕТ Для более глубокого погружения в булево дерево продолжайте выбирать операнд А и затем перейдите к следующей булевой операции в стеке. Для продвижения вперед используется стек операнда В, но для продвижения назад по истории редактирования можно использовать только стек операнда А.

При выполнении нескольких булевых операций, одну за другой, следует соблюдать осторожность. После завершения операции и, таким образом, составного булевого объекта, необходимо выйти из диалога Boolean или последующий выбор заменит только что выполненную операцию и удалит объект со сцены. Хотя для этого требуются дополнительные щелчки на кнопках, необходимо выйти из списка Compound Objects (составные объекты) путем выбора геометрии другого типа (например, Path Grids) и затем вернуться к Compound Objects для определения следующего булевого объекта.

При навигации по булевому дереву в Track View необходимо помнить, что в нем отражаются только объекты с параметрами, с которыми можно выполнить анимацию. Если булев объект создан из необработанного каркаса или лоскута, показываются только трансформации операнда, поскольку у него нет параметров создания, которые нужно настраивать. Когда для этого же объекта задается модификатор, для модифицированного объекта создается новый вход. То, что у операнда такая же метка, что и у Transform (с голубым кружком модификатора вместо зеленого треугольника контроллера) может привести к замешательству. При глубоком погружении в дерево, изображенное ранее на рисунке 11.4, следите за голубыми кружками Operand. Только самый глубокий операнд А содержит определение объекта; определения всех других объектов находятся внутри предыдущих операндов В.

СОВЕТ При использовании в качестве операндов примитивов Track View перечисляет их параметры под общим заголовком Operand. Задани]е для примитива модификатора, например Material, перемещает параметры создания в сферу модифицированного объекта, расположенную под операндом, вместе с меткой, обозначающей тип объекта.

Булевы характеристики

При создании булевого объекта сохраняются сглаживающие группы и идентификаторы материалов отдельных объектов. К сожалению, проецирование (mapping) полностью удаляется и его необходимо применить после получения окончательного булевого результата. В случае, если объекту присвоено проецирование через модификаторы UVW, его можно восстановить. Если создается копия, но не экземпляр, первоначального объекта или модификатора, присвойте новый UVW Mapping после выполнения булевой операции, и для восстановления проецирования используйте функцию Acquire (приобрести) модификатора. Отметим, что эта операция не работает для процедурных присвоении проецирования.

Координаты проецирования удаляются, поскольку вершины булевого результата всегда объединены. При этом если имеется намерение после выполнения булевой операции разделить первоначальные операнды, для их отсоединения следует использовать Edit Mesh. Если операнд имеет уникальный материал или сглаживающие группы, это значительно помогает в выборке на уровне грани для отсоединения.

Идентификаторы материалов, вероятно, являются самым ценным инструментом при управлении окончательными результатами для поверхности булевого объекта. Задание для каждого операнда модификатора Material с отдельным идентификатором означает, что имеется гарантированный метод выбора граней после завершения булевых операций. Несмотря на то, что для подобъекта присвоения материала весьма полезно, сохранение операндов в виде выборок граней также имеет значение при выборке граней для присвоения сглаживающих групп и модификаторов UVW Mapping с целью восстановления утерянного покрытия.

Иногда булев результат содержит дефекты в виде петель и искажений. Эти дефекты часто вызваны тем, что аналогичные сглаживающие группы действуют друг на друга методами, которые не должны применяться, или вершины объединяются так, что сглаживание произойти не может. Если такого рода дефекты видны, примените модификатор Edit Mesh, выберите все вершины и выполните Weld Selected (объединить выбранные). Если дефекты не исчезают, необходимо проанализировать присвоения сглаживающих групп (перед булевой операцией или после нее).

В большинстве случаев гораздо проще выбрать критические области перед тем, как они станут частью булевой операции. Если известно, какая часть модели потребует уникального сглаживания (например, закругление на рисунке 11.5), присвойте этим граням уникальную сглаживающую группу или идентификатор материала так, чтобы после булевой операции у них оказалось корректное сглаживание.

Последнее обсуждение может оказаться таким, как будто необходимо проделать тщательные размышления и планирование перед переходом к выполнению булевой операции, хотя фактически Modifier Stack позволяет сделать этот процесс значительно менее структурированным. На практике общим приемом является быстрое создание булевых объектов и затем возвращение к предыдущему операнду в истории операндов с целью произвести при необходимости присвоения сглаживания и материала. Отметим, что это значительно проще сделать, если есть объекты-экземпляры перед тем, как они станут операндами.

Соображения по улучшению булевых операций

Булев код в 3DS МАХ очень обобщен и позволяет работать с произвольными поверхностями. Однако подобное обобщение означает, что не каждый объект образует действительный булев объект и что некоторые "действительные" результаты могут иметь артефакты (например, длинные грани планки) или содержать нежелательные результаты. Ниже приведен контрольный перечень, который поможет при поиске неисправностей и создании моделей, дружественных для булевых операций:

  • Нормали для всей поверхности должны быть унифицированы без всяких ложных граней, указывающих в неправильном направлении. Нормали граней используются в определении направления поверхности и результирующего булевого объекта.
  • Каркас должен быть построен правильно; это означает, что грани, совместно использующие ребро, должны совместно использовать две вершины, а ребро может совместно использоваться только двумя гранями. (Внутренние основные грани вершин объекта вращения для последнего правила являются типичным кошмаром.)
  • Обеспечивайте объединение всех вершин. Может потребоваться объединение всех вершин вручную с помощью Edit Mesh даже для последовательных булевых операций.
  • Копланарные грани, в особенности те, которые находятся внутри одного и того же объекта, причиняют беспокойство и их следует избегать. Одним из наихудших случаев являются копланарные грани, расположенные тыльными сторонами друг к другу (они легко создаются путем построения примитива с нулевой высотой).
  • Булевы операции надежно работают только с одиночными элементами. Если любой из операндов состоит из множества элементов (например, Teapot или Hedra), в каждый момент времени может успешно работать только один элемент.
  • Если операция не удается, выключите опцию Optimize Result (оптимизировать результат) в нижней части свитка так, чтобы последний проход, контролирующий компланарные грани, не вычислялся. Включенная опция Optimize Result часто может быть причиной получения некорректных результатов.
  • Если операция по-прежнему не удается или создает расщепленные грани, попытайтесь выполнить небольшую настройку операндов.
  • Изменяйте уровень детализации операнда, в особенности возле области, которая является локальной для действующей булевой операции.

Не допускайте того, чтобы этот контрольный перечень испугал вас и заставил избегать булевых операций. Большинство этих опций работает с первой попытки, в особенности если геометрия подчиняется первым трем правилам, а это, скорее всего, будет выполняться при создании геометрии в рамках 3DS МАХ.

При выполнении анимации с булевыми операциями можно столкнуться с внезапной "вспышкой" или "подрагиванием" в одном или двух кадрах - вероятнее всего, это результат того, что булева операция не выполнилась, или в этом одном кадре созданы странные грани. Учитывая вред и влияние булевой операции с анимацией, стоит потратить время на продвижения от кадра к кадру для анализа булевого результата. Если возникает состояние, при котором происходит ошибка визуализации, немного отрегулируйте геометрию этого кадра с целью улучшения результата и продолжите работу. Если требуется произвести множество настроек, лучше присвоить дорожке положения операнда контроллер Linear и настроить практически каждый кадр.

Вырезание при помощи булевого вычитания

Булевы операции вычитания - это наиболее используемые типы операции и поэтому являются операциями по умолчанию. Операции вычитания можно рассматривать как операции "откусить кусок от", "создать скульптуру", "вырезать", "удалить из", "просверлить", "отштамповать" - выбирайте аналогию с наибольшим смыслом.

Успешное создание скульптуры посредством булевой операции начинается с понимания того, какой должна быть конечная вычитаемая форма. Это приводит к мысли о том, какая геометрия потребуется для выполнения того или иного шаблона. После частого выполнения операций вычитания объект имеет мало сходства с окончательным результатом; объект просто принимает форму режущего ножа, который делит поверхность на пластины. Второй операнд можно считать "стамеской" или "кусочком фасонной фрезы", которая создает конкретный "желобок" на первом объекте. Операция булевого вычитания также является хорошим, если не основным, методом для создания закруглений и углублений на существующих объектах.

ПРИМЕЧАНИЕ Может оказаться полезным обеспечить выбор "режущих инструментов" в виде кривых Безье, которые для целей операций булевого вычитания можно вытягивать, выполнять с ними операцию лофтинга или вращать. Более сложные булевы режущие формы при необходимости можно сохранить в виде каркаса или в слитом виде.

Создание посредством булевого пересечения углублений в новых объектах

Булево пересечение создает объект, который иначе следовало бы "вырезать" при помощи операции булевого вычитания. Результат иногда трудно визуализировать, но он может создать геометрию, которую иначе трудно промоделировать (см. рис. 11.6). Здесь второй операнд действует в качестве разреза в шести направлениях.

Одно из основных применений булевого пересечения заключается в восстановлении того, что "отбирается" при операции булевого вычитания. Иногда может потребоваться использовать часть, которая "упала на пол" в анимации. Может потребоваться показать часть, которая отштампована, например, из металлической заготовки. Для этого скопируйте первоначальные объекты и выполните две булевы операции, создав таким образом "разрезанный" объект и то, что было "вырезано".

Моделирование при помощи булевого объединения

Операция булевого объединения объединяет два операнда и удаляет любую перекрывающуюся геометрию. Перед выполнением объединения следует тщательно рассмотреть саму необходимость создания объединения. Если основное пересечение можно видеть, использование объединения является правильным выбором. Если пересечение двух объектов скрыто, лучше разрешить объектам просто пересечься. В общем случае используйте объединение, если необходимо продолжить сглаживающие группы через сочленение. В этом случае булево объединение является просто первым шагом в более сложной последовательности моделирования.

Булево объединение более всего используется для объектов, которые должны выглядеть "сплошными". Поверхность закрыта, исследовать внутреннюю структуру не требуется, поэтому объект имеет толщину всего в одну грань. Во многих случаях булево объединение выполняется для достижения эффекта вычитания. Один операнд накладывается на другой, что разрешает использовать последний для других целей, не нанося вреда операнду, который накладывается. Такая операция может оказаться полезной, когда накладываемый объект имеет конкретную форму, которую необходимо связать с другим объектом.

Булево объединение также применяется для создания двух элементов, которые можно отделить от других при помощи функции Detach в Edit Mesh. Если операция булевого объединения используется для редактирования объектов там, где геометрия перекрывается однократно, каркас не образуется. Когда результирующие объекты разделяются, в каркасе появляется отверстие в месте соединения объектов. Для эффективного использования этого метода лучше всего присвоить каждому операнду уникальный идентификационный номер материала (Material ID#) так, чтобы можно было легко выбирать грани по Material ID# из Edit Mesh при выполнении отсоединения.

Но в терминологии программирования на языках высокого уровня в названиях битовых операций присутствуют прилагательные битовый , побитовый (например: «побитовое логическое И », оно же «побитовое умножение»), поразрядный .

В некоторых языках программирования названия операторов, соответствующих логическим и побитовым логическим операциям, похожи. Кроме того, язык программирования может допускать неявное приведение числового типа к логическому и наоборот. В таких языках программирования необходимо внимательно следить за использованием логических и побитовых операций, перемешивание которых может привести к ошибкам. Например, в C++ результатом выражения «2 && 1» (логическое И ) является булево значение true , а результатом выражения «2 & 1» (побитовое И ) - целое значение 0 .

Побитовое отрицание (NOT) [ | ]

Побитовое отрицание (или побитовое НЕ , или дополнение ) - это унарная операция , действие которой эквивалентно применению логического отрицания к каждому биту двоичного представления операнда. Другими словами, на той позиции, где в двоичном представлении операнда был 0, в результате будет 1, и, наоборот, где была 1, там будет 0. Например:

НЕ 01
10

Побитовое «И» (AND) [ | ]

Второе название - тем, что действительно является сложением в кольце вычетов по модулю два, из чего следуют некоторые интересные свойства. Например, в отличие от вышеописанных «И» и «ИЛИ», данная операция является обратимой, или инволютивной: (x ⊕ y) ⊕ y = x {\displaystyle (x\oplus y)\oplus y=x} .

Также данная операция может называться «инверсией по маске», то есть у исходного двоичного числа инвертируются биты, которые совпадают с 1 в маске.

Другие побитовые логические операции [ | ]

В распространённых языках программирования встроенными средствами реализуются только четыре побитовые логические операции: И, ИЛИ, НЕ и исключающее ИЛИ . Для задания произвольной побитовой логической операции вполне достаточно перечисленных, и, более того, как следует из теории булевых функций, можно ограничиться ещё меньшим набором базовых операций. Есть также языки программирования, где существует встроенная возможность выполнить любую бинарную логическую операцию побитово. Например, в PL/I есть встроенная функция BOOL, третий аргумент которой предназначен для указания произвольной логической операции, которую необходимо побитово применить к первым двум аргументам .

Битовые сдвиги [ | ]

К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига. Различают несколько видов сдвигов - логический , арифметический и циклический , в зависимости от обработки крайних битов.

Также различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).

Логический сдвиг [ | ]

При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.

Арифметический сдвиг [ | ]

Арифметический сдвиг аналогичен логическому, но число считается знаковым, представленным в дополнительном е. Так, при правом сдвиге старший бит сохраняет своё значение. Левый арифметический сдвиг идентичен логическому.

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

Циклический сдвиг [ | ]

При циклическом сдвиге, значение последнего бита по направлению сдвига копируется в первый бит (и копируется в бит переноса).

Также различают циклический сдвиг через бит переноса - при нём первый бит по направлению сдвига получает значение из бита переноса, а значение последнего бита сдвигается в бит переноса.

В языках программирования [ | ]

В следующей таблице для некоторых языков программирования приведены встроенные операторы и функции, реализующие побитовые логические операции.

Язык НЕ И ИЛИ Искл. ИЛИ Сдвиг влево Сдвиг вправо Другие
/С++ , Java , , Ruby , Python ~ & | ^ << >>
Pascal not and or xor shl shr
Kotlin inv
PL/I INOT IAND IOR IEOR BOOL
¬ & | ¬
Prolog \ /\ \/

В теории сложности алгоритмов [ | ]

Термин битовая операция , часто используется в области вычислений так называемых быстрых алгоритмов , которые изучают алгоритмы вычисления заданной функции с заданной точностью с использованием как можно меньшего числа битовых операций.

Связь с другими науками [ | ]

Битовые операции и математическая логика [ | ]

Битовые операции очень близки (хотя и не тождественны) логическим связкам в классической логике . Бит можно рассматривать как логическое суждение - его значениями являются 1 «истина» и 0 «ложь». При такой интерпретации известные в логике связки конъюнкции , дизъюнкции , импликации , отрицания и другие имеют представление на языке битов. И наоборот, битовые операции легко описываются на языке исчисления высказываний .

Однако, связкам математической логики более соответствуют логические операции в том числе в программировании, нежели собственно битовые операции.

Обобщение операций на булеву алгебру [ | ]

Вместо одиночных битов мы можем рассмотреть векторы из фиксированного количества битов (в программировании их называют регистрами), например, байты . В программировании регистры рассматривают как двоичное разложение целого числа: b = b 0 + 2 b 1 + 2 2 b 2 + . . . + 2 N − 1 b N − 1 {\displaystyle b=b_{0}+2b_{1}+2^{2}b_{2}+...+2^{N-1}b_{N-1}} , где N - количество битов в регистре.

Тем не менее, ничто не мешает рассматривать эти регистры именно как битовые векторы и проводить булевые операции покомпонентно (бит номер k значения есть результат операции от битов номер k аргументов). Кстати, математически говоря, булевы операции распространяются таким образом на произвольную булеву алгебру . Таким образом мы получаем операции побитового И, ИЛИ, НЕ, искл. ИЛИ и т. д. Как арифметические, данные операции не обладают хорошими свойствами за исключением побитового НЕ, которое для чисел в дополнительном е совпадает с вычитанием из −1 (~x == -1-x). Однако, они очень полезны в программировании.

2-адическая интерпретация [ | ]

Целое число, записанное (в дополнительном е) в бесконечный (в сторону положительных степеней двойки) двоичный регистр является естественным объектом для теории p-адических чисел при p = 2 {\displaystyle p=2} . Множество целых 2-адических чисел (то есть произвольных бесконечных битовых последовательностей) может быть рассмотрено как булева алгебра точно так же как и множество значений битового регистра конечной длины. Все вышеперечисленные битовые операции оказываются непрерывными отображениями . Хотя практическое программирование не располагает регистрами бесконечной длины, это не мешает использовать данный теоретический факт в криптографии для создания быстродействующих алгоритмов шифрования.

Битовые операции как основа цифровой техники [ | ]

Битовые операции лежат в основе обработки цифровых сигналов . А именно, посредством них мы можем из одного или нескольких сигналов на входе получить новый сигнал, который в свою очередь может быть подан на вход одной или нескольким таким операциям. По сути, именно битовые операции в сочетании с запоминающими элементами (напр. триггерами) реализуют всё богатство возможностей современной цифровой техники.

Практические применения [ | ]

С точки зрения применения отдельная битовая операция мало интересна. Поэтому практическое применение основывается на способах комбинирования различных битовых операций, для реализации более сложного вычисления. Можно отметить два аспекта:

  1. увеличение размера регистров, в которых битовые операции выполняются не по одной, а сразу на множестве 8, 16, 32, 64 битах
  2. экспериментальные устройства, где обобщают битовые операции с двоичной системы, на троичные и прочие системы счисления (так например, разработана теория работы с четверичной системой (

Конъюнкция или логическое умножение (в теории множеств – это пересечение)

Конъюнкция является сложным логическим выражением, которое истинно в том и только том случае, когда оба простых выражения являются истинными. Такая ситуация возможно лишь в единственном случае, во всех остальных случаях конъюнкция ложна.

Обозначение: &, $\wedge$, $\cdot$.

Таблица истинности для конъюнкции

Рисунок 1.

Свойства конъюнкции:

  1. Если хотя бы одно из подвыражений конъюнкции ложно на некотором наборе значений переменных, то и вся конъюнкция будет ложной для этого набора значений.
  2. Если все выражения конъюнкции истинны на некотором наборе значений переменных, то и вся конъюнкция тоже будет истинна.
  3. Значение всей конъюнкции сложного выражения не зависит от порядка записи подвыражений, к которым она применяется (как в математике умножение).

Дизъюнкция или логическое сложение (в теории множеств это объединение)

Дизъюнкция является сложным логическим выражением, которое истинно практически всегда, за исключением, когда все выражения ложны.

Обозначение: +, $\vee$.

Таблица истинности для дизъюнкции

Рисунок 2.

Свойства дизъюнкции:

  1. Если хотя бы одно из подвыражений дизъюнкции истинно на некотором наборе значений переменных, то и вся дизъюнкция принимает истинное значение для данного набора подвыражений.
  2. Если все выражения из некоторого списка дизъюнкции ложны на некотором наборе значений переменных, то и вся дизъюнкция этих выражений тоже ложна.
  3. Значение всей дизъюнкции не зависит от порядка записи подвыражений (как в математике – сложение).

Отрицание, логическое отрицание или инверсия (в теории множеств это отрицание)

Отрицание - означает, что к исходному логическому выражению добавляется частица НЕ или слова НЕВЕРНО, ЧТО и в итоге получаем, что если исходное выражение истинно, то отрицание исходного – будет ложно и наоборот, если исходное выражение ложно, то его отрицание будет истинно.

Обозначения: не $A$, $\bar{A}$, $¬A$.

Таблица истинности для инверсии

Рисунок 3.

Свойства отрицания:

«Двойное отрицание» $¬¬A$ является следствием суждения $A$, то есть имеет место тавтология в формальной логике и равно самому значению в булевой логике.

Импликация или логическое следование

Импликация - это сложное логическое выражение, которое истинно во всех случаях, кроме как из истины следует ложь. То есть, данная логическая операция связывает два простых логических выражения, из которых первое является условием ($A$), а второе ($A$) является следствием условия ($A$).

Обозначения: $\to$, $\Rightarrow$.

Таблица истинности для импликации

Рисунок 4.

Свойства импликации:

  1. $A \to B = ¬A \vee B$.
  2. Импликация $A \to B$ ложна, если $A=1$ и $B=0$.
  3. Если $A=0$, то импликация $A \to B$ истинна при любом значении $B$, (из лжи может следовать истинна).

Эквивалентность или логическая равнозначность

Эквивалентность - это сложное логическое выражение, которое истинно на равных значениях переменных $A$ и $B$.

Обозначения: $\leftrightarrow$, $\Leftrightarrow$, $\equiv$.

Таблица истинности для эквивалентности

Рисунок 5.

Свойства эквивалентности:

  1. Эквивалентность истинна на равных наборах значений переменных $A$ и $B$.
  2. КНФ $A \equiv B = (\bar{A} \vee B) \cdot (A \cdot \bar{B})$
  3. ДНФ $A \equiv B = \bar{A} \cdot \bar{B} \vee A \cdot B$

Строгая дизъюнкция или сложение по модулю 2 (в теории множеств это объединение двух множеств без их пересечения)

Строгая дизъюнкция истинна, если значения аргументов не равны.

Для электроники это означает, что реализация схем возможна с использованием одного типового элемента (правда это дорогостоящий элемент).

Порядок выполнения логических операций в сложном логическом выражении

  1. Инверсия(отрицание);
  2. Конъюнкция (логическое умножение);
  3. Дизъюнкция и строгая дизъюнкция (логическое сложение);
  4. Импликация (следствие);
  5. Эквивалентность (тождество).

Для того чтобы изменить указанный порядок выполнения логических операций, необходимо использовать скобки.

Общие свойства

Для набора из $n$ логических переменных существует ровно $2^n$ различных значений. Таблица истинности для логического выражения от $n$ переменных содержит $n+1$ столбец и $2^n$ строк.

Создавая объект в сцене, необходимо учитывать особенности его геометрии. Несмотря на то что один и тот же трехмерный объект всегда можно смоделировать несколькими способами, как правило, существует один, который является наиболее быстрым и удобным.

Опытный аниматор с первого взгляда на эскиз будущей модели определяет способ моделирования объекта, однако начинающему пользователю это не всегда под силу.

Одним из наиболее удобных и быстрых способов моделирования является создание трехмерных объектов при помощи булевых операций.

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

Модели, создаваемые в трехмерной графике, можно условно разделить на две группы - органические и неорганические. К первой категории относятся объекты живой природы, такие как растения, животные, люди, ко второй - элементы архитектуры, а также предметы, созданные человеком (автомобили, техника и др.).

Разница подходов к моделированию объектов первой и второй группы столь велика, что в зависимости от конкретных задач для реализации проекта могут использоваться различные пакеты для работы с трехмерной графикой.

Поскольку в 3ds max основной акцент делается на моделирование неорганических объектов, то есть архитектурную визуализацию и разработку компьютерных игр, то булевыe операции - это незаменимый инструмент для каждого пользователя 3ds max.

С другой стороны, они совсем не подходят для создания большинства органических объектов. Например, смоделировать лицо человека при помощи булевых операций практически невозможно.

Рассмотрим булевыe операции. На рис. 3.51 представлено исходное изображение. В 3ds max 7 доступны четыре типа булевых операций.

  • Union (Сложение). Результатом булевого сложения двух объектов будет служить поверхность, образованная поверхностями объектов, участвующих в данной операции (рис. 3.52).
  • Intersection (Пересечение). Результатом булевого пересечения двух объектов будет поверхность, состоящая из общих участков этих объектов (рис. 3.53).
  • Subtraction (Исключение). Результатом булевого исключения двух объектов будет поверхность, состоящая из поверхностей первого и второго объектов, но не включающая в себя общие участки этих объектов (рис. 3.54).

Рис. 3.51. Расположение объектов перед выполнением булевых операций

Рис. 3.52. Объекты после выполнения булевой операции Union (Сложение)

Рис. 3.53. Объекты после выполнения булевой операции Intersection (Пересечение)

Рис. 3.54. Объекты после выполнения булевой операции Subtraction (Исключение)

  • Cut (Вычитание). Результатом булевого вычитания двух объектов будет служить поверхность, образованная исключением из поверхности одного объекта участков, занятых вторым объектом (рис. 3.55).

Рис. 3.55. Объекты после выполнения булевой операции Cut (Вычитание)

Булевы операции выполняются следующим образом.

1. Выделите первый объект, который будет участвовать в образовании конечной модели.

2. Перейдите на вкладку Create (Создание) командной панели, выберите в категории Geometry (Геометрия) строку Compound Objects (Составные объекты) и нажмите кнопку Boolean (Булева операция) (рис. 3.56).

3. Установите параметры булевой операции.

4. Воспользуйтесь кнопкой Pick Operand В (Выбрать операнд), чтобы выбрать второй объект, который будет участвовать в операции.

Рис. 3.56. Настройки объекта Boolean (Булева операция)

ПРИМЕЧАНИЕ

Несмотря на то что булевыe операции 3ds max 7 широко применяются при создании трехмерных проектов, они имеют ряд недостатков, и построение оболочки результирующей модели нередко происходит с ошибками. По этой причине многие разработчики трехмерной графики используют в своих проектах дополнительный модуль Power Booleans . Он позволяет создавать модели с более точной геометрией, чем те, которые можно получить, используя стандартные средства, а также быстрее строит полигональную сетку. Это особенно заметно при работе с объектами, имеющими большое количество полигонов.

Моделирование с использованием булевых операций подробно рассмотрено в разд. «Урок 6. Моделирование винта».

Похожие публикации