Написание программы.
К предыдущей программе добавить процедуру построения линий, касательных к большой оси эллипса поляризации.
Процедура аналогична построению силовых линий электрического поля. Вначале необходимо выбрать расположение начальных точек, откуда будут строиться линии. Это можно сделать при помощи нескольких Checkbox, которые будут задавать начала построений этих линий. На форму дополнительно надо поместить число силовых линий ( n =12), точности nn(1000) и максимального количества шагов построения силовой линии m (10000). Отрезок для построения линий взять как ,
, , (1)
.
Поскольку азимутальный угол может изменять значение скачком, то нужно запоминать предыдущее значение угла и перед вычислением по формуле (1) проверять:
Блок 7.1. Проверка существования скачков функции | if ij>1 then if abs(psi-psi0)>0.9923*pi then begin if psi0>psi then psi:=psi+pi else psi:=psi-pi; end; |
ij – переменная для вычисления цикла построения линии.
Линия заканчивается, если она выходит за пределы изображения, если с какой-то точностью проходит через начальную точку (в случае замкнутых кривых). Для того, чтобы на изображении линии не обрывались, необходимо сделать цикл i=1,2, для i=1 прирост линии вычисляется по формуле (1), а для i=2 , в этом случае линия строится в противоположном направлении из начальной точки.
Задание начальных точек (x0,y0 можно положить равным нулю – это координыты центра изображения).
Блок 7.2 Выбор начальних точек построения. | case j of 1: {Вдоль вертикальной линии, x0=0,y0=0 – координаты центра картины} begin y:=-rmax+2*rmax/n*j+y0; x:=x0; end; 2: {Вдоль горизонтальной линии, x0=0,y0=0} begin x:=-rmax+2*rmax/n*j+x0; y:=y0; end; 3: {Вдоль диагональной 45 град. линии, x0=0,y0=0} begin x:=-rmax+2*rmax/n*j+x0; y:=-rmax+2*rmax/n *j+y0; end; 4: {Вдоль диагональной -45 град. линии, x0=0,y0=0} begin x:=-rmax+2*rmax/n*j+x0; y:=rmax-2*rmax/n*j+y0; end; 5: { По окружности, x0=0,y0=0, r_00<1} begin x:=rmax*r_00*cos(2*Pi/n*j)+x0; y:=rmax*r_00*sin(2*Pi/n*j)+y0; end; 6: {Вдоль наклонной линии под углом ang0, x0=0,y0=0} begin x:=(-rmax+2*rmax/n*j)*cos(ang0)+x0; y:=(-rmax+2*rmax/n*j)*sin(ang0)+y0; end; 7: {Из начальной точки – дополнительная линия- x_00,y_00} begin if j=1 then begin x:=x_00; y:=y_00; end else goto 1; end; end; x_0:=x; y_0:=y; |
а затем в зависимости от симметрии поля выбираются x_0, y_0 (возможно введение дополнительного цикла по различным начальным параметрам начальных точек)
Блок 7.2 Выбор начальних точек, для построения графиков | case i j of 1: {Вдоль вертикальной линии, x0=0,y0=0 – координаты центра картины} begin y:=-rmax+2*rmax/n*j+y0; x:=x0; end; 2: {Вдоль горизонтальной линии, x0=0,y0=0} begin x:=-rmax+2*rmax/n*j+x0; y:=y0; end; 3: {Вдоль диагональной 45 град. линии, x0=0,y0=0} begin x:=-rmax+2*rmax/n*j+x0; y:=-rmax+2*rmax/n *j+y0; end; 4: {Вдоль диагональной -45 град. линии, x0=0,y0=0} begin x:=-rmax+2*rmax/n*j+x0; y:=rmax-2*rmax/n*j+y0; end; 5: { По окружности, x0=0,y0=0, r_00<1} begin x:=rmax*r_00*cos(2*Pi/n*j)+x0; y:=rmax*r_00*sin(2*Pi/n*j)+y0; end; 6: {Вдоль наклонной линии под углом ang0, x0=0,y0=0} begin x:=(-rmax+2*rmax/n*j)*cos(ang0)+x0; y:=(-rmax+2*rmax/n*j)*sin(ang0)+y0; end; 7: {Из начальной точки – дополнительная линия- x_00,y_00} begin if j=1 then begin x:=x_00; y:=y_00; end else break; end; end; x_0:=x; y_0:=y; |
Далее производится переход к этой точке на Image:
Блок 7.3 Переход к точке. | Form1.Image1.Canvas.Moveto[Image1.width div 2+Round(Image.width/2*x_0), Image1.width div 2-Round(Image.width/2*y_0)]; |
3-й цикл k:=1 до m – непосредственно строит силовую линию.
Вначале запоминается предыдущее значение азимутального угла psi 0:= psi ;
Далее вызывается процедура расчета поля , делается проверка
Блок 7.4 Построение отрезка. | if ij>1 then if abs(psi-psi0)>0.9923*pi then begin if psi 0> psi then psi := psi + pi else psi := psi - pi ; end ; |
и вычисляются dx,dy.
Делается проверка: if i =2 then dx :=- dx ; dy :=- dy ; далее изменяются x,y и строится отрезок линии
Блок 7.5 Построение отрезка. | Form1.Image1.Canvas.Lineto[Image1.width div 2+Round(Image.width/2*x), Image1.width div 2-Round(Image.width/2*y)]; |
После этого проверяется не вышла ли линия за пределы экрана
Блок 7.6 Построение отрезка. | If ((abs(x)>rmax) or (abs(y)>rmax)) then break; |
И не замкнулась ли линия
Блок 7.7 Построение отрезка. | If ((k>30) and (sqrt(sqr(x-x_0)+sqr(y-y_0))<5*d)) then break; |
По окончании всех вычислений, программа должна построить изображение, представленное на рис. 10
Рис. 10. Вид окна программы, с результатами выполнения задания |
ПРАКТИЧЕСКОЕ ЗАДАНИЕ 8.
Дата: 2019-02-02, просмотров: 236.