Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Создание функций, локальных внутри структуры

Читайте также:
  1. Gt;■ < ' ol" '. 5 ■* создание ряда
  2. I. Выявление неудовлетворительной структуры баланса согласно ФЗ «О несостоятельности (банкротстве)» (Кириллова: для выявления признаков банкротства у государственных предприятий).
  3. II. Создание глоссария по теме занятия
  4. IV Создание ковровой дорожки
  5. А. Создание и заполнение базы данных
  6. Анализ влияния структуры перевозок на доходы
  7. Анализ динамики и структуры эксплуатационных расходов

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

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| Символьные строки

mybiblioteka.su - 2015-2024 год. (0.022 сек.)