XXI краевая научно-практическая
конференция школьников
Секция:
информатика
Тема:
«Компьютерная модель наноструктуры
фуллерена»
Автор
работы: Панькин Артем Витальевич Место
выполнения работы: г. Невинномысск, МОУ СОШ №12,
11 класс. Научные
руководители: Бурьяница
Ольга Павловна, учитель
физики МОУ СОШ №12 Татаринова
Елена Михайловна, учитель
информатики МОУ СОШ №12
Невинномысск,
2010
Оглавление……………………………………………………….………………………стр.
Введение
…………………………………………………………….…….………..3
Глава 1. Что такое
нанотехнология?................................................. .....................4
1.1. Краткая хронология достижений в
области нанотехнологий………………4
1.2. Классификация
нанообъектов……………………………………………...…4
1.3. Фуллерены………………………………………………………………..…….5
1.4. Методы получения и разделения
фуллеренов………………………………..6
1.5. Применение
фуллеренов ……………………………………………………...6
Глава
2. Создание модели фуллерена ……………………………………..………8
Выводы…………………………………………………………………….………...8
Заключение………………………………………………………………………….9
Литература………………………………………………………………………….10
Приложение
1………………………………………………………………………11
Приложение
2………………………………………………………………………12
Приложение
3………………………………………………………………………13
Приложение
4………………………………………………………………………14
Введение
Наступил XXI век и
всех, естественно, волнуют вопросы о будущем, о развитии науки и техники в
наступающем столетии. Станут ли реальностью фантастические проекты в
информационных технологиях, т. е. войдут ли в нашу жизнь крошечные компьютеры с
поразительным быстродействием и огромным объемом памяти, способные мгновенно
записать, обработать и переслать в цифровой форме информацию любого вида? Будут
ли созданы «личные» микрочипы, на которых будут записаны не только все данные о
владельце, но и даже весь его генетический код? Можно ли надеяться, что
промышленность начнет выпускать экологически безопасные автомобили, в выхлопных
газах которых не будут содержаться вредные вещества? Осуществится ли, наконец,
мечта человечества о жизни «в гармонии» с природой?
Ответы на эти вопросы
раньше можно было искать только в научно-фантастических романах, в последние
годы наука и техника подошли к важному
рубежу, преодоление которого может значительно изменить мир. Речь идет о
развитии нанонауки и нанотехнологии.
Нанотехнологию
довольно трудно определить точно, поскольку она возникла в течение последних
десятков лет, в результате развития и слияния ряда научных направлений в физике
и химии 20-го века (Приложение 1, схема 1). Можно не сомневаться, что в 21 веке
нанотехнология будет оказывать все более возрастающее воздействие на
экономическую и социальную жизнь всего человечества, что требует от стран
принятия энергичных мер для развития исследований в этой области. Развитие
нанотехнологии не сводится лишь к получению конкретных научных результатов или
внедрению новых технологий, оно включает в себя решение многих побочных
экономических и социальных задач, т. е. требует целостного, системного подхода.
Под термином
«нанотехнология» понимают создание и использование материалов, устройств и
систем, структура которых реализуется в нанометровом масштабе, т. е. в
диапазоне размеров атомов, молекул и надмолекулярных образований.
Нанотехнология подразумевает умение работать с такими объектами и создавать из
них более крупные структуры, обладающие принципиально новой молекулярной
организацией. Они являются искусственными образованиями и характеризуются
новыми физическими, химическими и биологическими свойствами, создавая новые
возможности технологических приемов, связанных с электроникой, материаловедением,
химией, механикой и многими другими областями науки. Получение новых материалов
и развитие новых методик обещает
произвести настоящую
научно-технологическую революцию в информационных технологиях,
производстве конструкционных материалов, изготовлении фармацевтических
препаратов, конструировании сверхточных устройств и т. д.
Цель: создание компьютерной
модели наноструктуры фуллерена.
Объект: исследование строения и
свойств фуллерена.
Предмет: выяснение характерных
особенностей в строении для объяснения свойств
формы углерода – фуллерена.
Задачи:
Методы исследования:
Глава 1. Что такое
нанотехнология?
1.1. Краткая хронология
достижений в области нанотехнологий
1928 г - Предложена
принципиальная схема устройства сканирующего оптического микроскопа ближнего
поля.
1938 г. - Создание первого
сканирующего электронного микроскопа
1959 г. - Ричард Ф. Фейнман (США)
выдвинул идею создания веществ и объектов методом поштучной «атомарной» сборки.
1972 г. - Создано реальное
устройство, работающее по принципу микроскопа ближнего поля.
1981 г. - Создание сканирующего
туннельного микроскопа (СТМ).
1985 г. - Создание первого
полевого транзистора с высокой подвижностью носителей (НЕМТ). Химики
синтезировали первые фуллерены.
1986 г. - Создание
атомно-силового микроскопа (АСМ).
1991 г. - Получены первые
углеродные нанотрубки.
1998 г. - Изготовлен элемент
памяти электронного запоминающего устройства (с объемом памяти 128 мегабит),
работающий при комнатной температуре
1.2. Классификация нанообъектов
При уменьшении
размеров образца от больших (макроскопических) значений, например, метра или
сантиметра, до очень маленьких свойства образца сначала остаются неизменными,
затем меняются и при размерах менее 100 нм могут измениться радикально. Если
размеры образца в одном измерении лежат в нанометровом диапазоне, а в двух
других остаются большими, то такая структура называется квантовой ямой. Это —
двумерный нанообъект. К ним относятся тонкие пленки, адсорбционные моно- и
полислои на поверхности раздела фаз и др.
Если образец мал в
двух измерениях и имеет большие размеры в третьем, то такой объект называют
квантовой проволокой. Это — одномерный нанообъект. К одномерным относятся тонкие волокна, очень тонкие
капилляры и поры, квантовые проволоки, нанотрубки и др.
Если размеры во всех
трех измерениях лежат в нижней части нанометрового диапазона, то образец
называется квантовой точкой, наночастицей или кластером. Это — нульмерные
объекты. К этому типу нанообъектов относятся наночастицы различных твердых тел,
коллоидные растворы (золи), микроэмульсии, капли различных жидкостей, газовые
пузырьки и др.
Эпитет «квантовый» в
названиях этих трех типов наноструктур используют потому, что в области
ультрамалых масштабов проявляются свойства квантовомеханической природы.
1.3.
Фуллерены
Еще совсем недавно
считали, что углерод может существовать лишь в трёх формах — в виде графита, в
виде карбина, и в виде алмаза. В 1985 году была открыта ранее неизвестная форма
углерода — фуллерены. Молекула фуллерена С60 представляет собой замкнутую
сферу, составленную из правильных пятиугольников и шестиугольников с атомами
углерода в вершинах (Приложение 1, рис. 1).
Происхождение термина
фуллерен связано с именем американского архитектора Фуллера, который применял такие структуры при
конструировании куполообразных зданий еще в конце XIX и начале XX веков.
Подобная структура
углерода имеет закрытую электронную оболочку и действительно обладает высокой
энергетической стабильностью.
Создание к 1990 году
эффективной технологии синтеза, выделения и очистки фуллеренов в конечном итоге
привело и к открытию многих необычных свойств фуллеренов. Электрические,
оптические и механические свойства фуллеренов в конденсированном состоянии
указывают как на большое разнообразие физических явлений, происходящих при
участии фуллеренов, так и на значительные перспективы использования этих
материалов в электронике, оптоэлектронике и других областях техники.
1.4. Методы получения и
разделения фуллеренов
Наиболее эффективный
способ получения фуллеренов основан на термическом разложении графита. При
умеренном нагревании графита разрывается связь между отдельными слоями
графита, но не происходит разложения испаряемого материала на отдельные атомы.
При этом испаряемый слой состоит из отдельных фрагментов, из которых и происходит
построение молекулы С60 и других фуллеренов. Чаще всего для получения
фуллеренов применяется дуговой разряд с графитовыми электродами в гелиевой
атмосфере. Основная роль гелия заключается в охлаждении фрагментов, имеющих
высокую степень колебательного возбуждения, что препятствует их объединению в
стабильные структуры. Оптимальное давление гелия находится в диапазоне (~ 1,4
... 2,8) • 105 Па.
Основа метода проста:
между двумя графитовыми электродами зажигается электрическая дуга, в которой
испаряется анод. На стенках реактора и на катоде осаждается сажа, содержащая от
1 до 40% (в зависимости от геометрических и технологических параметров)
фуллеренов. Для экстракции фуллеренов из фуллереносодержащей сажи, сепарации и
очистки используются жидкостная экстракция и колоночная хроматография.
1.5. Применение фуллеренов
С химической
устойчивостью и пустотелостью фуллеренов связаны возможности их применения в
химии, микробиологии и медицине. Например, их можно использовать для упаковки и
доставки в требуемое место не только атомов, но и целых молекул, в том числе
органических, что неоценимо для фармацевтов и микробиологов.
Фуллерены как новые
полупроводниковые и наноконструкционные материалы.
Разработаны
физические принципы создания аналога транзистора на одной молекуле фуллерена,
который может служить усилителем тока наноамперного диапазона (Приложение 2
рис. 2).
В области
наноэлектроники наибольший интерес с точки зрения возможных приложений вызывают
квантовые точки, обладающие рядом
уникальных оптических свойств, которые позволяют использовать их для управления
волоконной оптической связью и в качестве элементов процессора в проектируемом
в настоящее время оптическом суперкомпьютере. Фуллерены имеют шанс стать самой
маленькой микросхемой в компьютерном нанопроцессоре.
Фуллерены как новые
материалы для нелинейной оптики.
Фуллереносодержащие материалы (растворы, полимеры, жидкие кристаллы,
фуллереносодержащие стеклянные матрицы) обладают сильно нелинейными оптическими
свойствами и перспективны для применения в качестве: оптических ограничителей
(ослабителей) интенсивного лазерного излучения; фоторефрактивных сред для
записи динамических голограмм; частотных преобразователей; устройств фазового
сопряжения.
Легированный
щелочным металлом фуллерит С60 является проводником, а при низкой
температуре и сверхпроводником.
Введение атомов примеси в фуллеритовую матрицу связано с явлением интеркаляции.
Интеркаляционные соединения представляют собой материал, в котором атомы или
молекулы примеси захвачены между слоями кристаллической решетки.
Кристалл С60
— широкозонный полупроводник и его проводимость низка, а при легировании
щелочными атомами он становится проводником. В Приложении 2 рис. 3 показана
элементарная ячейка кристаллической решетки фуллерена С60.
Легированный калием
фуллерит К3С60 при температуре 18 К является
сверхпроводником. После замены калия на рубидий температура сверхпроводящего
перехода возрастает до 28 - 29 К. Благодаря прочности молекулы С60
сверхпроводники на их основе обладают большой стабильностью, что выгодно
отличает их от высокотемпературных
оксидных сверхпроводников.
Фуллерены
перспективны как прекурсоры для роста алмазных пленок и пленок карбида кремния. Пленки широкозонных
полупроводников, таких как алмаз и карбид кремния, перспективны для
использования в высокотемпературной, высокоскоростной электронике и
оптоэлектронике, включающей ультрафиолетовый диапазон. Представляется эффективным
использование фуллеренов, имеющих
частичную sp3 -гибридизацию, в двух направлениях: повышение
скорости формирования алмазных центров зародышеобразования на подложке и
использование в качестве подходящих «строительных блоков» для выращивания
алмазов в газовой фазе. Используя фуллерены как прекурсоры роста и
зародышеобразования, были получены алмазные пленки высокого качества со
скоростью роста 0,6 мкм/ч. Такая высокая скорость роста значительно снизит
стоимость алмазов, полученных по CVD-технологии.
Фуллерены —
материал для литографии.
Благодаря способности полимеризоваться под действием лазерного или электронного
луча и образовывать при этом нерастворимую в органических растворителях фазу,
перспективно применение фуллеренов в качестве резиста для субмикронной
литографии. Фуллереновые пленки при этом выдерживают значительный нагрев, не
загрязняют подложку, допускают сухое проявление.
Фуллерены могут
служить основой для производства уникальных смазочных материалов. В силу своей
химической и механической прочности фуллерены являются самыми маленькими и
самыми прочными шарикоподшипниками. (Приложение 3 рис.4)
Глава 2. Создание компьютерной
модели фуллерена
Для создания модели
мною была иcпользована
программная среда Delphi
7.0. Алгоритм программы включает в себя
следующие этапы:
n
Объявление
и ввод переменных;
n
Создание
графики;
n
Ввод начальных координат фуллерена;
n
Создания
влияния температуры на движение атомов;
n
Расчет
расстояния между атомами;
n
Расчет
потенциала Ленарда-Джонса и потенциала Борна ;
n
Расчет
скоростей атомов;
n
Расчет
новых координат атомов;
n
Обработка
геометрии вращения.
Для математической
части программы я использовал два принциа это принцип Ленарда-Джонса и принцип
Борна.
Созданная мною
компьютерная модель является упрощенной
моделью фуллерена, с помощью которой можно увидеть взаимодействие атомов
углерода в молекуле фуллерена. Программный код (Приложение 4).
В результате
выполненной работы мною были сделаны
следующие выводы:
1.
Нанотехнология
подразумевает умение работать с такими объектами и создавать из них более
крупные структуры, обладающие принципиально новой молекулярной организацией.
Они являются искусственными образованиями и характеризуются новыми
физическими, химическими и биологическими свойствами, создавая новые
возможности технологических приемов, связанных с электроникой,
материаловедением, химией, механикой и многими другими областями науки.
Получение новых материалов и развитие новых методик обещает произвести настоящую научно-технологическую революцию в
информационных технологиях, производстве конструкционных материалов,
изготовлении фармацевтических препаратов, конструировании сверхточных устройств
и т. д.
2.
Молекула
фуллерена С60 представляет собой замкнутую сферу, составленную из правильных
пятиугольников и шестиугольников с атомами углерода в вершинах.
3.
С
химической устойчивостью и пустотелостью фуллеренов связаны возможности их
применения в химии, микробиологии и медицине.
4.
Фуллерены
являются новым материалом для использования в опто- и нано - электронике,
литографии и является перспективны как прекурсоры для роста алмазных пленок и
пленок карбида кремния.
Заключение
Сверхмощные и сверхминиатюрные компьютеры
В
близком будущем можно ожидать значительного уменьшения размеров ЭВМ
(одновременно с ростом их рабочих характеристик), что позволит создать
сверхмалые или даже микроскопические вычислительные системы. Нанотехнологии
позволяют производить транзисторы, электрический ток в которых соответствует
движению очень небольшого числа электронов (от десятков до нескольких тысяч),
в результате чего переключения типа включено-выключено станут возможными за
счет поведения отдельных электронов. Практически это будет означать возможность
уменьшения размеров электрических цепей до предельно малых размеров, а также
использование в их работе новых принципов.
Сверхчувствительные и высокостабильные биодатчики
Действие
используемых в настоящее время биологических датчиков основано, главным
образом, на разнообразных специфических реакциях с участием кислорода, в
результате чего происходят химические реакции, регистрируемые соответствующими
электрическими сигналами. Нанотехнологии позволят нам создать «искусственные»
молекулы, реакции которых не будут связаны с окислительными процессами.
Высокоэффективные топливные элементы
Известно,
что выхлопные газы автомобилей относятся к важнейшим факторам возникновения
парникового эффекта и загрязнения окружающей среды, вследствие чего ведутся
активные поиски новых источников энергии, способных заменить бензин. Наиболее
перспективными в этом смысле представляются так называемые топливные элементы,
особенно водородные (при сгорании водорода образуется экологически безвредная
вода!). Развитие таких процессов сдерживалось
их низкой эффективностью. В последние годы химики научились создавать новые
кристаллические формы углерода (наноуглеродные трубки), способные адсорбировать
значительные количества водорода, что позволяет надеяться на быстрый прогресс
в этом направлении.
Литература
Приложение
1
Схема 1
Рис. 1
Приложение
2
Рис. 2
Рис. 3
Приложение
3
Примеры
практического применения нанотехнологий
·
Полупроводниковые
устройства ·
Запоминающие
устройства ·
Устройства
с очень малым электропотреблением ·
Карманные
супер ЭВМ ·
Повышение
характеристик ЭВМ на три порядка ·
Биодатчики ·
«Адресная
доставка» лекарств ·
Диагностика
раковых заболеваний ·
Новые
методы введения лекарств
·
Использование
солнечной энергии ·
Топливные
элементы ·
Экологически
чистые материалы ·
Борьба
с «парниковым эффектом» ·
Создание
общества «гармонии с природой»
Приложение 4.
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
ColorGrd, StdCtrls, ExtCtrls, ImgList;
type
TForm1 = class(TForm)
Panel2: TPanel;
ImageList1: TImageList;
PaintBox1: TPaintBox;
ImageList2: TImageList;
RadioGroup1: TRadioGroup;
ImageList3: TImageList;
ImageList4: TImageList;
ImageList5: TImageList;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Image1: TImage;
BtQuitter: TButton;
CheckBox1: TCheckBox;
Button1: TButton;
procedure BtQuitterClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var
Action: TCloseAction);
procedure TraiteMessages(Var msg: TMsg; Var
Handled: boolean); //Clavier
procedure PaintBox1MouseDown(Sender:
TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PaintBox1MouseMove(Sender:
TObject; Shift: TShiftState; X,
Y: Integer);
procedure PaintBox1MouseUp(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PaintBox1Paint(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure RadioGroup1Click(Sender:
TObject);
procedure CheckBox1Click(Sender: TObject);
private
Procedure Gradball(imglist : timagelist;
arayon, pctspec : integer;
colball, collight, colmask, colspec :
Tcolor);
procedure initmolecule;
public
end;
var
Form1: TForm1;
implementation
{$R
*.DFM}
type
TRGBArray = ARRAY[0..0] OF TRGBTriple;
pRGBArray = ^TRGBArray;
Type
Matrix
= array[0..3, 0..3] of single;
TDPoint =
record { Structure pour un
point en 3 Dimensions }
X : single;
Y : single;
Z : single;
end;
const
//rayon
: integer = 100;
maximum = 180;
var
Bmpmano
: TBitmap;
Bmpfond
: TBitmap;
rayon
: integer;
maxat : integer;
tat
: array[1..maximum] of integer;
Pts
: array[1..maximum] of
TDPoint;
PtsR :
array[1..maximum] of TDPoint;
P2D : array[1..maximum] of TPoint;
Eloignement : array[1..maximum] of
integer;
zTri
: array[1..maximum] of integer;
Priorite
: array[1..maximum] of integer;
XAng, YAng, ZAng : integer;
maxliens : integer;
Lien : array[1..maximum] of Tpoint; // Lien.x
= n° atome dйpart, .y n° arrivйe
cx, cy
: integer;
oldrect : Trect;
newrect : Trect;
asin : array[0..360] of single;
acos : array[0..360] of single;
moving : integer;
prevx, prevy : integer;
ashift : boolean;
actrl
: boolean;
procedure
TForm1.FormCreate(Sender: TObject);
const
pirad = pi /180;
var
i : integer;
n : single;
begin
ashift := false;
actrl
:= false;
Application.OnMessage := TraiteMessages;
prevx := 0;
prevy := 0;
moving := 0;
For i := 0 to 360 do
begin
n := i * pirad;
asin[i] := sin(n);
acos[i] := cos(n);
end;
cx := paintbox1.width div 2;
cy := paintbox1.height div 2;
Bmpmano := TBitmap.Create;
Bmpmano.Height := Paintbox1.height;
Bmpmano.Width := Paintbox1.width;
Bmpmano.pixelformat := pf24bit;
Bmpfond := TBitmap.Create;
Bmpfond.Height := Paintbox1.height;
Bmpfond.Width := Paintbox1.width;
Bmpmano.pixelformat := pf24bit;
// on peut aussi charger une image de fond
with Bmpfond.Canvas do
begin
brush.color := clWhite;
fillrect(rect(0,0,bmpfond.width,
bmpfond.height));
end;
for i := 0 to 15 do
begin
gradball(imagelist1,16-i div 2, i*6, clblack
, clwhite, cllime, clsilver);
gradball(imagelist2,12-i div 2, i*6,
clsilver, clwhite, cllime, clsilver);
gradball(imagelist3,16-i div 2, i*6,
clred , clwhite, cllime, clsilver);
gradball(imagelist4,16-i div 2, i*6, clgreen
, clwhite, cllime, clsilver);
gradball(imagelist5,12-i div 2, i*6,
clpurple, clwhite, cllime, clsilver);
end;
image1.canvas.brush.color := clbtnface;
image1.canvas.fillrect(rect(0,0,image1.width, image1.height));
Imagelist1.draw(image1.canvas, 5, 4, 8);
Imagelist2.draw(image1.canvas, 5, 28, 4);
Imagelist3.draw(image1.canvas, 5, 52, 8);
Imagelist4.draw(image1.canvas, 5, 76, 8);
Imagelist5.draw(image1.canvas, 32, 4, 8);
XAng := 20;
YAng := 30;
ZAng := 0;
InitMolecule;
end;
procedure
TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Bmpfond.Free;
Bmpmano.Free;
end;
//
Intercepte les messages clavier, en particulier les touches flиchйes
Procedure
Tform1.TraiteMessages(Var msg : TMsg; Var Handled: boolean);
var
clx, cly : integer;
B : Tmousebutton;
S : Tshiftstate;
begin
With msg do
begin
if message = WM_KEYUP then
Case wparam of
VK_SHIFT
: ashift := false;
VK_CONTROL : actrl := false;
end;
If message = WM_KEYDOWN then
begin
clx := 0;
cly := 0;
Case wparam of
VK_LEFT
: clx := -1;
VK_RIGHT : clx := 1;
VK_UP
: cly := -1;
VK_DOWN
: cly := 1;
VK_SHIFT : ashift := true;
VK_CONTROL : actrl := true;
end;
if Form1.active and
(actrl OR ashift) and ((clx <> 0)
OR (cly <> 0)) then
begin
if actrl then begin clx := clx*4; cly
:= cly*4; end;
paintbox1MouseDown(paintbox1, B, S, 0,
0);
paintbox1MouseMove(paintbox1, S, clx,
cly);
paintbox1MouseUp(paintbox1, B, S,
0,0);
handled := true;
end
else handled := false;
end
else handled := false;
end;
end;
procedure
TForm1.Button1Click(Sender: TObject);
begin
XAng := 0;
YAng := 0;
ZAng := 0;
paintbox1paint(sender);
end;
procedure
TForm1.RadioGroup1Click(Sender: TObject);
begin
initmolecule;
end;
Function
qsin(a : integer): single;
begin
while a > 360 do dec(a, 360);
while a < 0 do inc(a, 360);
result := asin[a];
end;
Function
qcos(a : integer): single;
begin
while a > 360 do dec(a, 360);
while a < 0 do inc(a, 360);
result := acos[a];
end;
var
sinX, cosX,
sinY, cosY,
sinZ, cosZ : single; // calculй une seule fois
i, j : integer;
begin
sinX := qsin(degx);
cosX := qcos(degx);
sinY := qsin(degy);
cosY := qcos(degy);
sinZ := qsin(degz);
cosZ := qcos(degz);
for j := 0 to 3 do
for i := 0 to 3 do
if i = j then M[j, i] := 0
else M[j, i] := 1;
M[0,0] :=
cosZ * cosY;
M[0,1] :=
cosZ * -sinY * -sinX + sinZ * cosX;
M[0,2] :=
cosZ * -sinY * cosX + sinZ *
sinX;
M[1,0] := -sinZ * cosY;
M[1,1] := -sinZ * -sinY * -sinX + cosZ *
cosX;
M[1,2] := -sinZ * -sinY * cosX + cosZ * sinX;
M[2,0] :=
sinY;
M[2,1] :=
cosY * -sinX;
M[2,2] :=
cosY * cosX;
end;
//
Applique la rotation а un point
3D et renvoie un nouveau point 3D
procedure
ApplyMatToPoint(PointIn: TDPoint; var pointOut: TDPoint; mat: Matrix);
var
x, y, z : single;
begin
x :=
(PointIn.x*mat[0,0])+(PointIn.y*mat[0,1])+(PointIn.z*mat[0,2])+mat[0,3];
y := (PointIn.x*mat[1,0])+(PointIn.y*mat[1,1])+(PointIn.z*mat[1,2])+mat[1,3];
z :=
(PointIn.x*mat[2,0])+(PointIn.y*mat[2,1])+(PointIn.z*mat[2,2])+mat[2,3];
PointOut.x :=
x;
PointOut.y :=
y;
PointOut.z :=
z;
end;
/
M1 = 90;
L1 : array[1..M1*2] of integer = (
01, 02, 01, 05, 01, 08, 02, 03, 02, 13,
03, 04, 03, 18, 04, 05, 04,
23, 05, 28, 06, 07, 06, 10, 06, 40, 07,
08, 07, 14, 08, 09, 09, 10,
09, 27, 10, 56, 11, 12, 11, 15, 11, 45,
12, 13, 12, 19, 13, 14, 14,
15, 15, 36, 16, 17, 16, 20, 16, 50, 17,
18, 17, 24, 18, 19, 19, 20,
20, 41, 21, 22, 21, 25, 21, 55, 22, 23,
22, 29, 23, 24, 24, 25, 25,
46, 26, 27, 26, 30, 26, 60, 27, 28, 28,
29, 29, 30, 30, 51, 31, 32,
31, 35, 31, 38, 32, 33, 32, 43, 33, 34,
33, 48, 34, 35, 34, 53, 35,
58,
36, 37, 36, 40, 37, 38, 37, 44, 38, 39, 39, 40, 39, 57, 41, 42,
41, 45, 42, 43, 42, 49, 43, 44, 44, 45,
46, 47, 46, 50, 47, 48, 47,
54, 48, 49, 49, 50, 51, 52, 51, 55, 52,
53, 52, 59, 53, 54, 54, 55,
56, 57, 56, 60, 57, 58, 58, 59, 59, 60);
var
i : integer;
raymax : single;
k : single;
begin
oldrect := rect(0,0,bmpmano.width,
bmpmano.height); // pour effacement total
Case radiogroup1.itemindex of
1:
begin
maxat := 60;
rayon := 140;
tat[01]:=0; Pts[01].X:= 1.2265; Pts[01].Y:=
0.0000; Pts[01].Z:= 3.3145;
tat[02]:=0; Pts[02].X:= 0.3790; Pts[02].Y:=
1.1664; Pts[02].Z:= 3.3145;
tat[03]:=0; Pts[03].X:=-0.9922; Pts[03].Y:=
0.7209; Pts[03].Z:= 3.3145;
tat[04]:=0; Pts[04].X:=-0.9922;
Pts[04].Y:=-0.7209; Pts[04].Z:= 3.3145;
tat[05]:=0; Pts[05].X:= 0.3790;
Pts[05].Y:=-1.1664; Pts[05].Z:= 3.3145;
tat[06]:=0; Pts[06].X:= 3.4084; Pts[06].Y:=
0.7209; Pts[06].Z:= 0.5948;
tat[07]:=0; Pts[07].X:= 2.7951; Pts[07].Y:=
1.1664; Pts[07].Z:= 1.8213;
tat[08]:=0; Pts[08].X:= 2.4161; Pts[08].Y:=
0.0000; Pts[08].Z:= 2.5793;
tat[09]:=0; Pts[09].X:= 2.7951;
Pts[09].Y:=-1.1664; Pts[09].Z:= 1.8213;
tat[10]:=0; Pts[10].X:= 3.4084;
Pts[10].Y:=-0.7209; Pts[10].Z:= 0.5948;
tat[11]:=0; Pts[11].X:= 0.3676; Pts[11].Y:=
3.4643; Pts[11].Z:= 0.5948;
tat[12]:=0; Pts[12].X:=-0.2456; Pts[12].Y:=
3.0188; Pts[12].Z:= 1.8213;
tat[13]:=0; Pts[13].X:= 0.7466; Pts[13].Y:=
2.2979; Pts[13].Z:= 2.5793;
tat[14]:=0; Pts[14].X:= 1.9731; Pts[14].Y:=
2.2979; Pts[14].Z:= 1.8213;
tat[15]:=0; Pts[15].X:= 1.7389; Pts[15].Y:=
3.0188; Pts[15].Z:= 0.5948;
tat[16]:=0; Pts[16].X:=-3.1812; Pts[16].Y:=
1.4202; Pts[16].Z:= 0.5948;
tat[17]:=0; Pts[17].X:=-2.9469; Pts[17].Y:=
0.6993; Pts[17].Z:= 1.8213;
tat[18]:=0; Pts[18].X:=-1.9547; Pts[18].Y:=
1.4202; Pts[18].Z:= 2.5793;
tat[19]:=0; Pts[19].X:=-1.5757; Pts[19].Y:=
2.5866; Pts[19].Z:= 1.8213;
tat[20]:=0; Pts[20].X:=-2.3337; Pts[20].Y:=
2.5866; Pts[20].Z:= 0.5948;
tat[21]:=0; Pts[21].X:=-2.3337;
Pts[21].Y:=-2.5866; Pts[21].Z:= 0.5948;
tat[22]:=0; Pts[22].X:=-1.5757;
Pts[22].Y:=-2.5866; Pts[22].Z:= 1.8213;
tat[23]:=0; Pts[23].X:=-1.9547;
Pts[23].Y:=-1.4202; Pts[23].Z:= 2.5793;
tat[24]:=0; Pts[24].X:=-2.9469;
Pts[24].Y:=-0.6993; Pts[24].Z:= 1.8213;
tat[25]:=0; Pts[25].X:=-3.1812; Pts[25].Y:=-1.4202;
Pts[25].Z:= 0.5948;
tat[26]:=0; Pts[26].X:= 1.7389;
Pts[26].Y:=-3.0188; Pts[26].Z:= 0.5948;
tat[27]:=0; Pts[27].X:= 1.9731;
Pts[27].Y:=-2.2979; Pts[27].Z:= 1.8213;
tat[28]:=0; Pts[28].X:= 0.7466;
Pts[28].Y:=-2.2979; Pts[28].Z:= 2.5793;
tat[29]:=0; Pts[29].X:=-0.2456;
Pts[29].Y:=-3.0188; Pts[29].Z:= 1.8213;
tat[30]:=0; Pts[30].X:= 0.3676;
Pts[30].Y:=-3.4643; Pts[30].Z:= 0.5948;
tat[31]:=0; Pts[31].X:= 0.9922; Pts[31].Y:=
0.7209; Pts[31].Z:=-3.3145;
tat[32]:=0; Pts[32].X:=-0.3790; Pts[32].Y:=
1.1664; Pts[32].Z:=-3.3145;
tat[33]:=0; Pts[33].X:=-1.2265; Pts[33].Y:=
0.0000; Pts[33].Z:=-3.3145;
tat[34]:=0; Pts[34].X:=-0.3790;
Pts[34].Y:=-1.1664; Pts[34].Z:=-3.3145;
tat[35]:=0; Pts[35].X:= 0.9922;
Pts[35].Y:=-0.7209; Pts[35].Z:=-3.3145;
tat[36]:=0; Pts[36].X:= 2.3337; Pts[36].Y:=
2.5866; Pts[36].Z:=-0.5948;
tat[37]:=0; Pts[37].X:= 1.5757; Pts[37].Y:=
2.5866; Pts[37].Z:=-1.8213;
tat[38]:=0; Pts[38].X:= 1.9547; Pts[38].Y:=
1.4202; Pts[38].Z:=-2.5793;
tat[39]:=0; Pts[39].X:= 2.9469; Pts[39].Y:=
0.6993; Pts[39].Z:=-1.8213;
tat[40]:=0; Pts[40].X:= 3.1812; Pts[40].Y:=
1.4202; Pts[40].Z:=-0.5948;
tat[41]:=0; Pts[41].X:=-1.7389; Pts[41].Y:=
3.0188; Pts[41].Z:=-0.5948;
tat[42]:=0; Pts[42].X:=-1.9731; Pts[42].Y:=
2.2979; Pts[42].Z:=-1.8213;
tat[43]:=0; Pts[43].X:=-0.7466; Pts[43].Y:=
2.2979; Pts[43].Z:=-2.5793;
tat[44]:=0; Pts[44].X:= 0.2456; Pts[44].Y:=
3.0188; Pts[44].Z:=-1.8213;
tat[45]:=0; Pts[45].X:=-0.3676; Pts[45].Y:=
3.4643; Pts[45].Z:=-0.5948;
tat[46]:=0; Pts[46].X:=-3.4084;
Pts[46].Y:=-0.7209; Pts[46].Z:=-0.5948;
tat[47]:=0; Pts[47].X:=-2.7951;
Pts[47].Y:=-1.1664; Pts[47].Z:=-1.8213;
tat[48]:=0; Pts[48].X:=-2.4161; Pts[48].Y:=
0.0000; Pts[48].Z:=-2.5793;
tat[49]:=0; Pts[49].X:=-2.7951; Pts[49].Y:=
1.1664; Pts[49].Z:=-1.8213;
tat[50]:=0; Pts[50].X:=-3.4084; Pts[50].Y:=
0.7209; Pts[50].Z:=-0.5948;
tat[51]:=0; Pts[51].X:=-0.3676;
Pts[51].Y:=-3.4643; Pts[51].Z:=-0.5948;
tat[52]:=0; Pts[52].X:= 0.2456;
Pts[52].Y:=-3.0188; Pts[52].Z:=-1.8213;
tat[53]:=0; Pts[53].X:=-0.7466;
Pts[53].Y:=-2.2979; Pts[53].Z:=-2.5793;
tat[54]:=0; Pts[54].X:=-1.9731;
Pts[54].Y:=-2.2979; Pts[54].Z:=-1.8213;
tat[55]:=0; Pts[55].X:=-1.7389;
Pts[55].Y:=-3.0188; Pts[55].Z:=-0.5948;
tat[56]:=0; Pts[56].X:= 3.1812;
Pts[56].Y:=-1.4202; Pts[56].Z:=-0.5948;
tat[57]:=0; Pts[57].X:= 2.9469;
Pts[57].Y:=-0.6993; Pts[57].Z:=-1.8213;
tat[58]:=0; Pts[58].X:= 1.9547;
Pts[58].Y:=-1.4202; Pts[58].Z:=-2.5793;
tat[59]:=0; Pts[59].X:= 1.5757;
Pts[59].Y:=-2.5866; Pts[59].Z:=-1.8213;
tat[60]:=0; Pts[60].X:= 2.3337;
Pts[60].Y:=-2.5866; Pts[60].Z:=-0.5948;
For i := 1 to 60 do Tat[i] := 4; // dessin
petit et violet
maxliens := M1;
for i := 1 to M1 do
begin
lien[i].x := L1[i*2-1];
lien[i].y := L1[i*2];
end;
end;
end;
raymax := 0.1;
For i := 1 to maxat do
begin
if abs(Pts[i].x) > raymax then raymax :=
abs(Pts[i].x);
if abs(Pts[i].y) > raymax then raymax :=
abs(Pts[i].y);
if abs(Pts[i].z) > raymax then raymax :=
abs(Pts[i].z);
end;
k := rayon;
k := (k*0.714) / raymax;
For i := 1 to maxat do
begin
Pts[i].X := Pts[i].X*k;
Pts[i].Y := Pts[i].Y*k;
Pts[i].Z := Pts[i].Z*k;
end;
Form1.paintbox1paint(form1);
end;
procedure
TForm1.BtQuitterClick(Sender: TObject);
begin
Close;
end;
Procedure
Tform1.gradball(Imglist : Timagelist; arayon, pctspec : integer;
colball, collight,
colmask, colspec : Tcolor);
var
bmp : tbitmap;
x, y : integer;
rowa : Prgbarray;
cbx , cby : integer;
Ray :
integer;
clx, cly : integer;
Rayl :
integer;
rol : integer;
R, G, B
: integer;
R1, G1, B1 : integer;
R2, G2, B2 : integer;
R3, G3, B3 : integer;
R4, G4, B4 : integer;
Rd, Gd, Bd : integer;
begin
ray := arayon;
if ray > imagelist1.width div 2 then ray
:= imagelist1.width div 2;
if ray < 2
then ray := 2;
if pctspec < 0 then pctspec := 0;
if pctspec > 100 then pctspec := 100;
try
bmp := tbitmap.create;
bmp.width := imagelist1.width;
bmp.height := imagelist1.height;
bmp.pixelformat := pf24bit;
cbx := Bmp.width div 2;
cby := Bmp.height div 2;
clx
:= cbx - ray div 3;
cly
:= cby - ray div 3;
Rayl := ray*2;
R1 := GetRValue(ColorToRGB(collight));
G1 := GetGValue(ColorToRGB(collight));
B1 := GetBValue(ColorToRGB(collight));
R3 := GetRValue(ColorToRGB(colspec));
G3 := GetGValue(ColorToRGB(colspec));
B3 := GetBValue(ColorToRGB(colspec));
R2 := GetRValue(ColorToRGB(colball));
G2 := GetGValue(ColorToRGB(colball));
B2 := GetBValue(ColorToRGB(colball));
R1 := (R1*(100-pctspec)+R3*pctspec) div
100;
G1 := (G1*(100-pctspec)+G3*pctspec) div
100;
B1 := (B1*(100-pctspec)+B3*pctspec) div
100;
R2 := (R2*(100-pctspec)+R3*pctspec) div
100;
G2 := (G2*(100-pctspec)+G3*pctspec) div
100;
B2 := (B2*(100-pctspec)+B3*pctspec) div
100;
Rd := R2 - R1; // delta couleurs
Gd := G2 - G1;
Bd := B2 - B1;
R4 := 255-GetRValue(ColorToRGB(colmask));
G4 := 255-GetGValue(ColorToRGB(colmask));
B4 := 255-GetBValue(ColorToRGB(colmask));
with bmp.canvas do
begin
brush.color := colmask;
fillrect(rect(0,0,bmp.width,
bmp.height));
brush.color := rgb(R4,G4,B4);
pen.color := brush.color;
Ellipse(cbx-ray, cby-ray, cbx+ray,
cby+ray);
end;
For y := 0 to bmp.height-1 do
begin
rowa := Bmp.scanline[y];
for x := 0 to bmp.width-1 do
begin
R := rowa[x].Rgbtred;
G := rowa[x].Rgbtgreen;
B
:= rowa[x].Rgbtblue;
if (R = R4) AND (G = G4) AND (B = B4)
then
begin
rol :=
round(sqrt(sqr(clx-x)+sqr(cly-y)));
if rol <= Rayl then
begin
R := (R1+(Rd*rol) div rayl) mod
256;
G := (G1+(Gd*rol) div rayl) mod
256;
B := (B1+(Bd*rol) div rayl) mod
256;
end
else
begin
R := R2;
G := G2;
B := B2;
end;
end;
rowa[x].Rgbtred := R;
rowa[x].Rgbtgreen := G;
rowa[x].Rgbtblue := B;
end;
end;
imglist.addmasked(bmp, colmask);
finally
bmp.free;
end;
end;
procedure
TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
IF Button = mbRight then moving := 2 else
moving := 1;
prevx := x;
prevy := y;
end;
procedure
TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if moving = 0 then exit;
IF moving = 1 Then
begin
Xang := Xang+(prevy-y) * (360 div
paintbox1.width);
Yang := Yang+(x-prevx) * (360 div
paintbox1.height);
end
else Zang := Zang+(x+y-prevx-prevy) * (360
div paintbox1.height);
prevx := x;
prevy := y;
paintbox1Paint(sender);
end;
procedure
TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
moving := 0;
end;
procedure
TForm1.PaintBox1Paint(Sender: TObject);
var
M : Matrix;
i, j, t, t2 : Integer;
dx, dy : integer;
affrect : Trect;
begin
matrixRotate(M, XAng , YAng, ZAng); // crйe la la matrice de rotation
for i := 1 to
maxat do
begin
ApplyMatToPoint(Pts[i], PtsR[i], M);
P2D[i] := Point(cx+round(PtsR[i].X),
cy+round(PtsR[i].Y));
Eloignement[i] := 8 + (round(PtsR[i].Z) * 7) div rayon;
ztri[i] := round(PtsR[i].z);
priorite[i] := i;
end;
for i:= Maxat downto 1 do
for j := 1 to Maxat - 1 do
if ztri[j] > ztri[j + 1] then
begin
T := ztri[j];
t2 := priorite[j];
ztri[J] := ztri[j + 1];
priorite[j] := priorite[j+1];
ztri[j + 1] := T;
priorite[j+1] := t2;
end;
Bmpmano.Canvas.copyrect(oldrect,
Bmpfond.canvas, oldrect);
newrect := rect(cx-1, cy-1, cx+1, cy+1);
For i := 1 to maxat do
begin
if P2D[i].x < newrect.left then newrect.left := P2D[i].x;
if P2D[i].x > newrect.right then newrect.right := P2D[i].x;
if P2D[i].y < newrect.top then newrect.top := P2D[i].y;
if P2D[i].y > newrect.bottom then
newrect.bottom := P2D[i].y;
end;
dx := imagelist1.width div 2;
dy := imagelist1.height div 2;
inflaterect(newrect, dx, dy);
IF checkbox1.checked then
begin
with bmpmano.canvas do
begin
pen.color := clbtnface;
For i := 1 to maxliens do
begin
j := lien[i].x;
Moveto(P2D[j].x,P2D[j].y);
j := lien[i].y;
Lineto(P2D[j].x,P2D[j].y);
end;
end;
end;
For i := maxat downto 1 do
begin
j := priorite[i];
case tat[j] of
0: Imagelist1.draw(Bmpmano.canvas,
P2D[j].x-dx,P2D[j].y-dy,eloignement[j]);
1: Imagelist2.draw(Bmpmano.canvas,
P2D[j].x-dx,P2D[j].y-dy,eloignement[j]);
2: Imagelist3.draw(Bmpmano.canvas,
P2D[j].x-dx,P2D[j].y-dy,eloignement[j]);
3: Imagelist4.draw(Bmpmano.canvas,
P2D[j].x-dx,P2D[j].y-dy,eloignement[j]);
4: Imagelist5.draw(Bmpmano.canvas,
P2D[j].x-dx,P2D[j].y-dy,eloignement[j]);
end;
end;
Paintbox1.Canvas.copyrect(affrect,
Bmpmano.canvas, affrect);
oldrect := newrect;
end;
procedure
TForm1.CheckBox1Click(Sender: TObject);
begin
oldrect := rect(0,0,bmpmano.width,
bmpmano.height);
paintbox1Paint(sender);
end;
end.