Цель проекта: Создание рабочей модели построения изображения в собирающих и рассеивающих линзах, разработанной в среде программирования Delphi 7.
Вложение | Размер |
---|---|
proekt_babkin_a._a.zip | 2.3 МБ |
Муниципальное казенное общеобразовательное учреждение
«Школа №10 имени Героя Советского Союза М.П. Галкина города Пласта»
Исследовательский проект
по информатике и ИКТ
«Моделирование построения изображения в тонких линзах»
Автор: | Бабкин А.А., ученик 11 класса |
Руководитель: | Басков М.В., учитель информатики |
2020 г.
Содержание
Построение изображений в тонкой линзе 10
Компьютерное моделирование и его особенности 12
Уравнение прямой, проходящей через две заданные точки на плоскости 13
Сравнительная таблица изображений, даваемых линзой и программой (разработанной моделью) 16
Построение изображения с разрывом в собирающей линзе 18
Приложение №1. Листингпрограммы 23
Роль информационно-компьютерных технологий в исследовании физических явлений трудно переоценить. Быстродействие и большие графические возможности современных персональных компьютеров позволяют проводить качественный и количественный анализы сложных физических явлений и наглядно представлять результаты этого анализа.
Физика – наука экспериментальная. Некоторые из экспериментов невозможно провести в условиях кабинета физики по следующим причинам:
Выходом из этого противоречия является использование интерактивных моделей, позволяющих провести изучение явлений, которые не могут демонстрироваться в условиях физического эксперимента. Кроме того, на компьютере можно менять условия протекания процессов. Такое моделирование позволяет получать наглядные динамические иллюстрации физических экспериментов и явлений, воспроизводить их детали, которые часто ускользают при наблюдении реальных явлений и экспериментов.
Актуальностью моего проекта является тот факт, что некоторые модели позволяют одновременно с ходом экспериментовнаблюдать построение соответствующих графических зависимостей, что повышает их наглядность, и, как следствие, более глубокое понимание предмета. Подобные компьютерные модели представляют особую ценность, так как учащиеся обычно испытывают значительные трудности при построении и чтении графиков, схем и чертежей.
Цель: Создание рабочей модели построения изображения в собирающих и рассеивающих линзах, разработанной в среде программирования Delphi 7.
Для достижения поставленной цели я сформулировалследующие задачи:
1. Рассмотреть теоретический материал по теме «Тонкие линзы».
2. Изучение математических приемов и методов программирования для создания моделей.
3. Написание программы, проверка модели на практике и создание руководства пользователя к ней.
Гипотеза: С помощью компьютера можно смоделировать построение изображения в линзах с высокой точностью.
Проблемы исследования: описание математических условий при создании компьютерной модели; самостоятельной углубление знаний по объектно-ориентированному программированию; построение изображения с разрывом в собирающей линзе.
Методы исследования:
Методы теоретического уровня:
Методы экспериментально-теоретического уровня:
Этапы работы:
Практическая значимость: Использование созданной модели на уроках физикии (или) при подготовке к ГИА.
Продукт проекта: Рабочая модель построения изображения в линзах.
Линза - прозрачное тело, ограниченное двумя сферическими поверхностями, называют линзой (Одна из поверхностей, разумеется, может быть плоской, так как плоскую поверхность можно рассматривать как сферическую с бесконечным радиусом кривизны.)
Виды линз:
Линза может быть ограничена двумя выпуклыми сферическими поверхностями (рис. 1.1, а), выпуклой сферической поверхностью и плоскостью (рис. 1.1, б), выпуклой и вогнутой сферическими поверхностями (рис. 1.1, в). Эти линзы посредине толще, чем у краев, и все они называются собирающими или выпуклыми. Линзы, которые посредине тоньше, чем у краев, называются вогнутыми или рассеивающими. На рисунке 1.2изображены три вида вогнутых линз: двояковогнутая(рис. 1.2, а), плоско-вогнутая (рис. 1.2, б) и выпукло-вогнутая (рис. 1.2, в).
Рис 1.1 | Рис 1.2 |
Рассмотрим наиболее простой случай, когда толщина линзы l = АВ (рис.1.3) пренебрежимо мала по сравнению с радиусами 𝑅1 и 𝑅2 поверхностей линзы и расстоянием предмета от линзы. Такую линзу называют тонкой. В дальнейшем, говоря о линзе, всегда будем подразумевать только тонкую линзу.
Рис 1.3
Точки А и В — вершины сферических сегментов — в тонкой линзе расположены столь близко друг к другу, что их можно принять за одну точку, которую называют оптическим центром линзы и обозначают обычно буквой О. Луч света, который проходит через оптический центр линзы, практически не преломляется. Объясняется это просто. Центральная область тонкой линзы возле оптического центра может с большой степенью точности быть принята за плоскопараллельную пластинку. Луч света, проходя через эту область, своего направления не меняет, а лишь несколько смещается. Но если угол падения луча невелик и линза достаточно тонка, то смещением луча можно пренебречь и считать, что он проходит через линзу, не меняя своего направления.
Прямую 𝑂1𝑂2, проходящую через центры сферических поверхностей, которые ограничивают линзу, называют ее главной оптической осью. Ясно, что главная оптическая ось тонкой линзы проходит через ее оптический центр. Любую другую прямую, проходящую через оптический центр, называют побочной оптической осью (рис. 1.4).[4]
Рис 1.4
В воздухе или в вакууме все лучи, параллельные главной оптической оси выпуклой линзы, после прохождения линзы отклоняются к оси и проходят через одну точку F на главной оптической оси (рис. 1.5). Поэтому выпуклые линзы называют собирающими линзами. Точка F называется главным фокусом линзы.
Рис. 1.5
В воздухе или в вакууме все лучи, параллельные главной оптической оси выпуклой линзы, после прохождения линзы отклоняются к оси и проходят через одну точку F на главной оптической оси (рис. 1.5). Поэтому выпуклые линзы называют собирающими линзами. Точка F называется главным фокусом линзы.
Рис. 1.6
В воздухе или в вакууме все лучи, параллельные главной оптической оси вогнутой линзы, отклоняются от оптической оси, поэтому вогнутые линзы называются рассеивающими линзами. Продолжения лучей в противоположную сторону сходятся в одной точке F на главной оптической оси перед линзой (рис. 1.7). Эта точка называется главным фокусом рассеивающей линзы. Главный фокус рассеивающей линзы мнимый, так как в действительности лучи света в нем не собираются.[2]
Рис. 1.7
Основное свойство линз, используемое в оптических приборах, заключается в том, что все лучи, исходящие из одной точки А перед линзой, собираются в другой точке 𝐴1 за линзой (рис. 1.8) или кажутся исходящими из одной точки 𝐴2 перед линзой (рис. 1.9).
Рис. 1.8
В первом случае изображение точки А называется действительным, во втором — мнимым.
Рис. 1.9
Замечательным свойством световых лучей является свойство обратимости: луч, направленный противоположно лучу, выходящему из любой оптической системы, пройдет через нее в обратном направлении точно по тому же пути, по какому прошел ее в прямом направлении первый луч.
Используя свойства лучей, проходящих через оптический центр линзы или через ее фокусы, а также лучей, параллельных главной оптической оси или одной из ее побочных осей, можно построить изображение любого предмета, получаемое с помощью собирающей или рассеивающей линзы. Условное изображение собирающей линзы представлено на рисунке 1.10, рассеивающей — на рисунке 1.11.[3]
Рис. 1.10 | Рис. 1.11 |
Расстояние f от собирающей линзы до изображения связано с расстоянием d от предмета до линзы и фокусным расстоянием F линзы.
Выразим эту зависимость математически. Ход лучей представлен на рисунке 1.12.
Рис. 1.12
Из подобия треугольников (заштрихованы одинаково) следует:
Из этих двух уравнений будем иметь:
Делением на произведение 𝑑𝑓𝐹 получаем:
Это уравнение называется формулой тонкой линзы.
Формула линзы применима для нахождения расстояния до изображения при любом расположении предмета относительно линзы.
Если значение расстояния f получается при расчете отрицательным, то это значит, что изображение предмета мнимое и находится по ту же сторону от линзы, что и предмет. Для рассеивающей линзы значение фокусного расстояния в расчетах нужно брать со знаком «минус» и, так как изображение предмета получаем мнимым, расстояние f до изображения всегда должно быть со знаком «минус».[1]
В итоге мы получаем формулу тонкой линзы в общем виде:
Для построения изображений, получаемых с помощью собирающей линзы, фокусы и оптический центр которой заданы, воспользуемся тремя видами «удобных» лучей. Как уже утверждалось ранее, лучи, параллельные главной оптической оси, преломившись в линзе, проходят через ее фокус. Из обратимости хода лучей следует, что лучи, идущие к линзе через ее фокус, после преломления пойдут параллельно главной оптической оси. Наконец, лучи, проходящие через оптический центр линзы, не меняют своего направления. Они лишь испытывают параллельное смещение, которое в случае тонкой линзы невелико, и им можно пренебречь. Построим изображение предмета АВ (рис. 1.13). Чтобы найти изображение точки А, направим луч АС параллельно главной оптической оси. После преломления он пойдет через фокус линзы. Другой луч — AD можно направить через фокус. После преломления он пойдет параллельно главной оптической оси. В точке пересечения этих двух преломленных лучей будет находиться изображение A1 точки 𝐴.
Рис. 1.13
Так же можно построить и все остальные точки изображения. Не следует только думать, что изображение создается двумя или тремя лучами; оно создается всем бесчисленным множеством лучей, вышедших из точки 𝐴 и собравшихся в точке A1. В частности, в точку A1 попадает луч AOA1, прошедший через оптический центр О линзы. Таким образом, для построения изображения точки можно использовать любые два из трех «удобных» лучей, ход которых через линзу известен: 1) луч, проходящий через оптический центр; 2) луч, падающий на линзу параллельно главной оптической оси; 3) луч, проходящий через фокус.
Рассмотрим еще случай, когда необходимо построить изображение точки, расположенной на главной оптической оси. Трудность заключается в том, что все три «удобных» луча сливаются в один, совпадающий с главной оптической осью. Поэтому возникает необходимость определить ход произвольного луча SB (рис. 1.14), попавшего на линзу в точке В. Для построения преломленного луча проведем побочную оптическую ось PQ, параллельную лучу SB. Затем построим фокальную плоскость MN и найдем точку С пересечения фокальной плоскости с побочной оптической осью. Через эту точку пройдет преломленный луч ВС. Таким образом, построен ход двух лучей, выходящих из точки S. После преломления в линзе эти лучи расходятся. Изображение S' точки является мнимым, так как в ней сходятся продолжения преломленных лучей.[2]
Рис. 1.14
Моделирование – процесс построения и использования модели. Под моделью понимают такой материальный или абстрактный объект, который в процессе изучения заменяет объект-оригинал, сохраняя его свойства, важные для данного исследования.
Построение компьютерной модели базируется на абстрагировании от конкретной природы явлений или изучаемого объекта-оригинала и состоит из двух этапов - сначала создание качественной, а затем и количественной модели. Компьютерное же моделирование заключается в проведении серии вычислительных экспериментов на компьютере, целью которых является анализ, интерпретация и сопоставление результатов моделирования с реальным поведением изучаемого объекта и, при необходимости, последующее уточнение модели и т. д.
К основным этапам компьютерного моделирования относятся:
1. Постановка задачи, определение объекта моделирования;
2. Разработка концептуальной модели, выявление основных элементов системы и элементарных актов взаимодействия;
3. Формализация, то есть переход к математической модели; создание алгоритма и написание программы;
4. Планирование и проведение компьютерных экспериментов;
5. Анализ и интерпретация результатов.
Различают аналитическое и имитационное моделирование. При аналитическом моделировании изучаются математические (абстрактные) модели реального объекта в виде алгебраических, дифференциальных и других уравнений, а также предусматривающих осуществление однозначной вычислительной процедуры, приводящей к их точному решению. При имитационном моделировании исследуются математические модели в виде алгоритма или алгоритмов, воспроизводящего функционирование исследуемой системы путем последовательного выполнения большого количества элементарных операций.
Для моей имитационной модели мне понадобятся уравнения прямой, проходящей через две заданные точки на плоскости и некоторые методы программирования.[5]
Перед получением уравнения прямой, проходящей через две заданные точки необходимо обратить внимание на некоторые факты. Существует аксиома, которая говорит о том, что через две несовпадающие точки на плоскости возможно провести прямую и только одну. Иначе говоря, две заданные точки плоскости определяются прямой линией, проходящей через эти точки.
Если плоскость задана прямоугольной системой координат Оху, то любая изображенная в нем прямая будет соответствовать уравнению прямой на плоскости. Также имеется связь с направляющим вектором прямой. Этих данных достаточно для того, чтобы произвести составление уравнения прямой, проходящей через две заданные точки.
Рассмотрим на примере решения подобной задачи. Необходимо составить уравнение прямой a, проходящей через две несовпадающие точки A(x1, y1) и B(x2, y2) находящиеся в декартовой системе координат.
В каноническом уравнении прямой на плоскости, имеющего вид:
Задается прямоугольная система координат Оху с прямой, которая пересекается с ней в точке с координатами A(x1, y1)с направляющим вектором:
Необходимо составить каноническое уравнение прямой a, которая пройдет через две точки с координатами A(x1, y1) и B(x2, y2). [8]
Прямая а имеет направляющий вектор AB с координатами(x2−x1, y2−y1) так как пересекает точки A и B. Мы получили необходимые данные для того, чтобы преобразовать каноническое уравнение с координатами направляющего вектора:
И координатами лежащих на них точках A(x1, y1) и B(x2, y2). Получим уравнение вида:
Или
Рекурсия — это свойство объекта подражать самому себе. Объект является рекурсивным, если его части выглядят также как весь объект. Рекурсия очень широко применяется в математике и программировании.
Рекурсивный алгоритм всегда разбивает задачу на части, которые по своей структуре являются такими же как исходная задача, но более простыми. Для решения подзадач функция вызывается рекурсивно, а их результаты каким-либо образом объединяются. Разделение задачи происходит лишь тогда, когда ее не удается решить сразу (она является слишком сложной).
Например, задачу обработки массива нередко можно свести к обработке его частей. Деление на части выполняется до тех пор, пока они не станут элементарными, т.е. достаточно простыми чтобы получить результат без дальнейшего упрощения.[6]
Процедуры и функции:
Описание и вызов. В Delphi подпрограммы называются процедурами и функциями и описываются в разделе с тем же названием.
Процедура имеет такую же структуру, как и программа, но с двумя отличиями:
1. Заголовок процедуры имеет другой синтаксис и включает служебное слово procedure;
2. Описание процедуры заканчивается точкой с запятой (а не точкой). Все имена, описанные в программе до процедуры, действуют во всей программе и в любой ее подпрограмме (если они там не описаны заново). Они называются глобальными, в отличие от локальных имен, описанных в процедуре и действующих лишь в ней.
Данные для обработки могут передаваться процедуре через глобальные имена или через аргументы процедуры. В процедуре каждый аргумент имеет свое имя -формальный параметр, описываемый в заголовке процедуры по схеме
procedure<имя> (<список описаний формальных параметров>) Описание формальных параметров может иметь вид:
<список имен>: <тип> или var<список имен>: <тип>
В первом случае говорят о параметрах-значениях, во втором - о параметрах-переменных. В простейшем случае заголовок процедуры может содержать только имя процедуры.
Оператор вызова процедуры имеет вид:
<имя процедуры> (<список выражений>);
Указанные выражения называют фактическими параметрами. Их список должен точно соответствовать списку описаний формальных параметров процедуры. Во время вызова процедуры каждому параметру-значению присваивается значение соответствующего фактического параметра и поэтому их обычно используют для передачи входных данных.
Параметры-переменные следует использовать для представления результатов процедуры.[7]
d – расстояние от предмета до линзы
f – расстояние от линзы до изображения
Тип линзы | Построение изображения, даваемого линзой | Характер изображения | Построение изображения, даваемого созданной программой (моделью) |
собирающая | d > 2F, Г < 1 F < f < 2F фотоаппарат | действительное, уменьшенное, перевернутое | |
собирающая | F < d < 2F, Г > 1 2F < f киноаппарат, проекционный аппарат | действительное, увеличенное, перевернутое | |
собирающая | d < F лупа | мнимое, увеличенное, прямое | |
рассеивающая | мнимое, уменьшенное, прямое |
Рис. 1.15
В случае, когда часть предмет находится между первым фокусом и оптический центром, а другая часть предмета распложена дальше первого фокуса, изображение получается рваным, так как часть предмета находится на первом фокусе. Это показано серой точкой. В данной точке изображения нет. (рис 1.15)
Функции | Изображение |
Выбор линз происходит по средству нажатия на переключатель, который находится левее названия линзы. | |
Для того чтобы активировать демонстрацию построения луча, проходящего через оптический центр собирающей линзы, необходимо поставить галочку напротив надписи «Первый луч». | |
Для того чтобы активировать демонстрацию построения луча, проходящего параллельно оптической оси собирающей линзы, необходимо поставить галочку напротив надписи «Второй луч». | |
Для того чтобы активировать демонстрацию построения луча, проходящего через первый фокус собирающей линзы, необходимо поставить галочку напротив надписи «Третий луч». | |
Для того чтобы активировать демонстрацию построения луча, проходящего через оптический центр рассеивающей линзы, необходимо поставить галочку напротив надписи «Первый луч». | |
Для того чтобы активировать демонстрацию построения луча, проходящего параллельно оптической оси рассеивающей линзы, необходимо поставить галочку напротив надписи «Второй луч». | |
Передвижение предмета по окну и изменение его размеров происходит по средству перемещения красного и синего кружков. |
Таким образом, компьютерные модели позволяют в широких пределах изменять начальные условия физических экспериментов, что позволяет выполнять многочисленные виртуальные опыты. Такая интерактивность открывает перед учащимися огромные познавательные возможности, делая их не только наблюдателями, но и активными участниками проводимых экспериментов.
В данной проектной работе:
В ходе моего исследования подтвердилась гипотеза, цель работы достигнута полностью, все задачи выполнены.
Список литература
unitUnit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Shape1: TShape;
Shape2: TShape;
Panel2: TPanel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
Shape3: TShape;
Shape4: TShape;
Shape5: TShape;
Shape6: TShape;
Shape7: TShape;
procedureFormCreate(Sender: TObject);
procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Shape2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Shape2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Shape2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure CheckBox1Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
shiftX,shiftY,a,b:integer;
m1,m:boolean;
implementation
{$R *.dfm}
procedure lych(x,y,x1,y1,x2,y2,max_x,max_y:integer);
begin
m1:=true;
form1.image1.Canvas.MoveTo(x,y);
if m=false then x:=x+1 else begin
form1.Image1.Canvas.Pen.Style:=psDot;
x:=x-50;
end;
if x2-x1<>0 then y:= round((x-x1)*(y2-y1)/(x2-x1)+y1) else y:=800;
form1.image1.Canvas.LineTo(x,y);
a:=x;
b:=y;
if (x
end;
procedurestr_ras;
begin
// стрелкирассеивающейлинзы
form1.Image1.Canvas.Pen.Style:=psSolid;
form1.image1.Canvas.Pen.Color:=clblack;
form1.image1.Canvas.MoveTo(590,80);
form1.image1.Canvas.LineTo(600,100);
form1.image1.Canvas.Pen.Color:=clblack;
form1.image1.Canvas.MoveTo(610,80);
form1.image1.Canvas.LineTo(600,100);
form1.image1.Canvas.Pen.Color:=clblack;
form1.image1.Canvas.MoveTo(590,720);
form1.image1.Canvas.LineTo(600,700);
form1.image1.Canvas.Pen.Color:=clblack;
form1.image1.Canvas.MoveTo(610,720);
form1.image1.Canvas.LineTo(600,700);
end;
procedurestr_sob;
begin
// стрелкисобирающейлинзы
form1.Image1.Canvas.Pen.Style:=pssolid;
form1.image1.Canvas.Pen.Color:=clblack;
form1.image1.Canvas.MoveTo(590,120);
form1.image1.Canvas.LineTo(600,100);
form1.image1.Canvas.Pen.Color:=clblack;
form1.image1.Canvas.MoveTo(610,120);
form1.image1.Canvas.LineTo(600,100);
form1.image1.Canvas.Pen.Color:=clblack;
form1.image1.Canvas.MoveTo(590,680);
form1.image1.Canvas.LineTo(600,700);
form1.image1.Canvas.Pen.Color:=clblack;
form1.image1.Canvas.MoveTo(610,680);
form1.image1.Canvas.LineTo(600,700);
end;
proceduretochka;
begin
form1.image1.Canvas.Brush.Color:=clred;
form1.image1.Canvas.Ellipse(form1.Shape3.Left, form1.Shape3.Top,form1.Shape3.Left+14, form1.Shape3.Top+14);
form1.image1.Canvas.Ellipse(form1.Shape2.Left, form1.Shape2.Top,form1.Shape2.Left+14, form1.Shape2.Top+14);
form1.image1.Canvas.Brush.Color:=clblue;
form1.image1.Canvas.Ellipse(form1.Shape1.Left, form1.Shape1.Top,form1.Shape1.Left+14, form1.Shape1.Top+14);
form1.image1.Canvas.Ellipse(form1.Shape4.Left, form1.Shape4.Top,form1.Shape4.Left+14, form1.Shape4.Top+14);
form1.image1.Canvas.Brush.Color:=clwhite;
end;
proceduresertochka;
begin
if form1.shape5.visible=true then begin
form1.image1.Canvas.Brush.Color:=clgray;
form1.image1.Canvas.Ellipse(form1.Shape5.Left, form1.Shape5.Top,form1.Shape5.Left+14, form1.Shape5.Top+14);
form1.image1.Canvas.Brush.Color:=clwhite;
end;
end;
procedure sob;
var l,y,h,a1,b1,l1,y1:integer;
begin
//soblinza
//красная точка расположена дальше фокуса
if (form1.Shape2.left<500) then begin
//1 лучкраснаяточка
if form1.CheckBox1.Checked=true then
lych(form1.Shape2.Left+5, form1.Shape2.Top+5,form1.Shape2.Left+5, form1.Shape2.Top+5,600,400,1200,800);
//2 лучкраснаяточка
if form1.CheckBox2.Checked=true then begin
lych(form1.Shape2.Left+5, form1.Shape2.Top+5,form1.Shape2.Left+5, form1.Shape2.Top+5,600,form1.Shape2.Top+5,600,800);
lych(a, b,a, b,700,400,1200,800); end;
//3 лучкраснаяточка
if form1.CheckBox3.Checked=true then form1.Image1.Canvas.Pen.Color:=clred
else form1.Image1.Canvas.Pen.Color:=clwhite;
lych(form1.Shape2.Left+5, form1.Shape2.Top+5,form1.Shape2.Left+5, form1.Shape2.Top+5,500,400,600,800);
y:=b;
lych(a, b,a, b,500,b,1200,800); end;
//изображение красной точки
l:= 600-form1.Shape2.Left-5;
if l=100 then l:=101;
form1.Shape3.Top := y-5;
form1.Shape3.Left := 600+round(100*l/(l-100))-5;
//синяяточкарасположенадальшефокуса
form1.Image1.Canvas.Pen.Color:=clblue;
if (form1.Shape1.Left<500) then begin
//1 лучсиняяточка
if form1.CheckBox1.Checked=true then
lych(form1.Shape1.Left+5, form1.Shape1.Top+5,form1.Shape1.Left+5, form1.Shape1.Top+5,600,400,1200,800);
//2 лучсиняяточка
if form1.CheckBox2.Checked=true then begin
lych(form1.Shape1.Left+5, form1.Shape1.Top+5,form1.Shape1.Left+5, form1.Shape1.Top+5,600,form1.Shape1.Top+5,600,800);
lych(a, b,a, b,700,400,1200,800); end;
//3 лучсиняяточка
if form1.CheckBox3.Checked=true then form1.Image1.Canvas.Pen.Color:=clblue
else form1.Image1.Canvas.Pen.Color:=clwhite;
lych(form1.Shape1.Left+5, form1.Shape1.Top+5,form1.Shape1.Left+5, form1.Shape1.Top+5,500,400,600,800);
y1:=b;
lych(a, b,a, b,500,b,1200,800); end;
//изображение синей точки
l1:= 600-form1.Shape1.Left-5;
if l1=100 then l1:=101;
form1.Shape4.Top := y1-5;
form1.Shape4.Left := 600+round(100*l1/(l1-100))-5;
//красная точка расположена между оптическим центром и фокусом
if (form1.shape2.left>500) and (form1.shape2.left<600) then begin
form1.Image1.Canvas.Pen.Color:=clred;
//1 лучкраснаяточка
if form1.CheckBox1.Checked=true then begin
lych(form1.Shape2.Left+5, form1.Shape2.Top+5,form1.Shape2.Left+5, form1.Shape2.Top+5,600,400,1200,800);
m:=true;
lych(a,b,a,b,600,400,1200,800);
m:=false;
lych(form1.Shape2.Left+5, form1.Shape2.Top+5,form1.Shape2.Left+5, form1.Shape2.Top+5,600,400,1200,800); end;
//2 лучкраснаяточка
if form1.CheckBox2.Checked=true then begin
lych(form1.Shape2.Left+5, form1.Shape2.Top+5,form1.Shape2.Left+5, form1.Shape2.Top+5,600,form1.Shape2.Top+5,600,800);
a1:=a;
b1:=b;
lych(a, b,a, b,700,400,1200,800);
m:=true;
lych(a1,b1,a1,b1,700,400,1200,800);
m:=false;
end;
//изображение красной точки
l:= 600-form1.Shape2.Left-5;
y:= 400-form1.Shape2.Top-5;
if l=100 then l:=101;
form1.Shape3.Left := 600-(round(100*l/(100-l)))-5;
form1.Shape3.Top := 400-(round(y*100/(100-l)))-5;
end;
//синяя точка расположена между оптическим центром и фокусом
if (form1.shape1.left>500) and (form1.shape1.left<600) then begin
form1.Image1.Canvas.Pen.Color:=clblue;
//1 лучsinyayaточка
if form1.CheckBox1.Checked=true then begin
lych(form1.Shape1.Left+5, form1.Shape1.Top+5,form1.Shape1.Left+5, form1.Shape1.Top+5,600,400,1200,800);
m:=true;
lych(a,b,a,b,600,400,1200,800);
m:=false;
lych(form1.Shape1.Left+5, form1.Shape1.Top+5,form1.Shape1.Left+5, form1.Shape1.Top+5,600,400,1200,800); end;
//2 лучsinyayaточка
if form1.CheckBox2.Checked=true then begin
lych(form1.Shape1.Left+5, form1.Shape1.Top+5,form1.Shape1.Left+5, form1.Shape1.Top+5,600,form1.Shape1.Top+5,600,800);
a1:=a;
b1:=b;
lych(a, b,a, b,700,400,1200,800);
m:=true;
lych(a1,b1,a1,b1,700,400,1200,800);
m:=false;
end;
//изображение синей точки
l:= 600-form1.Shape1.Left-5;
y:= 400-form1.Shape1.Top-5;
if l=100 then l:=101;
form1.Shape4.Left := 600-(round(100*l/(100-l)))-5;
form1.Shape4.Top := 400-(round(y*100/(100-l)))-5;
end;
if form1.Shape5.Visible=false then begin
form1.image1.Canvas.Pen.Color:=clgreen;
form1.Image1.Canvas.Pen.Width:=3;
form1.image1.Canvas.MoveTo(form1.Shape3.left+5,form1.shape3.Top+5);
form1.image1.Canvas.LineTo(form1.Shape4.left+5,form1.shape4.Top+5);
form1.Image1.Canvas.Pen.Width:=1;end;
tochka;
//построение разделенного изображения
//вычисление разделителя
if (form1.shape2.left>495) and (form1.shape1.left<495) then begin
h:=abs(form1.Shape1.Top-form1.Shape2.Top);
l:=abs(form1.Shape1.left-form1.Shape2.left);
if (form1.shape2.left>495) then a1:=form1.shape2.left-495;
if (form1.shape1.left>495) then a1:=form1.shape1.left-495;
form1.Shape5.Left:=495;
if form1.Shape1.Top>form1.Shape2.Top then form1.Shape5.top:=form1.Shape2.Top+round(a1*h/l)
else form1.Shape5.top:=form1.Shape2.Top-round(a1*h/l);
form1.shape5.Visible:=true;
end else
if (form1.shape1.left>495) and (form1.shape2.left<495) then begin
h:=abs(form1.Shape1.Top-form1.Shape2.Top);
l:=abs(form1.Shape1.left-form1.Shape2.left);
if (form1.shape2.left>495) then a1:=form1.shape2.left-495;
if (form1.shape1.left>495) then a1:=form1.shape1.left-495;
form1.Shape5.Left:=495;
if form1.Shape1.Top>form1.Shape2.Top then form1.Shape5.top:=form1.Shape1.Top-round(a1*h/l)
else form1.Shape5.top:=form1.Shape1.Top+round(a1*h/l);
form1.shape5.Visible:=true;
end else form1.shape5.Visible:=false;
if form1.shape5.Visible=true then begin
form1.image1.Canvas.Pen.Color:=clgray;
//1 лучserayaточка
if form1.CheckBox1.Checked=true then begin
lych(form1.Shape5.Left+10, form1.Shape5.Top+5,form1.Shape5.Left+10, form1.Shape5.Top+5,600,400,1200,800);
m:=true;
lych(a,b,a,b,600,400,1200,800);
m:=false;
lych(form1.Shape5.Left+10, form1.Shape5.Top+5,form1.Shape5.Left+10, form1.Shape5.Top+5,600,400,1200,800); end;
//2 лучserayaточка
if form1.CheckBox2.Checked=true then begin
lych(form1.Shape5.Left+10, form1.Shape5.Top+5,form1.Shape5.Left+10, form1.Shape5.Top+5,600,form1.Shape5.Top+5,600,800);
a1:=a;
b1:=b;
lych(a, b,a, b,700,400,1200,800);
m:=true;
lych(a1,b1,a1,b1,700,400,1200,800);
m:=false;
end;
l:= 600-form1.Shape5.Left-5;
y:= 400-form1.Shape5.Top-5;
if l=100 then l:=101;
form1.Shape6.Left := 600-(round(100*l/(l-100)))-5;
form1.Shape6.Top := 400-(round(y*100/(l-100)))-5;
form1.image1.Canvas.Pen.Color:=clpurple;
//1 лучserayaточка
if form1.CheckBox1.Checked=true then
lych(form1.Shape5.Left+10, form1.Shape5.Top+5,form1.Shape5.Left+10, form1.Shape5.Top+5,600,400,1200,800);
//2 лучserayaточка
if form1.CheckBox2.Checked=true then begin
lych(form1.Shape5.Left+10, form1.Shape5.Top+5,form1.Shape5.Left+10, form1.Shape5.Top+5,600,form1.Shape5.Top+5,600,800);
lych(a, b,a, b,700,400,1200,800); end;
l:= 600-form1.Shape5.Left-5;
y:= 400-form1.Shape5.Top-5;
if l=100 then l:=101;
form1.Shape7.Left := 600-(round(100*l/(100-l)))-5;
form1.Shape7.Top := 400-(round(y*100/(100-l)))-5;
if (form1.shape2.Left<500) and (form1.Shape1.Left>500)and(form1.Shape5.Visible=true) then begin
form1.image1.Canvas.Pen.Color:=clgreen;
form1.Image1.Canvas.Pen.Width:=3;
form1.image1.Canvas.MoveTo(form1.Shape3.left+5,form1.shape3.Top+5);
form1.image1.Canvas.LineTo(form1.Shape7.left+5,form1.shape7.Top+5);
form1.Image1.Canvas.Pen.Width:=1;
form1.image1.Canvas.Pen.Color:=clgreen;
form1.Image1.Canvas.Pen.Width:=3;
form1.image1.Canvas.MoveTo(form1.Shape4.left+5,form1.shape4.Top+5);
form1.image1.Canvas.LineTo(form1.Shape6.left+5,form1.shape6.Top+5);
form1.Image1.Canvas.Pen.Width:=1;
end
else if (form1.shape1.Left<500) and (form1.Shape2.Left>500)and(form1.Shape5.Visible=true) then begin
form1.image1.Canvas.Pen.Color:=clgreen;
form1.Image1.Canvas.Pen.Width:=3;
form1.image1.Canvas.MoveTo(form1.Shape3.left+5,form1.shape3.Top+5);
form1.image1.Canvas.LineTo(form1.Shape6.left+5,form1.shape6.Top+5);
form1.Image1.Canvas.Pen.Width:=1;
form1.image1.Canvas.Pen.Color:=clgreen;
form1.Image1.Canvas.Pen.Width:=3;
form1.image1.Canvas.MoveTo(form1.Shape4.left+5,form1.shape4.Top+5);
form1.image1.Canvas.LineTo(form1.Shape7.left+5,form1.shape7.Top+5);
form1.Image1.Canvas.Pen.Width:=1;
end;
end;
str_sob;
tochka;
sertochka;
end;
procedureras;
var l,y,h,a1,b1:integer;
begin
//raslinza
//1 луч красная точка
if form1.CheckBox1.Checked=true then
lych(form1.Shape2.Left+5, form1.Shape2.Top+5,form1.Shape2.Left+5, form1.Shape2.Top+5,600,400,1200,800);
//2 лучкраснаяточка
if form1.CheckBox2.Checked=true then begin
lych(form1.Shape2.Left+5, form1.Shape2.Top+5, form1.Shape2.Left+5, form1.Shape2.Top+5,600, form1.Shape2.Top+5,600,800);
a1:=a;
b1:=b;
lych(a, b,a, b,500,400,1200,800);
m:=true;
lych(a1,b1,a1,b1,500,400,1200,800);
m:=false; end;
form1.Shape3.Visible:=true;
l:= 600-form1.Shape2.Left+5;
y:= 400-form1.Shape2.Top+5;
form1.Shape3.Left := 600-(round(100*l/(100+l)))-5;
form1.Shape3.Top := 400-(round(y*100/(100+l)))-5;
form1.Image1.Canvas.Pen.Color:=clblue;
//1 лучsinyayaточка
if form1.CheckBox1.Checked=true then
lych(form1.Shape1.Left+5, form1.Shape1.Top+5,form1.Shape1.Left+5, form1.Shape1.Top+5,600,400,1200,800);
//2 лучsinyayaточка
if form1.CheckBox2.Checked=true then begin
lych(form1.Shape1.Left+5, form1.Shape1.Top+5, form1.Shape1.Left+5, form1.Shape1.Top+5,600, form1.Shape1.Top+5,600,800);
a1:=a;
b1:=b;
lych(a, b,a, b,500,400,1200,800);
m:=true;
lych(a1,b1,a1,b1,500,400,1200,800);
m:=false; end;
form1.Shape4.Visible:=true;
l:= 600-form1.Shape1.Left+5;
y:= 400-form1.Shape1.Top+5;
form1.Shape4.Left := 600-(round(100*l/(100+l)))-5;
form1.Shape4.Top := 400-(round(y*100/(100+l)))-5;
form1.image1.Canvas.Pen.Color:=clgreen;
form1.Image1.Canvas.Pen.Width:=3;
form1.image1.Canvas.MoveTo(form1.Shape3.left+5,form1.shape3.Top+5);
form1.image1.Canvas.LineTo(form1.Shape4.left+5,form1.shape4.Top+5);
form1.Image1.Canvas.Pen.Width:=1;
str_ras;
tochka;
end;
procedureln;
var l,y,h,a1,b1:integer;
begin
form1.Image1.Canvas.Rectangle(0,0,1200,800);
form1.Image1.Canvas.Pen.Color:=clred;
if form1.RadioButton1.Checked=true then sob;
if form1.RadioButton2.Checked=true then ras;
form1.Image1.Canvas.Pen.Style:=pssolid;
form1.image1.Canvas.Pen.Color:=clblack;
form1.image1.Canvas.MoveTo(0,400);
form1.image1.Canvas.LineTo(1200,400);
//вертикальлинзы
form1.image1.Canvas.MoveTo(600,100);
form1.image1.Canvas.LineTo(600,700);
form1.image1.Canvas.MoveTo(500,410); //f1
form1.image1.Canvas.LineTo(500,390);
form1.image1.Canvas.MoveTo(400,410); //f2
form1.image1.Canvas.LineTo(400,390);
form1.image1.Canvas.MoveTo(300,410); //f3
form1.image1.Canvas.LineTo(300,390);
form1.image1.Canvas.MoveTo(700,410); //f1'
form1.image1.Canvas.LineTo(700,390);
form1.image1.Canvas.MoveTo(800,410); //f2'
form1.image1.Canvas.LineTo(800,390);
form1.image1.Canvas.MoveTo(900,410); //f3'
form1.image1.Canvas.LineTo(900,390);
form1.Image1.Canvas.TextOut(294,415,'3F');
form1.Image1.Canvas.TextOut(394,415,'2F');
form1.Image1.Canvas.TextOut(498,415,'F');
form1.Image1.Canvas.TextOut(698,415,'F');
form1.Image1.Canvas.TextOut(794,415,'2F');
form1.Image1.Canvas.TextOut(894,415,'3F');
form1.image1.Canvas.Pen.Color:=clgreen;
form1.image1.Canvas.Pen.Width:=3;
form1.image1.Canvas.MoveTo(form1.Shape1.Left+7,form1.Shape1.top+7);
form1.image1.Canvas.LineTo(form1.Shape2.Left+7,form1.Shape2.top+7);
form1.image1.Canvas.Pen.Color:=clblack;
form1.image1.Canvas.Pen.Width:=1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.CheckBox1.Checked:=true;
form1.CheckBox2.Checked:=true;
form1.CheckBox3.Checked:=true;
form1.Shape7.Visible:=false;
form1.Shape6.Visible:=false;
m:=false; m1:=true;
form1.Image1.Canvas.Pen.Style:=psSolid;
form1.image1.Canvas.Pen.Color:=clblack;
ln;
end;
procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
Shape1.Tag:=1;
shiftY:=Y;
shiftX:=X;
end;
end;
procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
form1.Image1.Refresh;
if Shape1.Tag = 1 then
begin
if (Shape1.Left+X-shiftX<595)and (Shape1.Left+X-shiftX>5)and
(Shape1.Top+Y-shiftY<730) and (Shape1.Top+Y-shiftY>5)then begin
Shape1.Top:=Shape1.Top+Y-shiftY;
Shape1.Left:=Shape1.Left+X-shiftX;
ln; end;
end;
end;
procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Shape1.Tag:=0;
end;
procedure TForm1.Shape2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
Shape2.Tag:=1;
shiftY:=Y;
shiftX:=X;
end;
end;
procedure TForm1.Shape2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
form1.Image1.Refresh;
if Shape2.Tag = 1 then
begin
if (Shape2.Left+X-shiftX<595)and (Shape2.Left+X-shiftX>5)and
(Shape2.Top+Y-shiftY<730) and (Shape2.Top+Y-shiftY>5) then begin
Shape2.Top:=Shape2.Top+Y-shiftY;
Shape2.Left:=Shape2.Left+X-shiftX;
ln;
end; end;
end;
procedure TForm1.Shape2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Shape2.Tag:=0;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
ln;
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
form1.CheckBox3.Enabled:=true;
str_sob;
ln;
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
if form1.RadioButton2.Enabled=true then
form1.Shape5.Visible:=false;
form1.CheckBox3.Enabled:=false;
str_ras;
ln;
end;
end.
Рисуем лошадь акварелью
Городецкая роспись
Астрономический календарь. Март, 2019
Анатолий Кузнецов. Как мы с Сашкой закалялись
Рисуют дети водопад