Читайте также:
|
|
Одним из главных преимуществ, предоставляемых определением структуры, является возможность создавать функции, локальные внутри структуры. Их еще называют методами и в отличие от функций, локальных внутри других функций, методы можно вызывать вне определения структуры. Например, структуру, описывающую модель атома, можно дополнить функцией по созданию сфер, имитирующих ядро и электроны.
struct atom
(nuclear,
electrons = #(),
fn CreateSpheres ElectronsCounter:1 =
(nuclear = sphere radius:1.0
for i = 1 to ElectronsCounter do
(electrons[i] = sphere radius:0.1
electrons[i].position.x = nuclear.position.x + 2.0;
)
)
)
Методы, как и свойства, при определении отделяются друг от друга и от свойств запятой. После такого определения создать атом гелия, у которого два электрона, можно так
He = atom ()
He.CreateSpheres ElectronCounters:2
Данный скрипт сам создаст большую сферу, имитирующую ядро и две маленьких, изображающих электроны. Если надо создать сцену, в которой участвуют десятки или сотни атомов, то выигрыш от такого подхода очевиден. Разумеется, пример далек не только от совершенства, но и от реальности. Надо было бы создать сферы электронов как минимум в разных местах. Можно было задать плоскости и направление вращения электронов вокруг ядра и отобразить еще массу фактов из теории атома. Но данный пример призван только проиллюстрировать тот факт, что Вы можете разработать и включить в структуру ряд функций-методов, облегчающих Вашу дальнейшую работу с созданными объектами.
Базовые классы MAXScript
Класс Value
MAXScript не является, в полном смысле слова, языком объектно-ориентированного программирования. Например, в нем нельзя создать тип данных, наследующий свойства другого типа, тоже созданного пользователем. Тем не менее, стандартные типы данных образуют иерархическую структуру, причем дочерние классы наследуют свойства и методы родительских. Родительским для всех типов данных, даже структур, определенных пользователем, является класс value. Этот класс является абстрактным, то есть объект этого класса нельзя создать, поскольку он не содержит данных. В дальнейшем, при описании поддерживаемых MAXScript типов данных, для каждого из них будут описаны литералы, конструкторы (способы создания объектов), операторы, свойства и методы. Везде, где по тексту программы могут стоять выражения, возвращающие значения какого либо типа, будет написано название этого типа. Например, если написано
Углы_Эйлера_1 + Углы_Эйлера_2
то это значит, что оператор сложения может быть применен к углам Эйлера.
Value
Класс value – абстрактный и, следовательно, литералов и конструкторов иметь не может.
Операторы
Для всех типов данных, как для наследующих классу value определены следующие операторы
Сравнения, равенство
Value = = Value
и неравенство
Value!= Value
Преобразования типа
Value as Имя_класса
Например
3.14 as string
преобразует значение типа float в символьную строку. Следует отметить, однако, что каждый тип данных можно преобразовать не в каждый тип, но в символьную строку можно преобразовать каждое выражение. Что же касается других возможных вариантов, то они будут рассматриваться далее в описании для каждого типа.
Методы
Функция вывода print может иметь три параметра, два последних – необязательны
print Value to: Поток #noMap
Поток – класс, который будет рассмотрен позднее. Если он не указан, то вывод осуществляется в окно интерпретатора. Если параметр #noMap не задан, то при выводе, например массивов, каждый элемент будет выводиться на новой строке. В противном случае все значения будут выводиться в одну строку.
Другая функция предназначена для более гибкой организации вывода
format Символьная_строка value to: Поток
Поток – как и для print параметр необязательный. Value – список выводимых значений. В этом одно из главных отличий format от print. Format может выводить неограниченное количество значений, в то время как print только одно. Символьная строка определяет формат вывода. Символ процента “%”в этой строке означает, что именно в этой позиции будет выведено очередное значение из списка. Например, в результате выполнения такого скрипта
x = 2; y = 5
format “x = %, y = %” x y
в окно интерпретатора будет выведена такая строка
x = 2, y = 5
Функция format не добавляет автоматически к концу выводимой строки символ перехода на новую строку. Если Вам это необходимо, включайте в строку формата сочетание символов “\n”.
Имеются так же методы для определения или проверки класса объекта.
Функция
classOf Value
возвращает имя класса указанного объекта. Например, в результате выполнения скрипта
S = sphere()
classOf S
будет выведена строка
sphere
Можно получить имя родительского класса объекта с помощью функции
superclassOf Value
Функция
isKindOf Value Имя_класса
возвращает true, если заданное значение принадлежит указанному классу или классу – потомку указанного. В противном случае результат будет false. Например, продолжив пример со сферой S, напишем
isKindOf S sphere
Эта строка вернет true. Строка
isKindOf S GeometryClass
так же вернет true, а вот
isKindOf S Box
уже false. Функция
isStructDef Value
возвращает true, если указанное значение – определение структуры. Рассмотрим пример
t = struct TestStruct (a, b)
v = TestStruct 1 2
После такого определения скрипт
isStructDef t
вернет true,
isStructDef TestStruct
так же true, а
isStructDef v
вернет false. Чтобы определить, что переменная является структурой, существует другая функция
isStruct Value
Продолжим пример со структурой TestStruct. Скрипт
isStruct v
вернет true.
Чтобы определить, что переменная содержит контроллер, а о контроллерах речь впереди, применяется функция
isController Value
которая возвращает true, если указанное значение – контроллер, и false в противном случае.
Число
Число в MAXScript может быть целым и вещественным. Оба этих типа поддерживают одни и те же операции и методы.
Литералы
Числовые константы записываются в тексте программы следующим образом. Целое число чаще всего записывается в обычном, десятичном представлении. Например
-80
Шестнадцатеричная форма записи целого числа должна начинаться с символов 0x (ноль и икс)
0x0FF
0x2ACD
Вещественное число записывается так же достаточно стандартно
54.321
-0.0077
Допускается и экспоненциальная форма записи
4.2e-6
Если целая часть числа равна нулю, ее можно не записывать
-.123
.56
Операторы
К числам применяются стандартные математические операции
Число + Число
Число - Число
Число / Число
Число * Число
Если оба числа целые, то результат так же будет целым. Если хотя бы один из операндов – вещественное число, то результатом будет вещественное число.
Возведение в степень записывается так
Число ^ Число
Если первый операнд – целое число, то результат будет целым, независимо от показателя степени.
Унарный минус обращает знак числа
- Число
Для чисел определены все возможные операции сравнения
Число = = Число
Число! = Число
Число > Число
Число < Число
Число >= Число
Число <= Число
С помощью операции преобразования типа можно перевести число из целого в вещественное. При преобразовании вещественного в целое, дробная часть отбрасывается, а не округляется. Оба типа числа можно перевести во время. В этом случае число означает количество фреймов. Так же числа можно перевести в символьную строку. Вот примеры преобразования типов
23 as float
125.89 as integer
64 as time
17.3e-5 as string
Методы
Набор методов для работы с числами весьма богат и включает в себя, главным образом стандартные математические функции
Копирование числа
copy Число
Создает копию указанного числа. Самостоятельно практически не применяется. Неявно используется при копировании массивов.
Абсолютное значение числа
abs Число
Остаток от деления
mod Число_1 Число_2
возвращает остаток от деления первого числа на второе. Результат – всегда вещественное число.
Округление по избытку
ceil Число
возвращает вещественное число с нулевой дробной частью, большее или равное указанному.
Округление по недостатку
floor Число
возвращает вещественное число с нулевой дробной частью, меньшее или равное указанному.
Стандартные тригонометрические функции
sin Число – синус
cos Число – косинус
tan Число – тангенс
asin Число – арксинус
acos Число – арккосинус
atan Число – арктангенс
atan2 Число_1 Число_2 – арктангенс первого числа, поделенного на второе
sinh Число – синус гиперболический
cosh Число – косинус гиперболический
tanh Число – тангенс гиперболический
Углы всегда задаются в градусах, возвращаемый результат – вещественное число.
Стандартные трансцендентные функции
exp Число – экспонента
log Число – натуральный логарифм
log10 Число – десятичный логарифм
pow Число_1 Число_2 – возводит первое число в степень, показатель которой – второе число. Отличается от стандартной операции возведения в степень тем, что даже если основание будет целым числом, результат окажется вещественным
sqrt Число – квадратный корень из числа
Все функции, разумеется, возвращают вещественный результат.
Генератор случайных чисел
random Число_1 Число_2
возвращает случайное число в диапазоне от первого до второго числа.
Реинициализация генератора случайных чисел
seed Число
Устанавливает генератор случайных чисел в некоторое состояние, определяемое указанным числом. Если Вам надо несколько раз повторить одну и ту же серию случайных чисел, то перед каждой генерацией вызывайте эту функцию с одним и тем же числом.
Перевод радиан в градусы
radToDeg Число
и обратно
degToRad Число
результат всегда вещественный.
Имеется богатый набор функций для работы с битами целых чисел.
bit.and Целое_число_1 Целое_число_1
выполняет побитовое логическое и над двумя целыми числами.
bit.or Целое_число_1 Целое_число_1
выполняет побитовое логическое или над двумя целыми числами.
bit.xor Целое_число_1 Целое_число_1
выполняет побитовое логическое исключающее или над двумя целыми числами.
bit.not Целое_число
обращает биты целого числа.
bit.shift Целое_число_1 Целое_число_2
Сдвигает биты первого число на количество разрядов, заданное вторым числом. Положительное второе число соответствует сдвигу влево, отрицательное – вправо. Знаковый бит при сдвиге не распространяется.
bit.set Целое_число_1 Целое_число_2 Логическое значение
Устанавливает значение бита первого числа, номер которого задан вторым числом в ноль, если логическое значение – false, и в единицу если true. Младший бит считается первым, а не нулевым.
bit.flip Целое_число_1 Целое_число_2
Обращает значение бита первого числа, номер которого задан вторым. Младший бит считается первым.
bit.get Целое_число_1 Целое_число_2
Возвращает true, если бит первого числа, номер которого задан вторым числом, имеет значение 1, и false в противном случае. Младший бит считается первым.
bit.intAsChar Целое_число
Возвращает символьную строку из одного символа, код которого задан указанным числом. Учитывается только младшие 8 бит числа (для локализованных версий 3ds max – 16 бит)
bit.charAsInt Символьная_строка
Возвращает код первого символа строки.
bit.intAsHex Целое_число
Возвращает символьную строку, представляющую указанное число в шестнадцатеричном виде.
Минимально возможное целое число – -2147483648, максимально возможное – 2147483648. При выходе за эти значения будет сгенерирована ошибка. Вещественные числа в MAXScript находятся в диапазоне от 1.18E-38 до 3.4E38. При получении меньшего результата получится ноль, при получении большего – специальное значение 1.#INF (бесконечность). Сложение, вычитание или умножение любого числа на бесконечность даст бесконечность. Деление числа на бесконечность даст ноль. Деление нуля на ноль, бесконечности на бесконечность или умножение бесконечности на ноль или на бесконечность возвращает специальное значение -1.#IND (неопределенность). Любые действия числа с неопределенностью дают неопределенность.
Дата добавления: 2015-10-31; просмотров: 154 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Операторы цикла do и while | | | Символьные строки |