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. Изучить теоретические основы строения и свойств фуллерена.
  2. Создать и экспериментально проверить компьютерную модель фуллерена.

Методы исследования:

 

Глава 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. Гусев А. И. Наноматериалы,  наноструктуры, нанотехнологии. – 2-е изд., испр. – М.: ФИЗМАТЛИТ, 2007.
  2. Дьячков П. Н. Углеродные нанотрубки: строение, свойства, применения / П. Н. Дьячков. – М. : БИНОМ. Лаборатория знаний, 2006.
  3. Старостин В. В. Материалы и методы нанотехнологии: учебное пособие/ В. В. Старостин; под общ. Ред. Л. Н. Патрикеева. -  М.: БИНОМ. Лаборатория знаний, 2008.
  4. Пул Ч., Оуэне Ф. Нанотехнологии: Пер. с англ. — М.: Техносфера, 2004.
  5. Неволин В. К. Зондовые нанотехнологии в электронике. — М.: Техносфера, 2005.
  6. Нанотехнологии в полупроводниковой электронике. Отв. редактор А. Л. Асеев. — Новосибирск: Изд-во СО РАН, 2004.
  7. Кобаяси Н. Введение в нанотехнологию / Пер. с японск. — М.: БИНОМ. Лаборатория знаний, 2005.
  8. Ратнер М., Ратнер Д. Нанотехнология: Простое объяснение оче­редной гениальной идеи / Пер. с англ. — М.: Издательский дом «Вильяме», 2004.
  9. Щука А. А., Старостин В. В. Материалы и методы нанотехнологии: Учебное пособие. — М.: МФТИ, 2006.
  10. Макарова Т. Л., Захарова И. Б. Электронная структура фуллеренов и фуллеритов. — СПб.: Наука, 2001. (Серия учебных пособий «Новые разделы физики полупроводников»).
  11. Раков Э. Г. Методы получения углеродных нанотрубок // Успехи химии, 2000. — Т. 69, № 1. С. 41-59.
  12. Энциклопедия технологии полупроводниковых материалов. Элек­тронная структура и свойства полупроводников. Том 1. / Пер. с англ. Под ред. Э. П. Домашевской — Воронеж: Изд-во «Водо­лей», 2004.

 

Приложение 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.