Автор: Пользователь скрыл имя, 20 Октября 2012 в 17:46, лекция
Передача данных стала фундаментальной частью вычислений. Сети, разбросанные по всему миру, собирают данные о таких разных предметах, как атмосферные условия, производство продуктов и воздушных перевозках. Группы создают электронные справочные списки, которые позволяют им получать информацию, интересную всем. Любители обмениваются программами для их домашних компьютеров. В научном мире сети данных стали необходимы, так как они позволяют ученым посылать программы и данные на удаленные суперкомпьютеры для обработки, получать результаты и обмениваться научной информацией с коллегами.
Открывая окно-потомок, мы поместили в переменную id указатель на объект окно id=window.open(). Теперь мы можем использовать ее как идентификатор объекта класса Window. Использование id.focus() в нашем случае обязательно. При нажатии на кнопку "Изменить поле статуса в окне примера" происходит передача фокуса в родительское окно. Оно может иметь размер экрана. При этом изменения будут происходить в окне-потомке, которое будет скрыто родительским окном. Для того чтобы увидеть изменения, надо передать фокус. Переменная id должна быть определена за пределами каких-либо функций, что и сделано. В этом случае она становится свойством окна. Если мы поместим ее внутри функции открытия дочернего окна, то не сможем к ней обратиться из обработчика события click.
Условная генерация HTML-разметки на стороне браузера
Всегда приятно получать с сервера страницу, подстроенную под возможности нашего браузера или, более того, под пользователя. Существует только две возможности генерации таких страниц: на стороне сервера или непосредственно у клиента. JavaScript-код исполняется на стороне клиента (на самом деле, серверы компании Netscape способны исполнять JavaScript-код и на стороне сервера, только в этом случае он носит название LiveWire-код; не путать с LiveConnect), поэтому рассмотрим только генерацию на стороне клиента.
Для генерации HTML-разметки контейнер SCRIPT размещают в теле документа. Простой пример — встраивание в страницу локального времени:
<BODY>
...
<SCRIPT>
d = new Date();
document.write("<BR>");
document.write("Момент загрузки страницы:
"+d.getHours()+":"+d.
document.write("<BR>");
</SCRIPT>
...
<BODY>
PERL
Тема 9 Средства программирования специального назначения.
VRML
Язык VRML (Virtual Realty Modelling Languagy) предназначен для описания трехмерных изображений и оперирует объектами, описывающими геометрические фигуры и их расположение в пространстве.
Vrml-файл представляет собой обычный текстовый файл, интерпретируемый браузером. Поскольку большинство браузеров не имеет встроенных средств поддержки vrml, для просмотра Vrml-документов необходимо подключить вспомогательную программу - Vrml-браузер, например, Live3D.
Как и в случае с HTML, один и тот же vrml-документ может выглядеть по-разному в разных VRML-браузерах. Кроме того, многие разработчики VRML-браузеров добавляют нестандартные расширения VRML в свой браузер.
Существует немало VRML-редакторов, делающих удобней и быстрее процесс создания Vrml-документов, однако несложные модели, рассматриваемые в данной статье, можно создать при помощи самого простого текстового редактора.
В VRML приняты следующие единицы измерения:
Как уже говорилось, Vrml-документ представляет собой обычный тестовый файл.
Для того, чтобы VRML-браузер распознал файл с VRML-кодом, в начале файла ставится специальный заголовок - file header:
#VRML V1.0 ascii
Такой заголовок обязательно должен находиться в первой строке файла, кроме того, перед знаком диеза не должно быть пробелов.
В VRML определены четыре базовые фигуры: куб (верней не куб, а прямоугольный параллепипед), сфера, цилиндр и конус.
Эти фигуры называются примитивами (primitives). Набор примитивов невелик, однако комбинируя их, можно строить достаточно сложные трехмерные изображения. Например, вот такие:
Рассмотрим подробней каждый из примитивов.
Куб
Возможные параметры: width - ширина, height - высота, depth - глубина.
Cube {
width 2 # ширина
height 3 # высота
depth 1 # глубина
}
Сфера
Параметр у сферы только один, это radius.
Sphere {
radius 1 # радиус
}
Конус
Возможные параметры: bottomRadius - радиус основания, height - высота, parts - определяет, какие части конуса будут видны. Параметр parts может принимать значения ALL, SIDES или BOTTOM.
Cone {
parts ALL #видны и основание, и боковая поверхность конуса
bottomRadius 1 #радиус основания
height 2 #высота
}
Цилиндр
Для цилиндра можно задать параметры radius и height. Кроме того, с помощью параметра parts для цилиндра можно определить будут ли отображаться основания цилиндра и его боковая поверхность. Параметр parts может принимать значения ALL, SIDES, BOTTOM или TOP.
Cylinder {
parts ALL #видны все части цилиндра
radius 1 #радиус основания
height 2 #высота цилиндра
}
Цвет фигуры, определяется с помощью объекта Material.
Material {
ambientColor 0.2 0.2 0.2
diffuseColor 0.8 0.8 0.8
specularColor 0 0 0
emissiveColor 0 0 0
transparency 0
}
Параметры ambientColor, diffuseColor, specularColor и emissiveColor управляют цветами и указываются в палитре RGB (красный, зеленый и голубой), причем первая цифра определяет интенсивность красного цвета, вторая - зеленого, а третья - синего.
К примеру, синий кубик, может быть описан следующим образом:
#VRML V1.0 ascii
Material {
diffuseColor 0 0 1
}
Cube {}
Параметр transparency может принимать значения от 0 до1 и определяет степень прозрачности, причем максимальная прозрачность достигается при transparency равном единице. В приведенном примере описано два цилиндра разных размеров, меньший из которых просвечивает сквозь другой.
#VRML V1.0 ascii
Material {
diffuseColor 0 0 1
transparency 0.7
}
Cylinder {
height 1
radius 1
}
Material {
emissiveColor 1 0 0
transparency 0
}
Cylinder {
height 0.8
radius 0.1
}
Для имитирования различных поверхностей в VRML существует объект Texture2.
В качестве текстуры легче всего использовать обычный графический файл, например, в GIF-формате. В таком случае для "натягивания" текстуры на трехмерное изображение нужно только указать путь к файлу в параметре filename объекта Texture2.
#VRML V1.0 ascii
Texture2 {
filename "krp.gif"
image 0 0 0
wrapS REPEAT
wrapT REPEAT
}
Cube {
width 1
height 1
depth 1
}
Параметры wrapS и wrapT могут принимать значения REPEAT или CLAMP, и управляют натягиванием текстуры по соответственно горизонтальной и вертикальной осям.
Изменение координат
По умолчанию любой описанный нами объект будет располагаться точно по центру окна браузера. По этой причине, если мы опишем к примеру два одинаковых цилиндра, они сольются друг с другом. Для того, чтобы изменить положение второго цилиндра, применим узел Translation.
Узел Translation определяет координаты объекта:
Translation {
translation 1 2 3 #т.е. соответственно x=1 y=2 z=3
}
Вообще говоря, координаты указываемые в Translation не являются абсолютными. Фактически это координаты относительно предыдущего узла Translation. Чтобы прояснить это вопрос, рассмотрим пример:
#VRML V1.0 ascii
Cube {
width 1
height 1
depth 1
}
# Этот куб по умолчанию располагается в центре
Translation {
translation 2 0 0
}
#Второй куб сдвинут вправо на 2
Cube {
width 1
height 1
depth 1
}
Translation {
translation 2 0 0
}
#Третий куб сдвинут вправо на два относительно 2-го
Cube {
width 1
height 1
depth 1
}
Как видите, третий кубик вовсе не совпадает с первым, хотя в в узле Translation указаны те же координаты.
В VRML 1.0 принято следующее правило: узлы, модифицирующие свойства фигур (Translation, Material и т.п.), действуют на все далее описанные фигуры.
Чтобы ограничить область действия модифицирующих узлов, фигуры необходимо сгруппировать с помощью узла Separator.
Separator {
другие узлы
}
Узел Separator работает как контейнер, он может содержать любые другие узлы, и основным его предназначением является именно ограничение области действия узлов типа Translation и Material.
Сравните следующий пример с предыдущим:
#VRML V1.0 ascii
Separator {
Cube {
width 1
height 1
depth 1
}
}# конец области действия узла Separator
Separator {
Translation {
translation 2 0 0
}
#Второй куб сдвинут вправо на 2
Cube {
width 1
height 1
depth 1
}
}# конец области действия узла Separator
Separator {
Translation {
translation 2 0 0
}
#Третий куб
сдвинут вправо на два
Cube {
width 1
height 1
depth 1
}
}# конец области действия узла Separator
Хотя в примере описано три кубика, мы видим только два, так как второй и третий совпадают.
Рекомендуется всегда и везде использовать узел Separator. Он не только избавит от ошибок, связанных с относительностью координат, но и сделает VRML-код более простым и понятным.
Вращение
Для вращения фигур вокруг осей координат применяется узел Rotation.
Rotation {
rotation 0 1 0 1.57
}
Первые три цифры определяют - будет ли осуществлен поворот вокруг соответственно осей x, y и z, а четвертая задает угол вращения в радианах. В приведенном выше листинге поворот осуществляется вокруг оси y на 90 градусов.
Углы в градусах |
Радианы |
30 |
0.52 |
45 |
0.78 |
60 |
1.04 |
90 |
1.57 |
180 |
3.14 |
270 |
4.71 |
Составим букву T из двух цилиндров. По умолчанию цилиндр ориентирован вертикально (см. рисунок). Поэтому для успешного выполнения задачи повернем его вокруг оси z на 90 градусов.
#VRML V1.0 ascii
Separator { #Красный цилиндр
Material { emissiveColor 1 0.6 0.6 }
Cylinder {
height 1
radius 0.3
}
}
Separator { # Синий цилиндр, повернутый на 90 градусов вокруг оси z
Translation {
translation 0 0.5 0
}
Rotation {
rotation 0 0 1 1.57
}
Material { emissiveColor 0.5 0.5 1 }
Cylinder {
height 1
radius 0.3
}
}
Масштабирование
Узел Scale масштабирует фигуры по одному или нескольким измерениям. Три цифры, стоящие после параметра scaleFactor определяют коэффициенты масштабирования относительно осей x,y и z.
Scale {
scaleFactor 1 1 1
}
В следующем примере, узел Scale сжимает сферу по оси x, и из сферы получается эллипсоид.
#VRML V1.0 ascii
Material { emissiveColor 1 1 0 }
Scale {
scaleFactor 0.7 1 1 #сжимаем сферу по оси x
}
Sphere { radius 1}
}
VRML предоставляет прекрасную
возможность сократить и
Объект описывается одним из способов:
DEF name
Cube {}
или
DEF name
Material {}
или
DEF name
Separator {
Сгруппированные узлы, описывающие фигуру и свойства материала
}
Для того, чтобы вставить в VRML-файл ранее определенную фигуру, используется команда USE
Separator {
USE name
}
Создадим VRML-файл, описывающий стул, при этом ножку стула опишем как объект LEG:
#VRML V1.0 ascii
Material { emissiveColor 1 0.5 0.5 }
Separator {
Translation { translation 1 1 1 }
DEF LEG #Определяем объект - ножку стула
Separator { # leg
Cylinder {
height 0.8
radius 0.1
}
} # определили ножку
}
Separator {
Translation { translation 0 1 1 }
USE LEG # используем определенный объект
}
Separator { # еще одна ножка
Translation { translation 1 1 0 }
USE LEG
}
Separator { # последняя ножка
Translation { translation 0 1 0 }
USE LEG
}
Separator { # сиденье
Translation { translation 0.49 1.5 0.5 }
Cube {
height 0.2
width 1.2
depth 1.2
}
}
Separator { # спинка
Translation { translation 0.49 2 0 }
Cube {
height 0.8
width 1.2
depth 0.2
}
}
Separator { # закругление спинки
Translation { translation 0.49 2.1 0 }
Rotation {
rotation 1 0 0 1.57
}
Cylinder {
radius 0.6
height 0.2
}
}
Как видите, нам не понадобилось описывать каждую ножку в отдельности - в результате объем VRML-кода стал меньше, а сам код более читабельным.
Еще один способ уменьшить размер VRML-файла - вставлять фигуры из другого файла.
Это позволяет делать узел WWWInline:
#VRML V1.0 ascii
Separator {
WWWInline {
name ""
bboxSize 0 0 0
bboxCenter 0 0 0
}
}
Параметр name - это путь к файлу, параметры bboxSize и bboxCenter не обязательны и показывают пользователю размеры и положение вставляемого объекта, пока объект подгружается.
PHP версии 3.0 - язык описания сценариев, выполняемых на сервере, встроенный в HTML.