VERSION 5.00
Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx"
Begin VB.Form Form4 
   Caption         =   "Maikelson1     form4    Вычислительный эксперимент Майкельсона-Морли "
   ClientHeight    =   10740
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   12615
   Icon            =   "Form4.frx":0000
   LinkTopic       =   "Form1"
   ScaleHeight     =   716
   ScaleMode       =   3  'Пиксель
   ScaleWidth      =   841
   Begin VB.CheckBox Check24 
      Caption         =   "Check24"
      Height          =   255
      Left            =   8340
      TabIndex        =   180
      Top             =   9120
      Visible         =   0   'False
      Width           =   135
   End
   Begin VB.CheckBox Check23 
      Caption         =   "Skip"
      Height          =   195
      Left            =   7680
      TabIndex        =   179
      Top             =   10200
      Value           =   1  'Отмечено
      Width           =   615
   End
   Begin VB.TextBox Text41 
      Height          =   285
      Left            =   10080
      TabIndex        =   178
      Text            =   "90"
      Top             =   720
      Width           =   495
   End
   Begin VB.TextBox Text29 
      Height          =   285
      Left            =   9960
      TabIndex        =   176
      Text            =   "0,3"
      Top             =   420
      Width           =   570
   End
   Begin VB.CheckBox Check7 
      Caption         =   "+ сравнительный расчет"
      Height          =   195
      Left            =   10440
      TabIndex        =   174
      Top             =   9150
      Width           =   2295
   End
   Begin VB.CheckBox Check21 
      Caption         =   "+ аберрация луча"
      Height          =   195
      Left            =   8400
      TabIndex        =   173
      Top             =   8040
      Value           =   1  'Отмечено
      Width           =   1695
   End
   Begin VB.CheckBox Check16 
      Caption         =   "+ N1, N2"
      Height          =   195
      Left            =   11520
      TabIndex        =   172
      Top             =   9720
      Value           =   1  'Отмечено
      Width           =   975
   End
   Begin VB.CommandButton Command14 
      Caption         =   "Остановить"
      Height          =   255
      Left            =   8880
      TabIndex        =   171
      Top             =   9840
      Width           =   1215
   End
   Begin VB.CommandButton Command13 
      Caption         =   "Расчет Майкельсона"
      Height          =   255
      Left            =   8520
      TabIndex        =   170
      Top             =   9120
      Width           =   1935
   End
   Begin VB.Frame Frame4 
      Height          =   360
      Left            =   10440
      TabIndex        =   167
      Top             =   7770
      Width           =   2175
      Begin VB.OptionButton Option6 
         Caption         =   "частоту"
         Height          =   195
         Left            =   1200
         TabIndex        =   169
         Top             =   120
         Width           =   975
      End
      Begin VB.OptionButton Option2 
         Caption         =   "скорость"
         Height          =   195
         Left            =   120
         TabIndex        =   168
         Top             =   120
         Value           =   -1  'True
         Width           =   1095
      End
   End
   Begin VB.CommandButton Command10 
      Caption         =   "Продолжить"
      Height          =   255
      Left            =   10200
      TabIndex        =   166
      Top             =   9840
      Width           =   1215
   End
   Begin MSComDlg.CommonDialog CD1 
      Left            =   9720
      Top             =   960
      _ExtentX        =   847
      _ExtentY        =   847
      _Version        =   393216
   End
   Begin VB.TextBox Text57 
      Height          =   285
      Left            =   10485
      TabIndex        =   164
      Text            =   "10"
      Top             =   7350
      Width           =   600
   End
   Begin VB.CheckBox Check26 
      Caption         =   "+++ по статическим углам"
      Height          =   195
      Left            =   10200
      TabIndex        =   161
      Top             =   7590
      Width           =   2415
   End
   Begin VB.CheckBox Check33 
      Caption         =   "++ аналитически"
      Height          =   195
      Left            =   8520
      TabIndex        =   160
      Top             =   7590
      Width           =   1575
   End
   Begin VB.CheckBox Check29 
      Caption         =   "+++ Хедрик"
      Height          =   255
      Left            =   11400
      TabIndex        =   159
      Top             =   6660
      Width           =   1215
   End
   Begin VB.CheckBox Check28 
      Caption         =   "++ Юдин"
      Height          =   255
      Left            =   10320
      TabIndex        =   158
      Top             =   6660
      Width           =   930
   End
   Begin VB.CheckBox Check27 
      Caption         =   "+его диаметр на экране"
      Height          =   195
      Left            =   9840
      TabIndex        =   157
      Top             =   1680
      Width           =   2175
   End
   Begin VB.CommandButton Command12 
      Caption         =   "Загрузить размеры и углы из файла"
      Height          =   255
      Left            =   7680
      TabIndex        =   154
      Top             =   10440
      Width           =   3375
   End
   Begin VB.CommandButton Command11 
      Caption         =   "Сохранить размеры и углы в файле"
      Height          =   255
      Left            =   8400
      TabIndex        =   153
      Top             =   10140
      Width           =   2895
   End
   Begin VB.CheckBox Check6 
      Caption         =   "+ в ИСО"
      Height          =   195
      Left            =   11520
      TabIndex        =   152
      Top             =   9930
      Value           =   1  'Отмечено
      Width           =   945
   End
   Begin VB.TextBox Text39 
      Height          =   285
      Left            =   11400
      TabIndex        =   151
      Text            =   "m3p3_80"
      Top             =   10140
      Width           =   1215
   End
   Begin VB.CheckBox Check20 
      Caption         =   "++ траектории"
      Height          =   195
      Left            =   11160
      TabIndex        =   147
      Top             =   7410
      Width           =   1455
   End
   Begin VB.CheckBox Check22 
      Caption         =   "+ v10=v01"
      Height          =   195
      Left            =   10485
      TabIndex        =   146
      Top             =   8640
      Width           =   1095
   End
   Begin VB.TextBox Text76 
      Height          =   285
      Left            =   5520
      TabIndex        =   145
      Text            =   "Text76"
      Top             =   10440
      Width           =   2010
   End
   Begin VB.TextBox Text75 
      Height          =   285
      Left            =   5520
      TabIndex        =   144
      Text            =   "Text75"
      Top             =   10140
      Width           =   2010
   End
   Begin VB.CommandButton Command1 
      Caption         =   "Моделирование сплошного эффекта Доплера с параметрами полученными при проведение эксперимента"
      Height          =   255
      Left            =   120
      TabIndex        =   141
      Top             =   9840
      Width           =   8655
   End
   Begin VB.TextBox Text74 
      Height          =   285
      Left            =   3000
      TabIndex        =   139
      Text            =   "Text74"
      Top             =   10440
      Width           =   1890
   End
   Begin VB.TextBox Text73 
      Height          =   285
      Left            =   3000
      TabIndex        =   138
      Text            =   "Text73"
      Top             =   10140
      Width           =   1890
   End
   Begin VB.TextBox Text72 
      Height          =   285
      Left            =   720
      TabIndex        =   137
      Text            =   "Text72"
      Top             =   10440
      Width           =   1575
   End
   Begin VB.CheckBox Check19 
      Caption         =   "Auto"
      Height          =   195
      Left            =   8520
      TabIndex        =   136
      Top             =   7380
      Value           =   1  'Отмечено
      Width           =   630
   End
   Begin VB.TextBox Text71 
      Height          =   285
      Left            =   720
      TabIndex        =   135
      Text            =   "Text71"
      Top             =   10140
      Width           =   1575
   End
   Begin VB.CheckBox Check18 
      Caption         =   "+ 2-й лазер с  L2, м"
      Height          =   195
      Left            =   9840
      TabIndex        =   134
      Top             =   2310
      Width           =   1890
   End
   Begin VB.TextBox Text69 
      Height          =   285
      Left            =   12120
      TabIndex        =   133
      Text            =   "2"
      Top             =   1320
      Width           =   495
   End
   Begin VB.CheckBox Check13 
      Caption         =   " Auto"
      Height          =   195
      Left            =   9720
      TabIndex        =   131
      Top             =   8640
      Value           =   1  'Отмечено
      Width           =   735
   End
   Begin VB.CheckBox Check12 
      Caption         =   "++ детали с ML="
      Height          =   195
      Left            =   10200
      TabIndex        =   125
      Top             =   7140
      Width           =   1575
   End
   Begin VB.TextBox Text63 
      Height          =   285
      Left            =   10800
      TabIndex        =   122
      Text            =   "0,001"
      Top             =   8280
      Width           =   1815
   End
   Begin VB.TextBox Text60 
      Height          =   285
      Left            =   11760
      TabIndex        =   121
      Text            =   "0,0065"
      Top             =   2280
      Width           =   855
   End
   Begin VB.TextBox Text54 
      Height          =   285
      Left            =   11760
      TabIndex        =   119
      Text            =   "2"
      Top             =   7110
      Width           =   495
   End
   Begin VB.TextBox Text53 
      Height          =   285
      Left            =   6840
      TabIndex        =   118
      Text            =   "Text53"
      Top             =   9120
      Width           =   1095
   End
   Begin VB.TextBox Text46 
      Height          =   285
      Left            =   6000
      TabIndex        =   117
      Text            =   "1E3"
      Top             =   9120
      Width           =   615
   End
   Begin VB.CheckBox Check1 
      Caption         =   "+ эффект Доплера "
      Height          =   195
      Left            =   8400
      TabIndex        =   116
      Top             =   7140
      Value           =   1  'Отмечено
      Width           =   1815
   End
   Begin VB.TextBox Text42 
      Height          =   285
      Left            =   4560
      TabIndex        =   115
      Text            =   "Text42"
      Top             =   9120
      Width           =   975
   End
   Begin VB.CommandButton Command9 
      Caption         =   "Перенести данные на форму расчета интерференции"
      Height          =   255
      Left            =   8160
      TabIndex        =   114
      Top             =   9480
      Width           =   4455
   End
   Begin VB.CheckBox Check15 
      Caption         =   "номер пути луча 2"
      Height          =   195
      Left            =   10560
      TabIndex        =   113
      Top             =   3390
      Value           =   1  'Отмечено
      Width           =   1695
   End
   Begin VB.CheckBox Check14 
      Caption         =   "номер пути луча 1"
      Height          =   195
      Left            =   8340
      TabIndex        =   112
      Top             =   3390
      Value           =   1  'Отмечено
      Width           =   1695
   End
   Begin VB.TextBox Text67 
      Height          =   285
      Left            =   8880
      TabIndex        =   109
      Text            =   "0"
      Top             =   1680
      Width           =   855
   End
   Begin VB.TextBox Text66 
      Height          =   285
      Left            =   8880
      TabIndex        =   108
      Text            =   "0"
      Top             =   1380
      Width           =   855
   End
   Begin VB.TextBox Text62 
      Height          =   285
      Left            =   8640
      TabIndex        =   103
      Text            =   "85"
      Top             =   5160
      Width           =   1935
   End
   Begin VB.TextBox Text61 
      Height          =   285
      Left            =   8640
      TabIndex        =   101
      Text            =   "95"
      Top             =   4860
      Width           =   1935
   End
   Begin VB.CheckBox Check11 
      Caption         =   "анимация"
      Height          =   195
      Left            =   9720
      TabIndex        =   100
      Top             =   8880
      Value           =   1  'Отмечено
      Width           =   1050
   End
   Begin VB.CheckBox Check10 
      Caption         =   "текст"
      Height          =   195
      Left            =   11880
      TabIndex        =   99
      Top             =   8880
      Value           =   1  'Отмечено
      Width           =   735
   End
   Begin VB.CheckBox Check9 
      Caption         =   "+ фронты"
      Height          =   195
      Left            =   10800
      TabIndex        =   98
      Top             =   8880
      Value           =   1  'Отмечено
      Width           =   1095
   End
   Begin VB.CheckBox Check8 
      Caption         =   "+ преломление света в движущихся пластинах"
      Height          =   195
      Left            =   8400
      TabIndex        =   97
      Top             =   6900
      Width           =   4215
   End
   Begin VB.TextBox Text52 
      Height          =   285
      Left            =   11040
      TabIndex        =   96
      Text            =   "10"
      Top             =   5160
      Width           =   1575
   End
   Begin VB.TextBox Text51 
      Height          =   285
      Left            =   11040
      TabIndex        =   95
      Text            =   "10"
      Top             =   4860
      Width           =   1575
   End
   Begin VB.Frame Frame2 
      Caption         =   "параметры"
      Height          =   495
      Left            =   120
      TabIndex        =   92
      Top             =   8520
      Width           =   1455
      Begin VB.OptionButton Option7 
         Caption         =   "Real"
         Height          =   195
         Left            =   720
         TabIndex        =   94
         Top             =   240
         Width           =   660
      End
      Begin VB.OptionButton Option4 
         Caption         =   "Test"
         Height          =   195
         Left            =   60
         TabIndex        =   93
         Top             =   240
         Value           =   -1  'True
         Width           =   615
      End
   End
   Begin VB.TextBox Text48 
      Height          =   285
      Left            =   12240
      TabIndex        =   91
      Text            =   "Text48"
      Top             =   3360
      Width           =   375
   End
   Begin VB.TextBox Text47 
      Height          =   285
      Left            =   10080
      TabIndex        =   90
      Text            =   "Text47"
      Top             =   3360
      Width           =   375
   End
   Begin VB.CheckBox Check4 
      Caption         =   "+ влияние среды на"
      Height          =   195
      Left            =   8400
      TabIndex        =   89
      Top             =   7830
      Value           =   1  'Отмечено
      Width           =   1935
   End
   Begin VB.TextBox Text38 
      Height          =   285
      Left            =   11040
      TabIndex        =   83
      Text            =   "20"
      Top             =   6360
      Width           =   1575
   End
   Begin VB.TextBox Text37 
      Height          =   285
      Left            =   11040
      TabIndex        =   82
      Text            =   "20"
      Top             =   6060
      Width           =   1575
   End
   Begin VB.TextBox Text36 
      Height          =   285
      Left            =   11040
      TabIndex        =   81
      Text            =   "Text36"
      Top             =   5760
      Width           =   1575
   End
   Begin VB.TextBox Text35 
      Height          =   285
      Left            =   11040
      TabIndex        =   80
      Text            =   "Text35"
      Top             =   5460
      Width           =   1575
   End
   Begin VB.TextBox Text34 
      Height          =   285
      Left            =   9000
      TabIndex        =   79
      Text            =   "0,01"
      Top             =   6360
      Width           =   1695
   End
   Begin VB.TextBox Text33 
      Height          =   285
      Left            =   9000
      TabIndex        =   78
      Text            =   "0,01"
      Top             =   6060
      Width           =   1695
   End
   Begin VB.TextBox Text32 
      Height          =   285
      Left            =   8640
      TabIndex        =   77
      Text            =   "1"
      Top             =   5760
      Width           =   1935
   End
   Begin VB.TextBox Text31 
      Height          =   285
      Left            =   8640
      TabIndex        =   76
      Text            =   "1"
      Top             =   5460
      Width           =   1935
   End
   Begin VB.CheckBox Check2 
      Caption         =   "+ движение зеркал"
      Height          =   195
      Left            =   8400
      TabIndex        =   74
      Top             =   6660
      Value           =   1  'Отмечено
      Width           =   1785
   End
   Begin VB.TextBox Text40 
      Height          =   285
      Left            =   3360
      TabIndex        =   72
      Text            =   "1E-7"
      Top             =   9120
      Width           =   615
   End
   Begin VB.TextBox Text27 
      Height          =   285
      Left            =   12120
      TabIndex        =   70
      Text            =   "0,8"
      Top             =   720
      Width           =   495
   End
   Begin VB.TextBox Text23 
      Height          =   285
      Left            =   11040
      TabIndex        =   69
      Text            =   "Text23"
      Top             =   3660
      Width           =   1575
   End
   Begin VB.CommandButton Command7 
      Caption         =   "Начать эксперимент"
      Height          =   255
      Left            =   120
      TabIndex        =   68
      Top             =   9120
      Width           =   1935
   End
   Begin VB.Frame Frame1 
      Caption         =   "схема"
      Height          =   495
      Left            =   1680
      TabIndex        =   66
      Top             =   8520
      Width           =   7935
      Begin VB.TextBox Text49 
         Height          =   285
         Left            =   6000
         TabIndex        =   162
         Text            =   "0,05"
         Top             =   150
         Width           =   495
      End
      Begin VB.TextBox Text99 
         Height          =   285
         Left            =   7060
         TabIndex        =   156
         Text            =   "1,000304"
         Top             =   150
         Width           =   800
      End
      Begin VB.CheckBox Check25 
         Caption         =   "+ цилиндр "
         Height          =   195
         Left            =   4900
         TabIndex        =   155
         Top             =   240
         Width           =   1060
      End
      Begin VB.CheckBox Check17 
         Caption         =   "++ Alfa4"
         Height          =   195
         Left            =   3960
         TabIndex        =   140
         Top             =   240
         Width           =   975
      End
      Begin VB.CheckBox Check3 
         Caption         =   "+ Alfa3=Alfa3/2"
         Height          =   195
         Left            =   2480
         TabIndex        =   124
         Top             =   240
         Width           =   1455
      End
      Begin VB.OptionButton Option8 
         Caption         =   "2- Юдин"
         Height          =   195
         Left            =   1520
         TabIndex        =   107
         Top             =   240
         Value           =   -1  'True
         Width           =   900
      End
      Begin VB.OptionButton Option1 
         Caption         =   "1- Майкельсон"
         Height          =   195
         Left            =   60
         TabIndex        =   67
         Top             =   240
         Width           =   1455
      End
      Begin VB.Label Label30 
         Caption         =   "м с n="
         Height          =   255
         Left            =   6520
         TabIndex        =   163
         Top             =   200
         Width           =   495
      End
   End
   Begin VB.TextBox Text26 
      Height          =   285
      Left            =   11040
      TabIndex        =   65
      Text            =   "Text26"
      Top             =   4560
      Width           =   1575
   End
   Begin VB.TextBox Text25 
      Height          =   285
      Left            =   11040
      TabIndex        =   61
      Text            =   "Text25"
      Top             =   4260
      Width           =   1575
   End
   Begin VB.TextBox Text11 
      Height          =   285
      Left            =   11760
      TabIndex        =   60
      Text            =   "1,0003"
      Top             =   120
      Width           =   855
   End
   Begin VB.TextBox Text50 
      Height          =   285
      Left            =   9120
      TabIndex        =   59
      Text            =   "3"
      Top             =   420
      Width           =   570
   End
   Begin VB.TextBox Text44 
      Height          =   285
      Left            =   9000
      TabIndex        =   53
      Text            =   "90"
      Top             =   720
      Width           =   495
   End
   Begin VB.TextBox Text30 
      Height          =   285
      Left            =   12120
      TabIndex        =   50
      Text            =   "20"
      Top             =   1605
      Width           =   495
   End
   Begin VB.TextBox Text28 
      Height          =   285
      Left            =   12120
      TabIndex        =   49
      Text            =   "100"
      Top             =   1020
      Width           =   495
   End
   Begin VB.TextBox Text22 
      Height          =   285
      Left            =   12000
      TabIndex        =   48
      Text            =   "1,5"
      Top             =   420
      Width           =   615
   End
   Begin VB.CheckBox Check5 
      Caption         =   "отчет"
      Height          =   195
      Left            =   11880
      TabIndex        =   46
      Top             =   8640
      Width           =   735
   End
   Begin VB.TextBox Text24 
      Height          =   285
      Left            =   11040
      TabIndex        =   45
      Text            =   "text24"
      Top             =   3960
      Width           =   1575
   End
   Begin VB.TextBox Text21 
      Height          =   285
      Left            =   5760
      TabIndex        =   43
      Text            =   "1"
      Top             =   8280
      Width           =   375
   End
   Begin VB.TextBox Text20 
      Height          =   285
      Left            =   7680
      TabIndex        =   42
      Text            =   "0,001"
      Top             =   8280
      Width           =   1815
   End
   Begin VB.TextBox Text19 
      Height          =   285
      Left            =   1620
      TabIndex        =   40
      Text            =   "0,1"
      Top             =   8280
      Width           =   495
   End
   Begin VB.TextBox Text18 
      Height          =   285
      Left            =   11760
      TabIndex        =   38
      Text            =   "0,0065"
      Top             =   1980
      Width           =   855
   End
   Begin VB.TextBox Text17 
      Height          =   285
      Left            =   6120
      TabIndex        =   37
      Text            =   "Text17"
      Top             =   9480
      Width           =   1935
   End
   Begin VB.TextBox Text16 
      Height          =   285
      Left            =   8640
      TabIndex        =   35
      Text            =   "0"
      Top             =   4560
      Width           =   1935
   End
   Begin VB.TextBox Text15 
      Height          =   285
      Left            =   8640
      TabIndex        =   34
      Text            =   "0"
      Top             =   4260
      Width           =   1935
   End
   Begin VB.TextBox Text14 
      Height          =   285
      Left            =   8640
      TabIndex        =   29
      Text            =   "Text14"
      Top             =   3960
      Width           =   1935
   End
   Begin VB.TextBox Text13 
      Height          =   285
      Left            =   8640
      TabIndex        =   28
      Text            =   "Text13"
      Top             =   3660
      Width           =   1935
   End
   Begin VB.TextBox Text12 
      Height          =   285
      Left            =   9240
      TabIndex        =   27
      Text            =   "30"
      Top             =   120
      Width           =   975
   End
   Begin VB.TextBox Text10 
      Height          =   285
      Left            =   5040
      TabIndex        =   25
      Text            =   "10"
      Top             =   9480
      Width           =   645
   End
   Begin VB.TextBox Text9 
      Height          =   285
      Left            =   8880
      TabIndex        =   23
      Text            =   "-0,3"
      Top             =   2700
      Width           =   855
   End
   Begin VB.CommandButton Command6 
      Caption         =   "Сохранить рисунок №"
      Height          =   255
      Left            =   3840
      TabIndex        =   22
      Top             =   8280
      Width           =   1935
   End
   Begin VB.CommandButton Command5 
      Caption         =   "Очистить рисунок"
      Height          =   255
      Left            =   2190
      TabIndex        =   21
      Top             =   8280
      Width           =   1575
   End
   Begin VB.CommandButton Command4 
      Caption         =   "Сделать NC0 шагов решения"
      Height          =   255
      Left            =   2670
      TabIndex        =   20
      Top             =   9480
      Width           =   2385
   End
   Begin VB.CommandButton Command3 
      Caption         =   "Продолжить"
      Height          =   255
      Left            =   1350
      TabIndex        =   19
      Top             =   9480
      Width           =   1275
   End
   Begin VB.CommandButton Command2 
      Caption         =   "Остановить"
      Height          =   255
      Left            =   120
      TabIndex        =   18
      Top             =   9480
      Width           =   1185
   End
   Begin VB.TextBox Text8 
      Height          =   285
      Left            =   8880
      TabIndex        =   15
      Text            =   "0,5"
      Top             =   3000
      Width           =   855
   End
   Begin VB.PictureBox Picture1 
      AutoRedraw      =   -1  'True
      BackColor       =   &H8000000E&
      ForeColor       =   &H80000008&
      Height          =   8250
      Left            =   45
      ScaleHeight     =   546
      ScaleMode       =   3  'Пиксель
      ScaleWidth      =   547
      TabIndex        =   13
      Top             =   0
      Width           =   8265
   End
   Begin VB.TextBox Text7 
      Height          =   285
      Left            =   11760
      TabIndex        =   12
      Text            =   "135"
      Top             =   3000
      Width           =   855
   End
   Begin VB.TextBox Text6 
      Height          =   285
      Left            =   11760
      TabIndex        =   11
      Text            =   "135"
      Top             =   2700
      Width           =   855
   End
   Begin VB.TextBox Text5 
      Height          =   285
      Left            =   10260
      TabIndex        =   10
      Text            =   "58,288931"
      Top             =   3000
      Width           =   975
   End
   Begin VB.TextBox Text4 
      Height          =   285
      Left            =   10260
      TabIndex        =   9
      Text            =   "121,711069"
      Top             =   2700
      Width           =   975
   End
   Begin VB.TextBox Text3 
      Height          =   285
      Left            =   8880
      TabIndex        =   8
      Text            =   "0,6"
      Top             =   2280
      Width           =   855
   End
   Begin VB.TextBox Text2 
      Height          =   285
      Left            =   8880
      TabIndex        =   7
      Text            =   "1"
      Top             =   1980
      Width           =   855
   End
   Begin VB.TextBox Text1 
      Height          =   285
      Left            =   8880
      TabIndex        =   6
      Text            =   "-1"
      Top             =   1080
      Width           =   855
   End
   Begin VB.CommandButton Command16 
      Caption         =   "Закрыть форму"
      Height          =   255
      Left            =   11160
      TabIndex        =   1
      Top             =   10440
      Width           =   1455
   End
   Begin VB.Label Label49 
      Caption         =   "Alfa(Vz)"
      Height          =   255
      Left            =   9525
      TabIndex        =   177
      Top             =   750
      Width           =   615
   End
   Begin VB.Label Label37 
      Caption         =   "Vz"
      Height          =   255
      Left            =   9720
      TabIndex        =   175
      Top             =   450
      Width           =   255
   End
   Begin VB.Label Label40 
      Caption         =   "N0 периодов="
      Height          =   255
      Left            =   9360
      TabIndex        =   165
      Top             =   7380
      Width           =   1095
   End
   Begin VB.Label Label39 
      Caption         =   "X2ф2л"
      Height          =   255
      Left            =   4920
      TabIndex        =   150
      Top             =   10470
      Width           =   735
   End
   Begin VB.Label Label33 
      Caption         =   "X1ф2л"
      Height          =   255
      Left            =   4920
      TabIndex        =   149
      Top             =   10200
      Width           =   495
   End
   Begin VB.Label Label5 
      Caption         =   "X2ф1л"
      Height          =   255
      Left            =   2400
      TabIndex        =   148
      Top             =   10440
      Width           =   735
   End
   Begin VB.Label Label36 
      Caption         =   "v2/v01"
      Height          =   255
      Left            =   120
      TabIndex        =   143
      Top             =   10470
      Width           =   615
   End
   Begin VB.Label Label27 
      Caption         =   "v1/v01"
      Height          =   255
      Left            =   120
      TabIndex        =   142
      Top             =   10200
      Width           =   615
   End
   Begin VB.Label Label48 
      Caption         =   " диаметр луча лазера, мм"
      Height          =   255
      Left            =   10080
      TabIndex        =   132
      Top             =   1380
      Width           =   2055
   End
   Begin VB.Label Label47 
      Caption         =   " * L1"
      Height          =   255
      Left            =   12240
      TabIndex        =   130
      Top             =   7140
      Width           =   375
   End
   Begin VB.Label Label46 
      Caption         =   " * L1"
      Height          =   255
      Left            =   7920
      TabIndex        =   129
      Top             =   9150
      Width           =   375
   End
   Begin VB.Label Label45 
      Caption         =   " * L1 /"
      Height          =   255
      Left            =   5520
      TabIndex        =   128
      Top             =   9150
      Width           =   495
   End
   Begin VB.Label Label44 
      Caption         =   "* Vs="
      Height          =   255
      Left            =   4080
      TabIndex        =   127
      Top             =   9150
      Width           =   735
   End
   Begin VB.Label Label43 
      Caption         =   "X1ф1л"
      Height          =   255
      Left            =   2400
      TabIndex        =   126
      Top             =   10200
      Width           =   495
   End
   Begin VB.Label Label42 
      Caption         =   " v02=Vs/L2, МГц"
      Height          =   255
      Left            =   9480
      TabIndex        =   123
      Top             =   8280
      Width           =   1335
   End
   Begin VB.Label Label38 
      Caption         =   " ="
      Height          =   255
      Left            =   6600
      TabIndex        =   120
      Top             =   9120
      Width           =   255
   End
   Begin VB.Label Label56 
      Caption         =   "X2, м"
      Height          =   255
      Left            =   8400
      TabIndex        =   111
      Top             =   1710
      Width           =   495
   End
   Begin VB.Label Label55 
      Caption         =   "Y1, м"
      Height          =   255
      Left            =   8400
      TabIndex        =   110
      Top             =   1440
      Width           =   495
   End
   Begin VB.Label Label53 
      Caption         =   "N2"
      Height          =   255
      Left            =   10800
      TabIndex        =   106
      Top             =   5160
      Width           =   255
   End
   Begin VB.Label Label52 
      Caption         =   "N1"
      Height          =   255
      Left            =   10800
      TabIndex        =   105
      Top             =   4920
      Width           =   255
   End
   Begin VB.Label Label51 
      Caption         =   "A2"
      Height          =   255
      Left            =   8400
      TabIndex        =   104
      Top             =   5160
      Width           =   375
   End
   Begin VB.Label Label50 
      Caption         =   "A1"
      Height          =   255
      Left            =   8400
      TabIndex        =   102
      Top             =   4920
      Width           =   375
   End
   Begin VB.Label Label32 
      Caption         =   "T, с"
      Height          =   255
      Left            =   5760
      TabIndex        =   88
      Top             =   9480
      Width           =   495
   End
   Begin VB.Label Label29 
      Caption         =   "V2"
      Height          =   255
      Left            =   10800
      TabIndex        =   87
      Top             =   6360
      Width           =   255
   End
   Begin VB.Label Label28 
      Caption         =   "V1"
      Height          =   255
      Left            =   10800
      TabIndex        =   86
      Top             =   6120
      Width           =   255
   End
   Begin VB.Label Label23 
      Caption         =   "S2"
      Height          =   255
      Left            =   10800
      TabIndex        =   85
      Top             =   5760
      Width           =   255
   End
   Begin VB.Label Label22 
      Caption         =   "S1"
      Height          =   255
      Left            =   10800
      TabIndex        =   84
      Top             =   5520
      Width           =   255
   End
   Begin VB.Label Label21 
      Caption         =   "T2"
      Height          =   255
      Left            =   8400
      TabIndex        =   75
      Top             =   5760
      Width           =   255
   End
   Begin VB.Label Label20 
      Caption         =   " v01=Vs/L1, МГц"
      Height          =   255
      Left            =   6360
      TabIndex        =   73
      Top             =   8280
      Width           =   1335
   End
   Begin VB.Label Label17 
      Caption         =   "Y5, м"
      Height          =   255
      Left            =   8400
      TabIndex        =   71
      Top             =   2760
      Width           =   495
   End
   Begin VB.Label Label26 
      Caption         =   "толщина пластин, мм"
      Height          =   255
      Left            =   10320
      TabIndex        =   64
      Top             =   1050
      Width           =   1695
   End
   Begin VB.Label Label25 
      Caption         =   "плотность  среды"
      Height          =   255
      Left            =   10320
      TabIndex        =   63
      Top             =   120
      Width           =   1575
   End
   Begin VB.Label Label24 
      Caption         =   "Vss, км/с"
      Height          =   255
      Left            =   8370
      TabIndex        =   62
      Top             =   450
      Width           =   855
   End
   Begin VB.Label Label41 
      Caption         =   "v2/v02"
      Height          =   255
      Left            =   8400
      TabIndex        =   58
      Top             =   6360
      Width           =   615
   End
   Begin VB.Label Label35 
      Caption         =   "VY2"
      Height          =   255
      Left            =   10680
      TabIndex        =   57
      Top             =   4560
      Width           =   375
   End
   Begin VB.Label Label34 
      Caption         =   "VY1"
      Height          =   255
      Left            =   10680
      TabIndex        =   56
      Top             =   4320
      Width           =   495
   End
   Begin VB.Label Label19 
      Caption         =   "VX2"
      Height          =   255
      Left            =   10680
      TabIndex        =   55
      Top             =   3990
      Width           =   375
   End
   Begin VB.Label Label13 
      Caption         =   "VX1"
      Height          =   255
      Left            =   10680
      TabIndex        =   54
      Top             =   3720
      Width           =   375
   End
   Begin VB.Label Label31 
      Caption         =   "X6, м"
      Height          =   255
      Left            =   8400
      TabIndex        =   52
      Top             =   3060
      Width           =   495
   End
   Begin VB.Label Label16 
      Caption         =   "плотность стекла"
      Height          =   255
      Left            =   10560
      TabIndex        =   51
      Top             =   450
      Width           =   1455
   End
   Begin VB.Label Label7 
      Caption         =   "ширина зеркал, м"
      Height          =   255
      Left            =   10680
      TabIndex        =   47
      Top             =   750
      Width           =   1440
   End
   Begin VB.Label Label18 
      Caption         =   "  Vs0, км/с"
      Height          =   255
      Left            =   8280
      TabIndex        =   44
      Top             =   180
      Width           =   855
   End
   Begin VB.Label Label15 
      Caption         =   "v1/v01"
      Height          =   255
      Left            =   8400
      TabIndex        =   41
      Top             =   6120
      Width           =   495
   End
   Begin VB.Label Label14 
      Caption         =   "Масштаб ML, м/см"
      Height          =   255
      Left            =   120
      TabIndex        =   39
      Top             =   8280
      Width           =   1575
   End
   Begin VB.Label Label12 
      Caption         =   "T1"
      Height          =   255
      Left            =   8400
      TabIndex        =   36
      Top             =   5520
      Width           =   255
   End
   Begin VB.Label Label11 
      Caption         =   "Y2"
      Height          =   255
      Left            =   8400
      TabIndex        =   33
      Top             =   4560
      Width           =   375
   End
   Begin VB.Label Label10 
      Caption         =   "Y1"
      Height          =   255
      Left            =   8400
      TabIndex        =   32
      Top             =   4320
      Width           =   375
   End
   Begin VB.Label Label9 
      Caption         =   "X2"
      Height          =   255
      Left            =   8400
      TabIndex        =   31
      Top             =   3990
      Width           =   375
   End
   Begin VB.Label Label8 
      Caption         =   "X1"
      Height          =   255
      Left            =   8400
      TabIndex        =   30
      Top             =   3720
      Width           =   255
   End
   Begin VB.Label Label6 
      Caption         =   " длина волны L1, м"
      Height          =   255
      Left            =   10110
      TabIndex        =   26
      Top             =   2010
      Width           =   1575
   End
   Begin VB.Label Label4 
      Caption         =   "шаг решения, с"
      Height          =   255
      Left            =   2160
      TabIndex        =   24
      Top             =   9150
      Width           =   1215
   End
   Begin VB.Label Label3 
      Caption         =   "Alfa(Vss)"
      Height          =   255
      Left            =   8340
      TabIndex        =   17
      Top             =   750
      Width           =   735
   End
   Begin VB.Label Label2 
      Caption         =   " Alfa4"
      Height          =   255
      Left            =   11280
      TabIndex        =   16
      Top             =   3060
      Width           =   495
   End
   Begin VB.Label Label1 
      Caption         =   " Alfa3"
      Height          =   255
      Left            =   11280
      TabIndex        =   14
      Top             =   2760
      Width           =   495
   End
   Begin VB.Label Label71 
      Caption         =   " Alfa1"
      Height          =   255
      Left            =   9780
      TabIndex        =   5
      Top             =   2760
      Width           =   495
   End
   Begin VB.Label Label70 
      Caption         =   "Y4, м"
      Height          =   255
      Left            =   8400
      TabIndex        =   4
      Top             =   2340
      Width           =   495
   End
   Begin VB.Label Label69 
      Caption         =   "Y2, м"
      Height          =   255
      Left            =   8400
      TabIndex        =   3
      Top             =   2040
      Width           =   495
   End
   Begin VB.Label Label68 
      Caption         =   "X1, м"
      Height          =   255
      Left            =   8400
      TabIndex        =   2
      Top             =   1140
      Width           =   495
   End
   Begin VB.Label Label58 
      Caption         =   " Alfa2"
      Height          =   255
      Left            =   9780
      TabIndex        =   0
      Top             =   3060
      Width           =   495
   End
End
Attribute VB_Name = "Form4"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Sub Form_Load()
Picture1.BackColor = RGB(255, 255, 255)
' коэффициент преломления воздуха            1,0003
' коэффициент преломления воды               1,3330
' коэффициент преломления обычного стекла    1,48...1,53
' коэффициент преломления оптического стекла 1,4...2,1
Option8_Click '                                                                               задать параметры для моей схемы
ReDim An(51): ReDim P21(30): ReDim X21(22): ReDim Y21(22): ReDim X22(22): ReDim Y22(22)   '   изменяем размерность массивов
End Sub

Private Sub Form_Activate() '                   выполняется при активации формы, т.к. масштаб ML может быть изменен на других формах
If Form1.Timer1.Enabled = True Then Form1.Timer1.Enabled = False
ML = Text19.Text '                              метров в сантиметре картинки  (масштаб мог испортится при активации формы 1)
End Sub

Private Sub Option1_Click() '                                                  установка Майкельсона
Label31.Caption = "X6, м"
Check8.Enabled = True
Text1.Text = -1: Text66.Text = 0 '                                    координаты X1 и Y1
Text67.Text = 0: Text2.Text = 1 '                                     координаты X2 и Y2
Text3.Text = 0.5 '                                                    координа по оси Y верхнего центра прозрачной пластины 4
Text4.Text = 90: Text5.Text = 0: Text6.Text = 135: Text7.Text = 135 ' углы наклона зеркал 1 и 2 и пластин 3 и 4
Text8.Text = 0.5 '                                                    координата приемника 6 по оси X
Text9.Text = -0.3 '                                                   координата источника 5 по оси Y
Check33.Value = 0: Check33.Enabled = False: Check26.Value = 0: Check26.Enabled = False ' тут не далал ЭД аналитически и по статическим углам
Option2.Value = True: Option6.Enabled = False '                       тут оптическая плотность всегда влияет только на скорость света
Check16.Value = 0: Check16.Enabled = False '                          у Майкельсона не стал делать перерасчет N1 и N2 при сплошном эффекте Доплера, т.к.
Command5_Click '                                                      при наличие стекол нет смысла его делать до тех пор пока не будет ясности в вопросе
End Sub '                                                             на что влияет оптическая плотность среды - на скорость света или на его частоту

Private Sub Option8_Click() '                                                     установка Юдина
Label31.Caption = "Y6, м"
Check8.Value = 0: Check8.Enabled = False '                           преломления в движущихся пластинах здесь не может быть
Text1.Text = -0.45: Text66.Text = 0 '                                координаты X1 и Y1
Text67.Text = 0.45: Text2.Text = 0: '                                координаты X2 и Y2
Text4.Text = 121.7032392: Text5.Text = 58.2967608: Text6.Text = 90 ' углы наклона зеркал 1 и 2 и угол при вершине зеркальной призмы
If Check3.Value = 1 And Check17.Value = 1 Then '
Text1.Text = 1: Text66.Text = 0.4 '                                  координаты левого зеркала 1 по осям X и Y, если оно расположено справа
Text7.Text = 45: Text3.Text = 0.4 '                                  угол наклона и координата Y4 дополнительного зеркала
Text4.Text = 58.6 '                                                  угол наклона зеркал 1
End If
Text8.Text = 0.9 '                                                   координата приемника (экрана) 6 по оси Y
Text9.Text = -0.2 '                                                  координата источника 5 по оси Y
Check33.Value = 0: Check33.Enabled = True: Check26.Value = 0: Check26.Enabled = True ' тут можно считать ЭД аналитически и по статическим углам
Option6.Enabled = True '                                             тут оптическая плотность может влиять или на скорость света или на его частоту
Check16.Enabled = True ' можно перерасчитать N1 и N2 при сплошном эффекте Доплера с новой частотой на отдельных этапах путей движения лучей
Command5_Click
End Sub

Private Sub Option4_Click() '                      начальные данные для теста
Text27.Text = 0.8: Text28.Text = 100 '                              длина пластин и зеркал в метрах и их толщина в мм
Text50.Text = 3: Text29.Text = 0.3 '                                скорость Солнечной смстемы и Земли в км/с
Text10.Text = 10 '                                                  NC0
Label6.Caption = "длина волны L1, м": Check18.Caption = "+ 2-й лазер с L2, м"
Text18.Text = 0.0065: Text60.Text = 0.0065 '                        длина волны двух лазеров по 65 мм
Text12.Text = 30: Text40.Text = "1E-7" '                            скорость света в км/с и шаг решения в с
Command5_Click
End Sub

Private Sub Option7_Click() '                       реальные начальные данные
Text27.Text = 0.2: Text28.Text = 10  '                          длина пластин и зеркал в метрах и их толщина в мм
Text50.Text = 300: Text29.Text = 30 '                           скорость Солнечной смстемы и Земли в км/с
Text10.Text = 10000 '                                           NC0
Label6.Caption = "длина волны L1, нм": Check18.Caption = "+ 2-й лазер с L2, нм"
Text18.Text = 650: Text60.Text = 650 '                          длина волны двух лазеров по 650 нм
Text12.Text = 300000: Text40.Text = "1E-15" '                   скорость света и шаг решения
Command5_Click
End Sub

Private Sub Command7_Click() 'Начать эксперимент
On Error GoTo 80 '                                                    считываем данные соответствующие данной схеме установки
X(3) = 0: Y(3) = 0 '                    координаты верхнего центра полупрозрачной пластины или передней грани треугольной призмы
X(4) = 0: Y(4) = Text3.Text '           координаты верхнего центра компенсационной пластины или дополниьельного зеркала
X(1) = Text1.Text: Y(1) = Text66.Text: X(2) = Text67.Text: Y(2) = Text2.Text '  координаты центров левого и верхнего зеркал
X(6) = 0: Y(6) = 0 '                                                            координаты центра приемника (экрана)
If Option1.Value = True Then X(6) = Text8.Text '                                  если установка Майкельсона
If Option8.Value = True Then Y(6) = Text8.Text '                                  если установка Юдина

Alfa1 = Text4.Text / kUgol: Alfa2 = Text5.Text / kUgol: Alfa3 = Text6.Text / kUgol: Alfa4 = Text7.Text / kUgol 'углы наклона зеркал и пластин
w1 = Text27.Text: h1 = Text28.Text / 1000 '                     ширина зеркал или стеклянных пластин и толщина пластин
w7 = Text49.Text: w71 = 0.01 '                                  длина цилиндра с воздухом под давлением и суммарная толщина его стекляных стенок
X(7) = X(3) + (X(2) - X(3) - w7) / 3: Y(7) = Y(3) '             координаты центра левого торца цилиндра (без стеклянной крышки)
Y(5) = Text9.Text: X(5) = 0 '                                   координаты центра источника света
DV = Text69.Text / 1000 '                                       диаметр луча лазера в метрах (задан в мм) при вылете из лазера
DZ = Text30.Text / 1000 '                                       диаметр луча лазера в метрах (задан в мм) при падении на экран
Betta1 = ArcTangensR(DZ - DV, 2 * (Y(6) - Y(5))) '              угол скорости центра половины луча при наличии у луча угла конуса

L0 = Text18.Text: If Option7.Value = True Then L0 = L0 / 10 ^ 9 '     длина волны в метрах 1-го луча (при скорости света в вакууме Vs0??)
L00 = Text60.Text: If Option7.Value = True Then L00 = L00 / 10 ^ 9 '  длина волны в метрах 2-го луча (при скорости света в вакууме Vs0??)
If Check18.Value = 0 Then L00 = L0 '                                  если один общий луч делится на два
NC0 = Text10.Text '                                             число циклов расчета после которых выводить графику
N0 = Text57.Text '                                              количество периодов между двумя фронтами волн для моделирования эффекта Доплера
P00 = Text40.Text: kP0 = Text46.Text '                          основной шаг решения и коэффициент его уменьшения для точных расчетов
ML = Text19.Text: Mv1 = Text54.Text * L0 '                      линейные масштабы (нормальный и для детального анализа)
P21(0) = Text11.Text: P = Text22.Text '                         оптическая плотность (коэффициент преломления) среды и стекла пластин и крышек цилиндра
P21(23) = Text99.Text '                                         оптическая плотность (коэффициент преломления) воздуха внутри цилиндра
Vs0 = Text12.Text * 1000 '                                      скорость света в вакууме
VX1iso = Text50.Text * 1000: Q1iso = Text44.Text / kUgol '      скорость Солнечной системы и угол под которым она движется
VX2iso = Text29.Text * 1000: Q2iso = Text41.Text / kUgol '      скорость Земли и угол под которым она движется
VXiso = VX1iso * Cos(Q1iso) + VX2iso * Cos(Q2iso) '             суммарная скорость по оси Х
VYiso = VX1iso * Sin(Q1iso) + VX2iso * Sin(Q2iso) '             суммарная скорость по оси Y
VXiso3 = Sqr(VXiso ^ 2 + VYiso ^ 2) '                           общая скорость
AlfaISO = ArcTangensR(VXiso, VYiso)  '                          угол общей скорости

For i = 0 To 20
Xk1(i) = 0: Tk1(i) = 0: Vs1(i) = 0: X0(i) = X(i): Y0(i) = Y(i) '                сохраняем координаты в момент Т=0 для проведения
Next i '                                                                        эксперимента по сплошному эффекту Доплера
For i = 0 To 30 '                                                               и обнуляем все расчетные значения
kod(i) = 0: Xk2(i) = 0: Tk2(i) = 0: Vs2(i) = 0: v1(i) = 0: v1k(i) = 0: Nv(i) = 0
Next i

If VXiso3 <= Vs0 / 5 Then GoTo 5
Info = "                         ВНИМАНИЕ" & vbCrLf: Info = Info & "    программа работает корректно при " & vbCrLf
Info = Info & "  расчете эффекта Доплера только, если" & vbCrLf: Info = Info & "скорость ИСО не более 1/5 скорости света" & vbCrLf
MsgBox Info, , "Maikelson"
5:
If Option8.Value = True Then GoTo 6 '                                  если установка Юдина, то переход
If Alfa3 <= pi And Alfa3 >= pi / 2 Then GoTo 6
Info = "                         ВНИМАНИЕ" & vbCrLf: Info = Info & " для схемы интерферометра Майкельсона" & vbCrLf
Info = Info & " программа работает корректно только при" & vbCrLf
Info = Info & " углах наклона стекол от 90 до 180 градусов" & vbCrLf: MsgBox Info, , "Maikelson"

6:
On Error GoTo 90

If Option8.Value = True Then GoTo 40 '                    если установка Юдина то пропускаем этот расчет
'An(10), An(20) ... An(18), An(28)    углы скоростей лучей при движении по этим участкам пути
'An(30) и An(31)                      углы падения и углы преломления лучей при их прохождении через стеклянные пластины
'                        при этом на каждом участке пути ii рассчитываются углы движения лучей на следующем участке пути ii+1
'                        и при переходе на новый участок сразу идет движение уже с этими рассчитанными скоростями

'ii = 10 и jj = 20 общий путь до стеклянной поверхности наклонного полупрозрачного зеркала
'ii = 11      внутри наклонного полупрозрачного зеркала и отражается
'ii = 12      нет
'ii = 13      внутри наклонного полупрозрачного зеркала влево и преломление
'ii = 14      свободно влево и отражение от зеркала
'ii = 15      свободно вправо и преломление
'ii = 16      внутри наклонного полупрозрачного зеркала вправо и преломление
'ii = 17      нет
'ii = 18      свободно вправо до приемника
P21(10) = P21(0): P21(11) = P: P21(12) = 0: P21(13) = P: P21(14) = P21(0): P21(15) = P21(0): P21(16) = P: P21(17) = 0: P21(18) = P21(0)
'jj = 21      внутри наклонного полупрозрачного зеркала и преломление
'jj = 22      свободно ввверх и преломление на прозрачной пластине
'jj = 23      внутри прозрачной пластины вверх и преломление
'jj = 24      свободно ввверх и отражение
'jj = 25      свободно вниз и преломление на прозрачной пластине
'jj = 26      внутри прозрачной пластины вниз и преломление
'jj = 27      свободно вниз и отражение от наклонного зеркала
'jj = 28      свободно вправо до приемника
P21(20) = P21(0): P21(21) = P: P21(22) = P21(0): P21(23) = P: P21(24) = P21(0): P21(25) = P21(0): P21(26) = P: P21(27) = P21(0): P21(28) = P21(0)

X(30) = X(3) - h1 * Sin(Alfa3): Y(30) = Y(3) + h1 * Cos(Alfa3) ' начальные координаты нижних средних точек стеклынных пластин
X(40) = X(4) - h1 * Sin(Alfa4): Y(40) = Y(4) + h1 * Cos(Alfa4) ' при углах от 90 до 180 градусов
X0(30) = X(30): Y0(30) = Y(30): X0(40) = X(40): Y0(40) = Y(40) ' сохраняем начальные данные для проведения сплошного эффекта Доплера
GoTo 50

40: '                                                    если установка Юдина
'ii = 10      от источника до левой грани зеркальной призмы (если А3=А3/2 то прямо до экрана без призмы и зеркала по ii = 18)
'ii = 11      (если А3=А3/2 и + А4, то мимо призмы до дополнительного зеркала 4, а потом до зеркала 1 и до экрана)
'ii = 14      от призмы до левого зеркала
'ii = 18      от левого зеркала до экрана
P21(10) = P21(0): P21(11) = P21(0): P21(14) = P21(0): P21(18) = P21(0)
'jj = 20     от источника до правой грани зеркальной призмы
'jj = 21     от правой грани призмы до стекляной крышки цилиндра с воздухом
'jj = 22     от левого края стекляной крышки цилиндра с воздухом до правого края (в расчете используется толщина сразу двух крышек)
'jj = 23     от правого края (двойной) стекляной крышки цилиндра с воздухом до конца цилиндра с воздухом
'jj = 24     от правого края цилиндра до правого зеркала (или от правой грани зеркальной призмы до правого зеркала)
'jj = 28     от правого зеркала до экрана
P21(20) = P21(0): P21(21) = P21(0): P21(22) = P: P21(24) = P21(0): P21(28) = P21(0) 'P21(23) = P21(23) это воздух в цилиндре (уже задан)

50:
'Свет всегда отражается от непрозрачных сред , т.е. может распространяться только в прозрачных средах, но движется он в них в эфире и
'поэтому считается, что не изменяет своей частоты при переходе из одной среды в другую, хотя считается, что его скорость распространения зависит
'от оптической плотности среды, что отражается и на длине волны и на углах преломления, поэтому эффект Доплера надо учитывать только при
'отражении света от зеркал, но я буду моделировать (как вариант) и изменение частоты от изменения оптической плотности при неизменной скорости
'света , что приведет к уменьшению длины волны при увеличение плотности.
'При моделировании сначала в Call DX_DY находим точку касания лучом зеркала (или пластины), потом в Call AlfaV продолжаем движение
'одного края фронта этого луча и зеркала или пластины до момента касания зеркала концом этого фронта волны и вычисляем эффективный угол
'наклона зеркала, а потом уже как обычно продолжаем движение всех лучей и зеркал с того места, где произошло касание центром луча поверхности
'зеркала, и точно так же и при моделировании эффекта Доплера рассматриваем движение двух фронтов волн и зеркала, а потом продолжаем
'движение зеркала (вместе с установкой) и луча с того места и с того момента времени, когда произошло касание центром луча поверхности зеркала

v0 = Vs0 / L0: v00 = Vs0 / L00: v1(10) = v0: v1(20) = v00 '     если ВВОБЩЕ не учитывать плотность среды
Vs = Vs0 '                                                      если НЕ учитывать влияние плотности среды на скорость света
If Check4.Value = 1 And Option2.Value = True Then  '            если учесть изменение скорости света от плотности среды
Vs = Vs0 * 1 / P21(0) '                                                                   (при неизменной частоте света)
v0 = Vs / L0: v00 = Vs / L00: v1(10) = v0: v1(20) = v00 '       частота света при покоящемся источнике света                   20_11_21
End If
If Check4.Value = 1 And Option6.Value = True Then '             если учесть изменение частоты лазеров от плотности среды
v0 = Vs0 / L0: v00 = Vs0 / L00: v1(10) = v0 * 1 / P21(0): v1(20) = v00 * 1 / P21(0) '     (при неизменной скорости света)
End If
Text20.Text = v0 / 10 ^ 6 '                      частота колебаний света на источнике 1, т.е. 1-го луча в МГц
Text63.Text = v00 / 10 ^ 6 '                     частота колебаний света на источнике 2, т.е. 2-го луча в МГц
Text42.Text = Fix(MF * P00 * Vs / L0) / MF '                    путь лучей за один нормальный шаг (в длинах волн света)
Text53.Text = Fix(MF * P00 * Vs / kP0 / L0) / MF '              путь лучей за один шаг уменьшенный (в длинах волн света)

UgolE = ArcSinus(VXiso3 * Cos(AlfaISO) / Vs) '                  угол аберрации (используется и для изменение угла наклона движущихся зеркал у Хендрика)
Betta = pi / 2
If Check21.Value = 1 Then Betta = pi / 2 - UgolE '              прицельный угол лазера если учесть аберрацию
Info = "Прицельный угол лазера = " & Format(Betta * kUgol, "000.000000000")
Picture1.CurrentX = -10: Picture1.CurrentY = -3.7: Picture1.Print Info

If Check22.Value = 1 Then GoTo 60 '              если НЕ учитывать эффект Доплера от движения лазеров, даже, если он далее будет учитываться
'                                                на зеркалах (призме) и на экране (ЭТО ДЛЯ СРАВНЕНИЯ РЕЗУЛЬТАТОВ С ПРОГРАММОЙ DOPLER)
If Check1.Value = 1 Then '                                 если учесть эффект Доплера от движения лазеров (ЗДЕСЬ БЕЗ УЧЕТА КОНУСНОСТИ)
V(3) = VXiso3 * Cos(AlfaISO - Betta): V(4) = 0 '           задаем только скорость источника вдоль скорости света (с учетом аберрации)
v1(10) = v1(10) * (1 - V(4) / Vs) / (1 - V(3) / Vs)    '       частота света при движущемся источнике света 3 и покоящемся приемнике 4
v1(20) = v1(20) * (1 - V(4) / Vs) / (1 - V(3) / Vs)    '       частота света при движущемся источнике света 3 и покоящемся приемнике 4
Info = "v1anal/v0= " & v1(10) / v0
Picture1.CurrentX = 7.5: Picture1.CurrentY = -2.5: Picture1.Print Info
If Check33.Value = 0 Then '                                            если не использовать данные аналитического расчета, а смоделировать
Dopler_Lazer '    здесь будет получено значение v1n(1) для 1-го лазера с использованием при моделировании L0 и Vs (если не аналитический расчет)
Info = "v1anal/v0= " & v1(10) / v0
Picture1.CurrentX = 7.5: Picture1.CurrentY = -2.5: Picture1.Print Info '    повторяю, т.к., если отмечены детали, то экран очистится
Info = "v1mod/v0= " & v1n(1) / v0
Picture1.CurrentX = 7.5: Picture1.CurrentY = -3.5: Picture1.Print Info
v1(10) = v1n(1): v1(20) = v1n(1) '                                           если у нас один лазер
If Check33.Value = 0 And Check18.Value = 1 Then v1(20) = v1n(1) * L0 / L00 ' а, если два, то это будет частота при моделировании для 2-го лазера
End If 'Check33.Value = 0
End If 'Check1.Value = 1

60:
V(1) = Vs: V(2) = Vs: V(10) = Vs: V(20) = Vs: Vs1(10) = Vs: Vs2(20) = Vs '      скорости двух лучей летящих от лазера
v1(1) = v1(10): v1(2) = v1(20) '                                                частоты v1(1) и v1(2) только для вывода в текстбоксы
An(0) = Betta: An(10) = An(0): An(20) = An(0): An(1) = An(10): An(2) = An(20) ' углы скоростей двух лучей летящих как один луч от лазера
Info = "Alfa10=   " & Format(An(10) * kUgol, "000.000000")
Picture1.CurrentX = 4: Picture1.CurrentY = 32 - 10: Picture1.Print Info
Info = "Alfa20=   " & Format(An(20) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 32 - 10: Picture1.Print Info
VX21(1) = V(1) * Cos(Betta): VY21(1) = V(1) * Sin(Betta) '               скорости двух лучей по осям координат
VX21(2) = V(2) * Cos(Betta): VY21(2) = V(2) * Sin(Betta) '
X21(1) = X(5): Y21(1) = Y(5): X21(2) = X(5): Y21(2) = Y(5) '             начальные координаты центров двух лучей, летящих как один до их разделения
ii = 10: jj = 0 '     на задней поверхности полупрозрачной пластины, если схема Иайкельсона, поэтому ведем общий расчет для одного луча и это будут
'                     его участки ii=10 и ii=11, а после этого будет задано ii=12 и jj=22, т.е. будут отдельные расчеты для каждого из лучей

If Option8.Value = True Then '                    если установка Юдина
ii = 1 ': jj = 0 '                                коды начальных участков пути (всегда задаем общий путь одного луча до ребра призмы ii = 1)
X21(10) = X(5): Y21(10) = Y(5) '                                     начальные координаты центра общего луча, т.е. до передней грани призмы
VX21(10) = VX21(1): VY21(10) = VY21(1) '                             V(10)= V(1)= V(2) скорость общего луча, т.е. до передней грани призмы
If Check18.Value = 1 Then '                                                    если сразу два отдельных луча, то здесь DV также диаметр лучей,
X21(1) = X(5) - DV * Cos(Betta - pi / 2): Y21(1) = Y(5) - DV * Sin(Betta - pi / 2) ' а расстояние между двумя лазерами 2*DV и тогда у нас будут
X21(2) = X(5) + DV * Cos(Betta - pi / 2): Y21(2) = Y(5) + DV * Sin(Betta - pi / 2) ' такие начальные координаты центров 2-х отдельных лучей, которые
End If 'Check18.Value = 1                                                            так и будут рассчитываться отдельно и после того когда фиктивный
'                                                                                    общий луч с координатами X21(10) и Y21(10) коснется ребра призмы
If Check18.Value = 0 Then '                                                    если один луч делится на ребре призмы на два луча
X21(1) = X(5) - DV * Cos(Betta - pi / 2) / 4: Y21(1) = Y(5) - DV * Sin(Betta - pi / 2) / 4 ' фиктивные начальные координаты центров 2-х лучей, хотя
X21(2) = X(5) + DV * Cos(Betta - pi / 2) / 4: Y21(2) = Y(5) + DV * Sin(Betta - pi / 2) / 4 ' они от одного источника летят до призмы как один луч
If Check27.Value = 1 Then '           если учитывать конусность луча, то надо скорости VX21(1) и VX21(2), рассчитанные выше для общего луча, уточнить
An(10) = Betta + Betta1: An(20) = Betta - Betta1 '                                    и теперь лучи, подлетая к призме, будет лететь под этими углами
VX21(1) = V(1) * Cos(An(10)): VY21(1) = V(1) * Sin(An(10)) ' у левого луча угол увеличится (если конус расходится)
VX21(2) = V(2) * Cos(An(20)): VY21(2) = V(2) * Sin(An(20)) ' у правого луча угол уменьшится
End If '
End If 'Check18.Value = 0 '           (новые координаты X21(1) и X21(2) будут рассчитаны при касании ребра призмы, где общий луч разделится на два)
End If 'Option8.Value = True

kodEnd = 0 '                                   программу не останавливать
T = 0: X1aso = 0: X2aso = 0 '                  начальная длина пути и время, которые суммируются непрерывно
T1 = 0: T2 = 0: X1iso = 0: X2iso = 0 '         начальные время и длина пути, которые изменяются только на конкретных этапах пути
TT(1) = 0: TT(2) = 0: P0 = P00 '               количество периодов колебаний света на всем пути до экрана и основной шаг решения
If Check5.Value = 1 Then Form9.picBox.Cls '    если выводить отчет
If Check24.Value = 1 Then '                    открываем отладочный файл для контроля текущих шагов решения
On Error GoTo 90
pp = FreeFile
Open App.Path + "\Otladka.dat" For Output As #pp
Print #pp, ii, jj, T, X21(1), Y21(1), X21(2), Y21(2)
End If
If Option1.Value = True Then Maikelson '       моделируется эксперимент на установке Майкельсона-Морли
If Option8.Value = True Then Yudin '           моделируется эксперимент на установке Юдина
GoTo 100
80: MsgBox "Введите правильно данные", , "Maikelson": Exit Sub
90: MsgBox "Ошибка расчета исходных данных", , "Maikelson": Exit Sub
100: End Sub





Private Sub Maikelson() '                    вычислительный эксперимент на установке Майкельсона
On Error GoTo 80 '                           после сообщения об ошибке отчет все равно будет выведен
'ii = 10 и jj = 20 общий путь до стеклянной поверхности наклонного полупрозрачного зеркала
'ii = 11  внутри наклонного полупрозрачного зеркала и отражается
'ii = 12  нет
'ii = 13  внутри наклонного полупрозрачного зеркала назад и преломление
'ii = 14  свободно влево и отражение от зеркала
'ii = 15  свободно вправо и преломление
'ii = 16  внутри наклонного полупрозрачного зеркала вправо и преломление
'ii = 17  нет
'ii = 18  свободно вправо до экрана

'jj = 21  внутри наклонного полупрозрачного зеркала и преломление
'jj = 22  свободно ввверх и преломление на прозрачной пластине
'jj = 23  внутри прозрачной пластины вверх и преломление
'jj = 24  свободно ввверх и отражение
'jj = 25  свободно вниз и преломление на прозрачной пластине
'jj = 26  внутри прозрачной пластины вниз и преломление
'jj = 27  свободно вниз и отражение от наклонного полупрозрачного зеркала
'jj = 28  свободно вправо до экрана

If Check7.Value = 1 Then '                                     если производится сравнительный расчет, с расчетом Майкельсона-Лоренца, т.е. с
'                                                              движением света только от центра полупрозрачной пластины до зеркал и опять до пластины,
'                                                              но без преломления лучей на стеклах, т.е. их плотность должна быть как и у воздуха
X21(1) = X(3): Y21(1) = Y(3): X21(2) = X(3): Y21(2) = Y(3) '   движение лучей начнется от задней грани пластины
ii = 13: jj = 22 '                                             а это номера участков пути, где начнется движение
kod(11) = 1: kod(21) = 1 '                                     и это код того, что эти участки 11 и 21 пройдены
Tk1(11) = 0: Tk1(21) = 0: T1 = 0: T2 = 0 '                     время в этот момент будет равно нулю
VX21(1) = -Vs: VY21(1) = 0: V(1) = Vs: V(2) = Vs '             скорость 1-го луча будет направлена влево, а у 2-го не изменится
An(11) = pi / 2: An(21) = pi / 2 '                             углы скорости на общем участке пути 11
An(13) = -pi: An(22) = pi / 2 '                                углы скорости на первых участках 13 и 22 раздельного пути лучей
End If

1:
T = T + P0: NC = NC + 1
X(1) = X(1) + VXiso * P0: Y(1) = Y(1) + VYiso * P0 '    координаты центра левого зеркала (через один шаг решения)
X(2) = X(2) + VXiso * P0: Y(2) = Y(2) + VYiso * P0 '    координаты центра правого зеркала
X(3) = X(3) + VXiso * P0: Y(3) = Y(3) + VYiso * P0 '    координаты центра задней поверхности полупрозрачного зекала
X(4) = X(4) + VXiso * P0: Y(4) = Y(4) + VYiso * P0 '    координаты центра задней поверхности прозрачной пластины
X(5) = X(5) + VXiso * P0: Y(5) = Y(5) + VYiso * P0 '    координаты центра источника света
X(6) = X(6) + VXiso * P0: Y(6) = Y(6) + VYiso * P0 '    координаты объектива телескопа (экрана)
X(30) = X(30) + VXiso * P0: Y(30) = Y(30) + VYiso * P0 'координаты центра передней поверхности полупрозрачного зекала
X(40) = X(40) + VXiso * P0: Y(40) = Y(40) + VYiso * P0 'координаты центра передней поверхности прозрачной пластины
X21(1) = X21(1) + VX21(1) * P0: Y21(1) = Y21(1) + VY21(1) * P0 '               координаты концов 1-го и 2-го лучей
X21(2) = X21(2) + VX21(2) * P0: Y21(2) = Y21(2) + VY21(2) * P0
X1aso = X1aso + V(1) * P0: X2aso = X2aso + V(2) * P0 '                         суммарный путь пройденный лучами


'              /////////////////                  ОБЩИЙ ПУТЬ ДВУХ ЛУЧЕЙ                   /////////////////////

If ii = 10 Then  '              ////общий участок пути до прозрачной поверхности пластины полупрозрачного зеркала
Call DX_DY(X21(1), Y21(1), X(30), Y(30), Alfa3, 1) ' находим расстояние от луча до пластины
V12 = V(1) * Cos(An(10) - Alfa3 + pi / 2) '          это скорость луча в АСО вдоль нормали к плоскости стеклянной пластины
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '       это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 10 '
P0 = P00 / kP0 '                              уменьшаем шаг решения если за два основных шага решения луч перелетит за стеклянную пластину
If (V12 + V21) * P0 < R0 Then GoTo 10 '       если путь за шаг решения больше расстояния до пластины, то это последний шаг на этом участке
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa3 '                                              1-ый и 2-ой лучи преломляются на полупрозрачной пластине
If Check8.Value = 1 Then '                                   если надо найти угол наклона движущейся пластины AlfaZ, где An(10)=90 (примерно)
X21(3) = X21(1) + w1 * Cos(An(10) + pi / 2) / 2: VX21(3) = VX21(1) '    здесь всегда движется левый фронт волны, поэтому kE=1
Y21(3) = Y21(1) + w1 * Sin(An(10) + pi / 2) / 2: VY21(3) = VY21(1) '    An(10) + pi / 2 угол левого конца фронта волны (w1 это длина пластины)
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(1), Y21(1), Alfa3, 0) 'находим угол наклона движущейся пластины
End If
Info = "Alfa10=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -12.5: Picture1.CurrentY = 32 - ii: Picture1.Print Info
Info = "Alfa20=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 32 - ii: Picture1.Print Info
An(30) = An(10) - AlfaZ + pi / 2 '                                                  угол падения с учетом движения пластины (или без учета)
An(31) = ArcSinus(Sin(An(30)) * P21(10) / P21(11)) '                                угол преломления
An(11) = AlfaZ - pi / 2 + An(31): An(21) = An(11): An(1) = An(11): An(2) = An(11) ' углы скорости лучей после преломления
Info1 = Info1 & "угол падения луча          " & An(30) * kUgol & vbCrLf: Info1 = Info1 & "угол преломления луча " & An(31) * kUgol & vbCrLf
Info = "Alfa11=   " & Format(An(11) * kUgol, "000.000000")
Picture1.CurrentX = 4: Picture1.CurrentY = 32 - ii - 1: Picture1.Print Info
Info = "Alfa21=   " & Format(An(21) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 32 - ii - 1: Picture1.Print Info

v1k(10) = v1(10): v1(11) = v1(10)
If Check4.Value = 1 Then V(1) = Vs0 / P21(11) ' если учесть изменение скорости света в средах разной оптической плотности
VX21(1) = V(1) * Cos(An(11)): VY21(1) = V(1) * Sin(An(11)): VX21(2) = VX21(1): VY21(2) = VY21(1) '      (для 2-го луча будут теже
v1k(20) = v1k(10): v1(21) = v1(11): v1(1) = v1(11): v1(2) = v1(21):  V(2) = V(1) '                       значения, т.к. луч пока один)
Nv(ii) = (T - T1) * v1(ii):           TT(1) = TT(1) + Nv(ii)
Nv(ii + 10) = (T - T2) * v1(ii + 10): TT(2) = TT(2) + Nv(ii + 10)
T1 = T: T2 = T: X1iso = X1aso: X2iso = X2aso: Tk1(ii) = T1: Tk2(ii + 10) = T2: Xk1(ii) = X1iso: Xk2(ii + 10) = X2iso
Vs1(11) = V(1): Vs2(21) = V(2): ii = 11 '                          jj = 21 не задаем, т.к. и на этом участке два луча полетят как один луч
kod(10) = 1: kod(20) = 1: P0 = P00 ' 2-ой луч тоже прошел этот этап, т.к. два луча летят как один, и поэтому устанавливаем нормальный шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 10 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
10: End If 'ii = 10


If ii = 11 Then  '                                 ////общий участок пути в пластине до полупрозрачной поверхности
Call DX_DY(X21(1), Y21(1), X(3), Y(3), Alfa3, 4)
V12 = V(1) * Cos(An(11) - Alfa3 + pi / 2) '        это скорость луча в АСО внутри пластины вдоль нормали к стеклянной пластине
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 11 ' если за два основных шага решения общий луч НЕ перелетит за полупрозрачную поверхность пластины
P0 = P00 / kP0 '                             в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 11 '      если за уменьшенный шаг решения луч перелетит за пластину, то это последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
Info1 = Info1 & "X1=  " & X21(1) & vbCrLf: Info1 = Info1 & "Y1=  " & Y21(1) & vbCrLf '   координаты точки выхода лучей с пластины 3
Info1 = Info1 & "X3=  " & X(3) & vbCrLf: Info1 = Info1 & "Y3=  " & Y(3) & vbCrLf '       координаты центра пластины 3

'                                                       1-ый луч отражается от полупрозрачного зеркала (пластины)
AlfaZ = Alfa3 '                              задаем угол наклона в статике
If Check2.Value = 1 Then '                   если надо найти угол наклона движущегося зеркала  (здесь An(11) примерно 90 градусов)
X21(3) = X21(1) + w1 * Cos(An(11) + pi / 2) / 2: VX21(3) = VX21(1) '  здесь всегда движется левый фронт волны, поэтому kE=1
Y21(3) = Y21(1) + w1 * Sin(An(11) + pi / 2) / 2: VY21(3) = VY21(1) '  An(11) + pi / 2 угол левого конца фронта волны
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(1), Y21(1), Alfa3, 0) '    находим угол наклона движущегося зеркала (пластины) AlfaZ
End If
Info = "Alfa11=   " & Format(AlfaZ * kUgol, "000.000000") '                  если бы скорость света в стекле не изменялась, то этот угол бы
Picture1.CurrentX = -12.5: Picture1.CurrentY = 32 - ii: Picture1.Print Info 'получился меньше чем Alfa10, т.к. угол падения меньше, чем
v1k(ii) = v1(11): v1(13) = v1(11) '                                          был при падении на стекло, но при разной скорости получается Alfa11=Alfa10
If Check1.Value = 1 Then '                              если учесть эффект Доплера при отражении луча от полупрозрачной поверхности пластины
Call Dopler_Zerkalo(Alfa3, AlfaZ, V(1), An(11), v1(11), 180) '                            kodUgla указывает примерное направление отраженного луча
'Private Sub Dopler_Zerkalo(ByVal Alfa0 As Double, ByVal Alfa10 As Double, ByVal VL As Double, ByVal AL As Double, ByVal v10 As Double, ByVal kodUgla As Integer)
v1k(ii) = v1n(1): v1(13) = v11 ' получаем из подпрограммы Dopler_Zerkalo частоту света v11 отраженного луча и v1n(1) частоту света принятую движущимся зеркалом
End If '
If Check4.Value = 1 Then V(1) = Vs0 / P21(13) '           если учесть изменение скорости в средах разной оптической плотности
An(13) = 2 * AlfaZ - An(11): An(1) = An(13) '             An(1) угол скорости 1-го луча на следующем участке пути 13
Info = "Alfa13=   " & Format(An(13) * kUgol, "000.000000")
Picture1.CurrentX = 4: Picture1.CurrentY = 32 - ii - 2: Picture1.Print Info
VX21(1) = V(1) * Cos(An(13)): VY21(1) = V(1) * Sin(An(13))
Nv(ii) = (T - T1) * v1(ii): TT(1) = TT(1) + Nv(ii)
T1 = T: X1iso = X1aso: Tk1(ii) = T1: Xk1(ii) = X1iso: Vs1(13) = V(1): v1(1) = v1(13): ii = 13
Tk1(12) = T1: Xk1(12) = X1iso: Vs1(12) = V(1) '   ii = 12 нет, но эти данные нужны для формы отчета

'                                                         2-ой луч переходит в менее плотную среду
Info1 = Info1 & vbCrLf & "пройден участок пути 21 " & vbCrLf
AlfaZ = Alfa3 '                                                       задаем угол наклона в статике
If Check8.Value = 1 Then '                   если надо найти угол наклона движущейся пластины  (здесь An(11) примерно 90 градусов)
X21(3) = X21(2) + w1 * Cos(An(21) + pi / 2) / 2: VX21(3) = VX21(2) '  здесь всегда движется левый фронт волны, поэтому kE=1
Y21(3) = Y21(2) + w1 * Sin(An(21) + pi / 2) / 2: VY21(3) = VY21(2) '  An(11) + pi / 2 угол левого конца фронта волны
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(2), Y21(2), Alfa3, 0) '    находим угол наклона движущейся пластины AlfaZ
End If
Info = "Alfa21=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 32 - 11: Picture1.Print Info
An(30) = An(21) - AlfaZ + pi / 2 '                              угол падения
An(31) = ArcSinus(Sin(An(30)) * P21(21) / P21(22)) '            здесь синус угла преломления будет больше синуса угла падения
An(22) = AlfaZ - pi / 2 + An(31): An(2) = An(22) '              угол скорости преломленного луча
Info1 = Info1 & "угол падения луча          " & An(30) * kUgol & vbCrLf: Info1 = Info1 & "угол преломления луча  " & An(31) * kUgol & vbCrLf
Info = "Alfa22=   " & Format(An(22) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 32 - 11 - 1: Picture1.Print Info
v1k(21) = v1(21): v1(22) = v1(21)
If Check4.Value = 1 Then V(2) = Vs0 / P21(22)  '                      если учесть изменение скорости света в средах разной оптической плотности
VX21(2) = V(2) * Cos(An(22)): VY21(2) = V(2) * Sin(An(22))
Nv(21) = (T - T2) * v1(21): TT(2) = TT(2) + Nv(21)
T2 = T: X2iso = X2aso: Tk2(21) = T2: Xk2(21) = X2iso: Vs2(22) = V(2): v1(2) = v1(22): jj = 22
kod(11) = 1: kod(21) = 1: P0 = P00 ' 2-ой луч тоже прошел этот этап, т.к. два луча летят как один, и поэтому устанавливаем нормальный шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 11 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
11: End If 'ii = 11


'                        /////////////////                  ПУТЬ 1-го ЛУЧА                   /////////////////////

If ii = 13 Then  '                                  участок пути 13 в пластине влево до выхода из нее
Call DX_DY(X21(1), Y21(1), X(30), Y(30), Alfa3, 0)
V12 = V(1) * Cos(An(13) - Alfa3 - pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 + pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 13 '       если за два основных шага решения общий луч НЕ вылетит из пластины
P0 = P00 / kP0 '                                   в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 13 ' если за уменьшенный шаг решения луч вылетит из пластины, то это будет последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa3  '                         1-ый луч преломляется на полупрозрачной пластине (An(13) будет примерно 180)
If Check8.Value = 1 Then '                                               если надо найти угол наклона движущейся пластины
X21(3) = X21(1) + w1 * Cos(An(13) - pi / 2) / 2: VX21(3) = VX21(1) '     здесь всегда движется правый фронт волны, поэтому kE=1
Y21(3) = Y21(1) + w1 * Sin(An(13) - pi / 2) / 2: VY21(3) = VY21(1) '     An(13) - pi / 2 это угол правого конца движущегося фронта
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(1), Y21(1), Alfa3, 0) ' находим угол наклона движущейся пластины
End If
An(30) = AlfaZ + pi / 2 - An(13) '
An(31) = ArcSinus(Sin(An(30)) * P21(13) / P21(14))
An(14) = AlfaZ + pi / 2 - An(31): An(1) = An(14)
Info1 = Info1 & "угол падения луча          " & An(30) * kUgol & vbCrLf: Info1 = Info1 & "угол преломления луча  " & An(31) * kUgol & vbCrLf
Info = "Alfa13=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -12.5: Picture1.CurrentY = 32 - ii: Picture1.Print Info
Info = "Alfa14=   " & Format(An(14) * kUgol, "000.000000")
Picture1.CurrentX = 4: Picture1.CurrentY = 32 - ii - 1: Picture1.Print Info
v1k(ii) = v1(13): v1(14) = v1(13)
If Check4.Value = 1 Then V(1) = Vs0 / P21(14)  '                      если учесть изменение скорости в средах разной оптической плотности
VX21(1) = V(1) * Cos(An(14)): VY21(1) = V(1) * Sin(An(14))
Nv(ii) = (T - T1) * v1(ii): TT(1) = TT(1) + Nv(ii)
T1 = T: X1iso = X1aso: Tk1(ii) = T1: Xk1(ii) = X1iso: Vs1(14) = V(1): v1(1) = v1(14): ii = 14 '         v1(1)  для вывода в текстбоксы
kod(13) = 1: P0 = P00  '       тут 2-у лучу еще далеко до завершения своего участка пути до стеклянной пластины и можно смело деать P0 = P00
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 13 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
13: End If



If ii = 14 Then  '                                 участок пути 14 до левого зеркала и отражение
Call DX_DY(X21(1), Y21(1), X(1), Y(1), Alfa1, 1)
V12 = V(1) * Cos(An(14) - Alfa1 - pi / 2) '        это скорость луча в АСО вдоль нормали к левому зеркалу при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - Alfa1 + pi / 2) '     это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 14 '       если за два основных шага решения общий луч НЕ достигнет зеркала
P0 = P00 / kP0 '                                   в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 14 ' если за уменьшенный шаг решения луч перелетит за зеркало, то это будет последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa1
If Check2.Value = 1 Then '          An(14) примерно 180                 если надо найти угол наклона движущегося зеркала
kE = 1: If An(14) - Alfa1 > pi / 2 Then kE = -1 '                       здесь может двигаться как левый фронт волны, так и правый
X21(3) = X21(1) + kE * w1 * Cos(An(14) - pi / 2) / 2: VX21(3) = VX21(1)
Y21(3) = Y21(1) + kE * w1 * Sin(An(14) - pi / 2) / 2: VY21(3) = VY21(1)
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(1), Y21(1), Alfa1, 1) ' находим угол наклона движущегося зеркала
If kE = -1 Then AlfaZ = AlfaZ - pi '                                     если движется левый фронт волны, то угол разворачиваем на 180
End If
An(15) = 2 * AlfaZ - An(14): An(1) = An(15)
Info = "Alfa14=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -12.5: Picture1.CurrentY = 32 - ii: Picture1.Print Info
Info = "Alfa15=   " & Format(An(15) * kUgol, "000.000000")
Picture1.CurrentX = 4: Picture1.CurrentY = 32 - ii - 1: Picture1.Print Info
v1k(ii) = v1(14): v1(15) = v1(14)
If Check1.Value = 1 Then '                                            если учесть эффект Доплера
Call Dopler_Zerkalo(Alfa1, AlfaZ, V(1), An(14), v1(14), 0)
v1k(ii) = v1n(1): v1(15) = v11 '                                      частота света принятая поверхностью зеркала и отраженного луча
End If '
If Check4.Value = 1 Then V(1) = Vs0 / P21(15)  '                      если учесть изменение скорости луча света при изменении плотности
VX21(1) = V(1) * Cos(An(15)): VY21(1) = V(1) * Sin(An(15))
Nv(ii) = (T - T1) * v1(ii): TT(1) = TT(1) + Nv(ii)
T1 = T: X1iso = X1aso: Tk1(ii) = T1: Xk1(ii) = X1iso: Vs1(15) = V(1): v1(1) = v1(15): ii = 15
kod(14) = 1: P0 = P00 '                                      если 2-у лучу еще долеко от центра зеркала, то устанавливаем нормальный шаг решения
If Y21(2) + 10 * P00 * VY21(2) >= Y(2) Then P0 = P00 / kP0 ' но, если за следующее десять шагов 2-ой луч перелетит зеркало, то уменьшаем шаг решения
If kod(24) = 1 Then P0 = P00 '                               а, если 2-ой луч уже прошел свой этап пути 24, то устанавливаем нормальный шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 14 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
14: End If '


If ii = 15 Then  '                             участок пути 15 от левого зеркала до пластины и преломление
Call DX_DY(X21(1), Y21(1), X(30), Y(30), Alfa3, 0)
V12 = V(1) * Cos(An(15) - Alfa3 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 15 '       если за два основных шага решения общий луч НЕ перелетит за полупрозрачную пластину
P0 = P00 / kP0 '                                   в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 15 '      если за уменьшенный шаг решения луч перелетит за пластину, то это будет последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa3 '                                    1-ый луч преломляется на полупрозрачной пластине
If Check8.Value = 1 Then '                                если надо найти угол наклона движущейся пластины   здесь An(15)=0 (примерно)
X21(3) = X21(1) + w1 * Cos(An(15) - pi / 2) / 2: VX21(3) = VX21(1) '  здесь всегда движется правый фронт волны, поэтому kE=-1
Y21(3) = Y21(1) + w1 * Sin(An(15) - pi / 2) / 2: VY21(3) = VY21(1) '  An(15) - pi / 2 это угол правого конца движущегося фронта
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(1), Y21(1), Alfa3, 0) ' находим угол наклона движущейся пластины
AlfaZ = AlfaZ - pi '                                                    т.к. движется правый фронт волны, то угол разворачиваем на 180
End If
An(30) = AlfaZ - pi / 2 - An(15)
An(31) = ArcSinus(Sin(An(30)) * P21(15) / P21(16))
An(16) = AlfaZ - pi / 2 - An(31): An(1) = An(16)
Info1 = Info1 & "угол падения луча          " & An(30) * kUgol & vbCrLf: Info1 = Info1 & "угол преломления луча " & An(31) * kUgol & vbCrLf
Info = "Alfa15=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -12.5: Picture1.CurrentY = 32 - ii: Picture1.Print Info
Info = "Alfa16=   " & Format(An(16) * kUgol, "000.000000")
Picture1.CurrentX = 4: Picture1.CurrentY = 32 - ii - 1: Picture1.Print Info
v1k(ii) = v1(15): v1(16) = v1(15)
If Check4.Value = 1 Then V(1) = Vs0 / P21(16) '             если учесть изменение скорости луча света при изменении плотности
VX21(1) = V(1) * Cos(An(16)): VY21(1) = V(1) * Sin(An(16))
Nv(ii) = (T - T1) * v1(ii): TT(1) = TT(1) + Nv(ii)
T1 = T: X1iso = X1aso: Tk1(ii) = T1: Xk1(ii) = X1iso: Vs1(16) = V(1): v1(1) = v1(16): ii = 16
kod(15) = 1
'If kod(27) = 1 Then P0 = P00  '               если 2-ой луч уже прошел свой этап пути 27, то устанавливаем нормальный шаг решения, т.к.
'                                              считаем, исходя из конструкции установки Майкельсона, что участки 25 и 26 2-ой луч уже прошел,
'                                              НО так 1-ый луч очень долго будет проходить участок 16
P0 = P00 '       вообще то тут можно смело задавать P0 = P00, т.к. 2-у лучу еще долго лететь до полупрозрачной пластины, т.к. лучи встретятся
'                на задней стенке полупрозрачной пластины примерно в одно время, а для этого 1-ый луч должен ее еще пройти на участке 16
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 15 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
15: End If


If ii = 16 Then  '                                 участок пути 16 в пластине вправо до полупрозрачной поверхности и преломление
Call DX_DY(X21(1), Y21(1), X(3), Y(3), Alfa3, 0)
V12 = V(1) * Cos(An(16) - Alfa3 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 16 '       если за два основных шага решения общий луч НЕ перелетит за полупрозрачную пластину
P0 = P00 / kP0 '                                   в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 16 ' если за уменьшенный шаг решения луч перелетит за пластину, то это будет последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
Info1 = Info1 & "X1=  " & X21(1) & vbCrLf: Info1 = Info1 & "Y1=  " & Y21(1) & vbCrLf '   координаты точки возврата луча к пластине 3
Info1 = Info1 & "X3=  " & X(3) & vbCrLf: Info1 = Info1 & "Y3=  " & Y(3) & vbCrLf '       координаты центра пластины 3
AlfaZ = Alfa3 '                                                      1-ый луч преломляется на полупрозрачной пластине
If Check8.Value = 1 Then '                                           если надо найти угол наклона движущегося зеркала   An(16) примерно 0
X21(3) = X21(1) + w1 * Cos(An(16) - pi / 2) / 2: VX21(3) = VX21(1) ' здесь всегда движется правый фронт волны, поэтому kE=-1
Y21(3) = Y21(1) + w1 * Sin(An(16) - pi / 2) / 2: VY21(3) = VY21(1) ' An(16) - pi / 2 это угол правого конца движущегося фронта
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(1), Y21(1), Alfa3, 0) ' находим угол наклона движущегося зеркала
AlfaZ = AlfaZ - pi '                                                     т.к. движется правый фронт волны, то угол разворачиваем на 180
End If
An(30) = AlfaZ - pi / 2 - An(16)
An(31) = ArcSinus(Sin(An(30)) * P21(16) / P21(18))
An(18) = AlfaZ - pi / 2 - An(31): An(1) = An(18)
Info1 = Info1 & "угол падения луча          " & An(30) * kUgol & vbCrLf: Info1 = Info1 & "угол преломления луча " & An(31) * kUgol & vbCrLf
Info = "Alfa16=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -12.5: Picture1.CurrentY = 32 - ii: Picture1.Print Info
Info = "Alfa18=   " & Format(An(18) * kUgol, "000.000000")
Picture1.CurrentX = 4: Picture1.CurrentY = 32 - ii - 2: Picture1.Print Info '  -2, т.к. ii = 17 нет
v1k(ii) = v1(16): v1(18) = v1(16)
If Check4.Value = 1 Then V(1) = Vs0 / P21(18) '             если учесть изменение скорости луча света при изменении плотности
VX21(1) = V(1) * Cos(An(18)): VY21(1) = V(1) * Sin(An(18))
Nv(ii) = (T - T1) * v1(ii): TT(1) = TT(1) + Nv(ii)
T1 = T: X1iso = X1aso: Tk1(ii) = T1: Xk1(ii) = X1iso: Vs1(18) = V(1): v1(1) = v1(18): ii = 18
Tk1(17) = T1: Xk1(17) = X1iso: Vs1(17) = V(1) '       ii = 17 нет, но эти данные нужны для формы отчета     v1(17) = v1(16):
kod(16) = 1: If kod(27) = 1 Then P0 = P00 '           если 2-ой луч уже прошел свой этот этап пути 27, то устанавливаем нормальный шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 16 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
16: End If


If ii = 18 Then  '                             участок пути 18 от полупрозрачного зеркала до экрана
V12 = V(1) * Cos(An(18)) '              это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '     это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = X(6) - X21(1)
If 2 * (V12 + V21) * P00 < R0 Then GoTo 18 ' если за два основных шага решения общий луч НЕ перелетит за экран
P0 = P00 / kP0 '                             в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 18 ' если за уменьшенный шаг решения луч перелетит за экран, то это будет последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
v1(19) = v1(18): v1k(ii) = v1(18)
If Check1.Value = 1 Then '                      если учесть эффект Доплера
AlfaZ = pi / 2 '                                                    ЭТОТ УГОЛ ЗАДАН ФОРМАЛЬНО, Т.К. ОН НУЖЕН ТОЛЬКО ПРИ ОТРАЖЕНИИ
Call Dopler_Zerkalo(pi / 2, AlfaZ, V(1), An(18), v1(18), 180)
v1(19) = v1n(1): v1k(ii) = v1n(1)
End If
Nv(ii) = (T - T1) * v1(ii): TT(1) = TT(1) + Nv(ii)
T1 = T: X1iso = X1aso: Tk1(ii) = T1: Xk1(ii) = X1iso: ii = 19 '
P21(19) = P21(18): Vs1(19) = V(1): An(19) = An(18): Nv(19) = TT(1) '      это для отчета при ii=19
Tk1(19) = 2 * T: Xk1(19) = 2 * X1iso '                в отчете выводится разность конечной и предыдущей величины потому при ii=19 два времени и пути
Xn1(18) = X21(1): Yn1(18) = Y21(1) '                               координаты 1-го луча при касании экрана
kod(18) = 1:  P0 = P00 '                                           если 2-ой луч еще долеко от экрана, то устанавливаем нормальный шаг решения
If X21(2) + 2 * P00 * VX21(2) >= X(6) Then P0 = P00 / kP0 '        а если за следующее два шага 2-ой луч перелетит экран, то уменьшаем шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 18 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
18: End If


'                       /////////////////                  ПУТЬ 2-го ЛУЧА                   /////////////////////

'If jj = 21 Then  '                       этого участка нет, т.к. он пройден общим лучом при ii=11

If jj = 22 Then  '                        участок пути 22 от полупрозрачного зеркала вверх до прозрачной пластины и преломление
Call DX_DY(X21(2), Y21(2), X(40), Y(40), Alfa4, 0)
V12 = V(2) * Cos(An(22) - Alfa4 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине
V21 = VXiso3 * Cos(AlfaISO - Alfa4 - pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 22 ' если за два основных шага решения общий луч НЕ перелетит за грань прозрачной пластины
P0 = P00 / kP0 '                             в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 22 '      если за уменьшенный шаг решения луч перелетит за грань пластины, то это последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa4
If Check8.Value = 1 Then '          примерно An(22)=90            если надо найти угол наклона движущейся пластины
X21(3) = X21(2) + w1 * Cos(An(22) + pi / 2) / 2: VX21(3) = VX21(2) ' здесь всегда движется левый фронт волны, поэтому kE=1
Y21(3) = Y21(2) + w1 * Sin(An(22) + pi / 2) / 2: VY21(3) = VY21(2) ' An(22) + pi / 2 угол левого конца фронта волны
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(2), Y21(2), Alfa4, 0) 'находим угол наклона движущейся пластины
End If
An(30) = An(22) - AlfaZ + pi / 2 '                                        угол падения уже с учетом или без учета движения пластины
An(31) = ArcSinus(Sin(An(30)) * P21(22) / P21(23)) '                      угол преломления
An(23) = AlfaZ - pi / 2 + An(31): An(2) = An(23) '                        угол скорости луча
Info1 = Info1 & "угол падения луча          " & An(30) * kUgol & vbCrLf: Info1 = Info1 & "угол преломления луча " & An(31) * kUgol & vbCrLf
Info = "Alfa22=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
Info = "Alfa23=   " & Format(An(23) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 1: Picture1.Print Info
v1k(jj) = v1(22): v1(23) = v1(22)
If Check4.Value = 1 Then V(2) = Vs0 / P21(23) '         если учесть изменение скорости света в средах разной оптической плотности
VX21(2) = V(2) * Cos(An(23)): VY21(2) = V(2) * Sin(An(23))
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(23) = V(2): v1(2) = v1(23): jj = 23
kod(22) = 1: If kod(13) = 1 Then P0 = P00 '                 если 1-ой луч уже прошел свой этап пути 13, то устанавливаем нормальный шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 22 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
22: End If


If jj = 23 Then  '                                 участок пути 23 внутри прозрачной пластины и преломление
Call DX_DY(X21(2), Y21(2), X(4), Y(4), Alfa4, 0)
V12 = V(2) * Cos(An(23) - Alfa4 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине
V21 = VXiso3 * Cos(AlfaISO - Alfa4 - pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 23 ' если за два основных шага решения общий луч НЕ перелетит за прозрачную пластину
P0 = P00 / kP0 '                             в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 23 '      если за уменьшенный шаг решения луч перелетит за пластину, то это последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa4
If Check8.Value = 1 Then '                 если надо найти угол наклона движущейся пластины         An(23) примерно 90
X21(3) = X21(2) + w1 * Cos(An(23) + pi / 2) / 2: VX21(3) = VX21(2) '    здесь всегда движется левый фронт волны, поэтому kE=1
Y21(3) = Y21(2) + w1 * Sin(An(23) + pi / 2) / 2: VY21(3) = VY21(2) '    An(22) + pi / 2 угол левого конца фронта волны
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(2), Y21(2), Alfa4, 0) 'находим угол наклона движущейся пластины
End If
An(30) = An(23) - AlfaZ + pi / 2 '                               угол падения
An(31) = ArcSinus(Sin(An(30)) * P21(23) / P21(24)) '             угол преломления
An(24) = AlfaZ - pi / 2 + An(31): An(2) = An(24)
Info1 = Info1 & "угол падения луча          " & An(30) * kUgol & vbCrLf: Info1 = Info1 & "угол преломления луча " & An(31) * kUgol & vbCrLf
Info = "Alfa23=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
Info = "Alfa24=   " & Format(An(24) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 1: Picture1.Print Info
v1k(jj) = v1(23): v1(24) = v1(23)
If Check4.Value = 1 Then V(2) = Vs0 / P21(24) '         если учесть изменение скорости света в средах разной оптической плотности
VX21(2) = V(2) * Cos(An(24)): VY21(2) = V(2) * Sin(An(24))
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(24) = V(2): v1(2) = v1(24): jj = 24
kod(23) = 1: If kod(13) = 1 Then P0 = P00 '               если 1-ой луч уже прошел свой этап пути 13, то устанавливаем нормальный шаг решения
'                                                         т.к. 1-у лучу еще далеко до завершения пути 14
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 23 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
23: End If


If jj = 24 Then  '                             участок пути 24 от прозрачной пластины вверх до зеркала и отражение
Call DX_DY(X21(2), Y21(2), X(2), Y(2), Alfa2, 2)
V12 = V(2) * Cos(An(24) - Alfa2 - pi / 2) '        это скорость луча в АСО вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa2 + pi / 2) '     это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 24 ' если за два основных шага решения общий луч НЕ перелетит за зеркало
P0 = P00 / kP0 '                             в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 24 '      если за уменьшенный шаг решения луч перелетит за зеркало, то это последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa2
If Check2.Value = 1 Then '                                      если надо найти угол наклона движущегося зеркала
kE = 1: If An(24) - Alfa2 > pi / 2 Then kE = -1 '               здесь может двигаться как левый фронт волны, так и правый
X21(3) = X21(2) + kE * w1 * Cos(An(24) - pi / 2) / 2: VX21(3) = VX21(2)
Y21(3) = Y21(2) + kE * w1 * Sin(An(24) - pi / 2) / 2: VY21(3) = VY21(2)
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(2), Y21(2), Alfa2, 0) ' находим угол наклона движущегося зеркала
If kE = -1 Then AlfaZ = AlfaZ - pi '
End If
An(25) = 2 * pi + 2 * AlfaZ - An(24): a = 0: If An(25) >= 2 * pi Then a = Fix(An(25) / 2 / pi)
An(25) = An(25) - a * 2 * pi: An(2) = An(25) '                                                   угол скорости луча
Info = "Alfa24=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
Info = "Alfa25=   " & Format(An(25) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 1: Picture1.Print Info
v1(25) = v1(24): v1k(jj) = v1(24)
If Check1.Value = 1 Then '                                          если учесть эффект Доплера
Call Dopler_Zerkalo(Alfa2, AlfaZ, V(2), An(24), v1(24), 270)
v1(25) = v11: v1k(jj) = v1n(1) '                          получаем частоту света v11 отраженного луча и v1n(1) принятого поверхностью зеркала
End If '
If Check4.Value = 1 Then V(2) = Vs0 / P21(25) '     если учесть изменение скорости света в средах разной оптической плотности
VX21(2) = V(2) * Cos(An(25)): VY21(2) = V(2) * Sin(An(25))
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(25) = V(2): v1(2) = v1(25): jj = 25
kod(24) = 1: P0 = P00 '                                      если 1-ой луч еще долеко от центра зеркала, то устанавливаем нормальный шаг решения
If X21(1) + 10 * P00 * VX21(1) <= X(1) Then P0 = P00 / kP0 ' а если за следующее два шага 1-ый луч перелетит 1-е зеркало, то уменьшаем шаг решения
If kod(14) = 1 Then P0 = P00 '                               если 1-ой луч уже прошел свой этап пути 14, то устанавливаем нормальный шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 24 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
24: End If 'jj = 24


If jj = 25 Then  '                             участок пути 25 от зеркала вниз до прозрачной пластины и преломление
Call DX_DY(X21(2), Y21(2), X(4), Y(4), Alfa4, 0)
V12 = V(2) * Cos(An(25) - Alfa4 - pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 25 '       если за два основных шага решения луч не влетит в пластину
P0 = P00 / kP0 '                                   в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 25 ' если за уменьшенный шаг решения луч влетит в пластину, то это будет последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa4
If Check8.Value = 1 Then '                                              если надо найти угол наклона движущейся пластины   An(25)=270
X21(3) = X21(2) + w1 * Cos(An(25) + pi / 2) / 2: VX21(3) = VX21(2) '    здесь почти всегда движется левый фронт волны, поэтому kE=-1
Y21(3) = Y21(2) + w1 * Sin(An(25) + pi / 2) / 2: VY21(3) = VY21(2) '    An(25) + pi / 2 угол левого конца фронта волны
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(2), Y21(2), Alfa4, 0) 'находим угол наклона движущейся пластины
AlfaZ = AlfaZ - pi
End If
An(30) = An(25) - AlfaZ - pi / 2
An(31) = ArcSinus(Sin(An(30)) * P21(25) / P21(26))
An(26) = AlfaZ + pi / 2 + An(31): An(2) = An(26)
Info1 = Info1 & "угол падения луча          " & An(30) * kUgol & vbCrLf: Info1 = Info1 & "угол преломления луча " & An(31) * kUgol & vbCrLf
Info = "Alfa25=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
Info = "Alfa26=   " & Format(An(26) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 1: Picture1.Print Info
v1k(jj) = v1(25): v1(26) = v1(25)
If Check4.Value = 1 Then V(2) = Vs0 / P21(26) '    если учесть изменение скорости света в средах разной оптической плотности
VX21(2) = V(2) * Cos(An(26)): VY21(2) = V(2) * Sin(An(26))
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(26) = V(2): v1(2) = v1(26): jj = 26
kod(25) = 1: If kod(14) = 1 Then P0 = P00 ' если 1-ой луч уже прошел свой этап пути 14, то устанавливаем нормальный шаг решения, т.к.
'                                           1-у лучу еще далеко до завершения этапа 15
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 25 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
25: End If


If jj = 26 Then  '                             участок пути 26 внутри прозрачной пластины вниз и преломление
Call DX_DY(X21(2), Y21(2), X(40), Y(40), Alfa4, 2)
V12 = V(2) * Cos(An(26) - Alfa4 - pi / 2) '        это скорость луча в АСО вдоль нормали при приближении к нижней грани стеклянной пластины
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 26 '       если за два основных шага решения общий луч не вылетит из пластины
P0 = P00 / kP0 '                                   в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 26 ' если за уменьшенный шаг решения луч вылетит из пластины, то это будет последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa4
If Check8.Value = 1 Then '                                              если надо найти угол наклона движущейся пластины An(26) примерно 270
X21(3) = X21(2) + w1 * Cos(An(26) + pi / 2) / 2: VX21(3) = VX21(2) '    здесь почти всегда движется левый фронт волны, поэтому kE=-1
Y21(3) = Y21(2) + w1 * Sin(An(26) + pi / 2) / 2: VY21(3) = VY21(2) '    An(25) + pi / 2 угол левого конца фронта волны
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(2), Y21(2), Alfa4, 0) 'находим угол наклона движущейся пластины
AlfaZ = AlfaZ - pi
End If
An(30) = An(26) - AlfaZ - pi / 2
An(31) = ArcSinus(Sin(An(30)) * P21(26) / P21(27))
An(27) = AlfaZ + pi / 2 + An(31): An(2) = An(27)
Info1 = Info1 & "угол падения луча          " & An(30) * kUgol & vbCrLf: Info1 = Info1 & "угол преломления луча " & An(31) * kUgol & vbCrLf
Info = "Alfa26=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
Info = "Alfa27=   " & Format(An(27) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 1: Picture1.Print Info
v1k(jj) = v1(26): v1(27) = v1(26)
If Check4.Value = 1 Then V(2) = Vs0 / P21(27) '         если учесть изменение скорости света в средах разной оптической плотности
VX21(2) = V(2) * Cos(An(27)): VY21(2) = V(2) * Sin(An(27))
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(27) = V(2): v1(2) = v1(27): jj = 27
kod(26) = 1: If kod(14) = 1 Then P0 = P00 ' если 1-ой луч уже прошел свой этап пути 14, то устанавливаем нормальный шаг решения, т.к.
'                                           1-у лучу еще далеко до завершения этапа 15
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 26 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
26: End If


If jj = 27 Then  '                       участок пути 27 от прозрачной пластины вниз до полупрозрачного зеркала и отражение
Call DX_DY(X21(2), Y21(2), X(3), Y(3), Alfa3, 0)
V12 = V(2) * Cos(An(27) - Alfa3 - pi / 2) '        это скорость луча в АСО вдоль нормали к полупрозрачной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 + pi / 2) '     это скорость установки в АСО вдоль нормали к пластине навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 27 '       если за два основных шага решения общий луч перелетит за верхнюю грань пластины
P0 = P00 / kP0 '                                   в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 27 ' если за уменьшенный шаг решения луч перетит верхнюю грань пластины, то это будет последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
Info1 = Info1 & "X2=  " & X21(2) & vbCrLf: Info1 = Info1 & "Y2=  " & Y21(2) & vbCrLf '   координаты точки возврата луча к пластине 3
Info1 = Info1 & "X3=  " & X(3) & vbCrLf: Info1 = Info1 & "Y3=  " & Y(3) & vbCrLf '       координаты центра пластины 3
AlfaZ = Alfa3  '                                                        если 2-ой луч отражается от неподвижного зеркала
If Check2.Value = 1 Then '                                              если надо найти угол наклона движущегося зеркала
X21(3) = X21(2) + w1 * Cos(An(27) + pi / 2) / 2: VX21(3) = VX21(2)
Y21(3) = Y21(2) + w1 * Sin(An(27) + pi / 2) / 2: VY21(3) = VY21(2)
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(2), Y21(2), Alfa3, 0) 'находим угол наклона движущегося зеркала
AlfaZ = AlfaZ - pi
End If
An(28) = 2 * AlfaZ - An(27): An(2) = An(28)
Info = "Alfa27=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
Info = "Alfa28=   " & Format(An(28) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 1: Picture1.Print Info
v1(28) = v1(27): v1k(jj) = v1(27)
If Check1.Value = 1 Then '                                 если учесть эффект Доплера
Call Dopler_Zerkalo(Alfa3, AlfaZ, V(2), An(27), v1(27), 0)
v1(28) = v11: v1k(jj) = v1n(1)
End If
If Check4.Value = 1 Then V(2) = Vs0 / P21(28) '             если учесть изменение скорости света в средах разной оптической плотности
VX21(2) = V(2) * Cos(An(28)): VY21(2) = V(2) * Sin(An(28))
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(28) = V(2): v1(2) = v1(28): jj = 28
kod(27) = 1:  If kod(16) = 1 Then P0 = P00 ' если 1-ой луч уже прошел свой этап пути 16 (17-го нет), то устанавливаем нормальный шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 27 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
27: End If


If jj = 28 Then  '                             участок пути 28 от полупрозрачного зеркала до экрана (объектива)
V12 = V(2) * Cos(An(28)) '              это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '     это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = X(6) - X21(2)
If 2 * (V12 + V21) * P00 < R0 Then GoTo 28 ' если за два основных шага решения общий луч не перелетит за экран
P0 = P00 / kP0 '                             в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 28 '      если за уменьшенный шаг решения луч перелетит за экран, то это будет последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
v1(29) = v1(28): v1k(jj) = v1(28)
If Check1.Value = 1 Then '                   если учесть эффект Доплера
AlfaZ = pi / 2 '                                            ЭТОТ УГОЛ ЗАДАН ФОРМАЛЬНО, Т.К. ОН НУЖЕН ТОЛЬКО ПРИ ОТРАЖЕНИИ
Call Dopler_Zerkalo(pi / 2, AlfaZ, V(2), An(28), v1(28), 180)
v1(29) = v1n(1): v1k(jj) = v1n(1)
End If
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: jj = 29
P21(29) = P21(28): Vs2(29) = V(2): An(29) = An(28): Nv(29) = TT(2)
Tk2(29) = 2 * T: Xk2(29) = 2 * X2iso '                в отчете выводится разность конечной и предыдущей величины потому при jj=29 два времени и пути
Xn2(28) = X21(2): Yn2(28) = Y21(2) '                        координаты 2-го луча при касании экрана
kod(28) = 1: P0 = P00 '                                     если 1-ой луч еще долеко от экрана, то устанавливаем нормальный шаг решения
If X21(1) + 2 * P00 * VX21(1) >= X(6) Then P0 = P00 / kP0 ' а если за следующее два шага 1-ой луч перелетит экран, то уменьшаем шаг решения
If Check13.Value = 0 Then '                                 если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                   по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 28 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                               значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
28: End If


If ii = 19 And jj = 29 Then '                   прекратить движение установки и закончить эксперимент
NC = NC0: kodEnd = 1
If Check10.Value = 1 Then
Info = " частота луча на этом участке пути и принятая поверхностью в конце этого участка пути"
Picture1.CurrentX = -12: Picture1.CurrentY = 13: Picture1.Print Info
For i = 10 To 18
Info = "v(" & i & ")/v01=   " & Format(v1(i) / v0, "0.000000000") & "    " & Format(v1k(i) / v0, "0.000000000") _
& "                         v(" & i + 10 & ")/v02=   " & Format(v1(i + 10) / v00, "0.000000000") & "    " & Format(v1k(i + 10) / v00, "0.000000000")
Picture1.CurrentX = -12: Picture1.CurrentY = 20 - 4 * i / 5: Picture1.Print Info
Next i
End If
Text71.Text = v1(19) / v0: Text72.Text = v1(29) / v0  '        частота света принятая экраном
End If

If NC >= NC0 Then '                                            если пора выводить текущие данные на экран
If ii < 18.5 Then Text13.Text = X21(1) '     координаты концов лучей до момента касания их экрана, т.е. текущие
If ii < 18.5 Then Text15.Text = Y21(1)
If jj < 28.5 Then Text14.Text = X21(2)
If jj < 28.5 Then Text16.Text = Y21(2)
If ii > 18.5 Then Text13.Text = Xn1(18) '    координаты концов лучей в момента касания их экрана, т.е. конечные
If ii > 18.5 Then Text15.Text = Yn1(18)
If jj > 28.5 Then Text14.Text = Xn2(28)
If jj > 28.5 Then Text16.Text = Yn2(28)

Text23.Text = Fix(MF * VX21(1)) / MF: Text25.Text = Fix(MF * VY21(1)) / MF 'скорости лучей по осям координат
Text24.Text = Fix(MF * VX21(2)) / MF: Text26.Text = Fix(MF * VY21(2)) / MF
NC = 0: Text17.Text = T: Text47.Text = ii: Text48.Text = jj '       текущее время и номера отрезков путей двух лучей на данный момент
Text31.Text = T1: Text32.Text = T2   '                                      затраченное время до этого участка
Text33.Text = v1(1) / v0: Text34.Text = v1(2) / v00  '                      частота света на текущем участке
Text35.Text = X1iso: Text36.Text = X2iso '                                  пройденный путь до этого участка
Text37.Text = V(1): Text38.Text = V(2) '                                    суммарные скорости лучей на текущем участке
Text51.Text = TT(1): Text52.Text = TT(2) '                                  количество колебаний до этого участка, где дробная часть это фаза
Text61.Text = An(1) * kUgol: Text62.Text = An(2) * kUgol  '                 углы скоростей на текущем участке
If Check11.Value = 1 Then Shema1
If Check14.Value = 1 Then Picture1.Circle (X21(1) / ML, Y21(1) / ML), 0.03, RGB(255, 0, 0)
If Check15.Value = 1 Then Picture1.Circle (X21(2) / ML, Y21(2) / ML), 0.03, RGB(0, 0, 255)
If kodEnd = 1 Then GoTo 90
End If ' NC = NC0

Do While DoEvents() ' идем на 1, после обработки сообщений в очереди
GoTo 1 '              операционной системы, а если будет сообщение от кнопки <Остановить>,
Loop '                то kodEnd будет равен 1 и на следующем шаге будет уже GoTo 90
80: Info = "Ошибка решения при ii= " & ii & "  и jj= " & jj & "  AlfaZ=  " & AlfaZ * kUgol
MsgBox Info, , "Maikelson"
90: If Check5.Value = 1 Then Otcheot1 '                 выводим отчет
If Check24.Value = 1 Then Close pp '                    закрываем отладочный файл
End Sub


















Private Sub Yudin() '                             вычислительный эксперимент на установке Юдина
On Error GoTo 80 '                        после сообщения об ошибке отчет все равно будет выведен
'ii = 1 и jj = 1 общий путь до преднего ребра зеркальной треугольной призмы, а, если А3=А3/2, то 1-ый луч так и летит от источника до экрана
'ii = 10 и jj = 20 путь общего луча, разделившегося на ребре призмы, до ее левой и правой граней как отдельные лучи 1 и 2
'ii = 14     от левой грани зеркальной призмы до левого зеркала
'ii = 18     от левого зеркала до экрана
'jj = 21     от правой грани зеркальной призмы до стеклянной крышки на левом торце цилиндра (если есть цилиндр) или до правого зеркала
'jj = 22     от левого края стеклянной крышки до правого (в этом расчете используем толщину обоих крышек цилиндра, т.е. 2*0,005=0,01 метра)
'jj = 23     внутри цилиндра с воздухом под давлением
'jj = 24     от стеклянной крышки на правом торце цилиндра до правого зеркала (или сразу от ребра призмы до зеркала, если нет цилиндра)
'jj = 28     от правого зеркала до экрана
kod(2) = 0 ' это значит, что, если будет цилиндр, то при этом значении kod(2) можно при прохождении участков 11, 12 и 13 задавать нормальный шаг решения

1:
T = T + P0: NC = NC + 1
X(1) = X(1) + VXiso * P0: Y(1) = Y(1) + VYiso * P0 '    координаты центра левого зеркала
X(2) = X(2) + VXiso * P0: Y(2) = Y(2) + VYiso * P0 '    координаты центра правого зеркала
X(3) = X(3) + VXiso * P0: Y(3) = Y(3) + VYiso * P0 '    координаты переднего ребра зеркальной треугольной призмы
X(5) = X(5) + VXiso * P0: Y(5) = Y(5) + VYiso * P0 '    координаты центра источника света
X(6) = X(6) + VXiso * P0: Y(6) = Y(6) + VYiso * P0 '    координаты центра экрана
X(7) = X(7) + VXiso * P0: Y(7) = Y(7) + VYiso * P0 '    координаты центра левой крышки цилиндра
X21(1) = X21(1) + VX21(1) * P0: Y21(1) = Y21(1) + VY21(1) * P0 ' а это координаты двух отдельных лучей, т.е. после разделения общего луча на два
X21(2) = X21(2) + VX21(2) * P0: Y21(2) = Y21(2) + VY21(2) * P0
X21(10) = X21(10) + VX21(10) * P0: Y21(10) = Y21(10) + VY21(10) * P0 ' а до разделения луча на призме это будут координаты общего луча
X1aso = X1aso + V(1) * P0: X2aso = X2aso + V(2) * P0 '                 суммарный путь двух лучей
'                                       в расчетах используется еще и X1iso = X1aso, но эта переменная X1iso является лишней (надо будет переделать)

'                /////////////////   ОБЩИЙ ПУТЬ ДВУХ ЛУЧЕЙ ОТ ИСТОЧНИКА ДО ПЕРЕДНЕГО РЕБРА ПРИЗМЫ     /////////////////////
If ii = 1 Then '             jj для 2-го луча пока не задано, а 1-ый луч начнет двигаться от ii = 10, и поэтому тут идет расчет движения общего луча

'                                            А МОЖНО БЫЛО СДЕЛАТЬ КАК И КРУГОМ DX_DY ДЛЯ ПОВЕРХНОСТИ ФРОНТА И ТОЧКИ НА ПЕРЕДНЕЙ ГРАНИ ПРИЗМЫ
If Y21(10) + (X(3) - X21(10)) * Tan(Betta - pi / 2) + 2 * P00 * VY21(10) > Y(3) Then P0 = P00 / kP0 ' если луч 10 через два нормальных шага решения
'                                                                          улетит дальше переднего ребра зеркальной призмы то уменьшаем шаг решения
If Y21(10) + (X(3) - X21(10)) * Tan(Betta - pi / 2) >= Y(3) Then '         а, если перелетит за один уменьшенный шаг, то на этом путь 10 заканчивается
'                                                              здесь X21(10) и Y21(10) это координаты центра общего луча, т.е. до его деления
If Check18.Value = 0 Then '                                           если 18-ый чекбокс не отмечен, т.е. у нас один лазер, то
If Check27.Value = 1 Then DV = DV + 2 * (Y(3) - Y(5)) * Tan(Betta1) ' если учесть конусность луча, то находим его ширину при касании призмы
'                                                              теперь, когда общий луч 10 коснется ребра призмы, то он будет поделен на два
X21(1) = (X(3) + X21(10) - DV * Cos(Betta - pi / 2) / 2) / 2 ' луча, но не обязательно попалам, и поэтому находим координаты середины двух лучей
Y21(1) = (Y(3) + Y21(10) - DV * Sin(Betta - pi / 2) / 2) / 2 ' после деления общего луча, как полусумму координат правого и левого концов
X21(2) = (X(3) + X21(10) + DV * Cos(Betta - pi / 2) / 2) / 2 ' фронта волны каждого луча, где одним концом будет ребро призмы а другим концом
Y21(2) = (Y(3) + Y21(10) + DV * Sin(Betta - pi / 2) / 2) / 2 ' координата центра луча и +/- половина текущей ширины луча DV и далее каждый из
'                                                              лучей полетит своим путем (начиная с путей ii = 10 и jj = 20)
End If 'Check18.Value = 0                   при этом скорости центров лучей оставляем рассчитанные ранее (как при делении луча пополам)
'                             а, если 18-ый чекбокс отмечен, т.е. у нас два лазера разнесенных на расстояние 2*DV, то, когда фиктивный общий
'                             луч коснется ребра призмы, то он не будет делиться на два луча, т.к. реальные лучи разнесены и поэтому в точке
' касания ребра призмы этих лучей нет, и они так и полетят отсюда своими путями, начиная с путей ii = 10 и jj = 20, где коснутся граней призмы и
' отразятся от них, а сейчас их координаты X21(1) Y21(1) X21(2) Y21(2) такими и останутся, как они вычислялись параллельно с X21(10) и Y21(10)
'                       ЗДЕСЬ И КОНУСНОСТЬ ЛУЧЕЙ НЕ НАДО УЧИТЫВАТЬ, Т.К. КООРДИНАТЫ ЦЕНТРОВ ЛУЧЕЙ ОТ ЭТОГО НЕ ИЗМЕНЯТСЯ

ii = 10: jj = 20 '                                          ЗАДАЕМ КАЖДОМУ ЛУЧУ СВОЙ ПУТЬ при классической схеме установки "а"
Vs1(11) = Vs: Vs1(12) = Vs: Vs1(13) = Vs: Vs1(14) = Vs '    для выравнивания форматов в отчете, если не будет ii = 11 или будут jj=21, 22 и 23
Vs2(21) = Vs '                                              для выравнивания форматов в отчете, если не будет jj=21
If Check3.Value = 1 Then  '                                 а если левый луч летит прямо (не отражаясь от треугольной призмы), то у
ii = 18: kod(10) = 1: kod(14) = 1 '                         него сразу будет ii=18, а участки ii=10 и ii=14 будут считаться пройденными
v1(18) = v1(10): An(18) = An(10): Vs1(18) = Vs '            и если отмечен чекбокс 3 и не отмечен чекбокс 17, то луч полетит отсюда сразу до экрана,
'                                                           а на участке 18 не будут определяться координаты фиктивного приемника X(118) и Y(118),
X(118) = (X(6) + X(5)) / 2: Y(118) = (Y(6) + Y(5)) / 2 '    расположенного на пути от лазера до экрана при моделировании сплошного эффекта Доплера
If Check17.Value = 1 Then  '                                а если отмечены и чекбокс 3 и чекбокс 17, то луч полетит до зеркала 4
ii = 11: kod(10) = 1 '                                      по пути ii=11, который будет включать в себя путь ii=10
kod(14) = 0 '                                               /////// 07.02.2022 ///////  здесь луч еще не прошел 14-ый путь
v1(11) = v1(10): An(11) = An(10): Vs1(11) = Vs
End If
End If 'Check3.Value = 1
P0 = P00 '                                                         шаг решения задаем нормальный
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Info1 = "X ребра призмы=  " & X(3) & vbCrLf: Info1 = Info1 & "X центра луча=  " & X21(10) & vbCrLf
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "участок пути  " & 1 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
End If 'Y21(10) >= Y(3)
End If 'ii = 1


If ii = 10 Then '                                      1-ый луч отражается от левой грани призмы
Alfa5 = (Alfa3 + pi) / 2 '  Alfa3 это угол при вершине переднего ребра призмы равный обычно 90 градусов, а Alfa5 это угол наклона левой грани
Call DX_DY(X21(1), Y21(1), X(3), Y(3), Alfa5, 1) '    НАХОДИМ R0, т.е. расстояние между лучом и поверхностью грани призмы
V12 = V(1) * Cos(An(10) - Alfa5 + pi / 2) '           это скорость луча в АСО вдоль нормали к грани призмы
V21 = VXiso3 * Cos(AlfaISO - Alfa5 - pi / 2) '        это скорость установки в АСО (навстречу лучу) вдоль нормали к грани призмы
If 2 * (V12 + V21) * P00 < R0 Then GoTo 10 '
P0 = P00 / kP0 '                  уменьшаем шаг решения если за шаг решения луч перелетит за грань призмы и после отражения от призмы
'                                 определяем параметры луча (скорость, угол, частота) с какими он будет двигаться на следующем этапе пути
If R0 > (V12 + V21) * P0 Then GoTo 10 '   расчет отражения производим когда расстояние от луча до грани призмы станет меньше (V12+V21)*P0,
'                                         т.к. и луч движется в АСО к грани призмы со скоростью V12 и она V21 движется в АСО навстречу лучу
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa5 '                                  принимаем угол наклона грани зеркальной призмы в движении равным углу наклона в покое
If Check2.Value = 1 Then '                       если надо найти угол наклона движущегося зеркала (здесь угол скорости луча An(10) примерно 90)
X21(3) = X21(1) + w1 * Cos(An(10) + pi / 2) / 2: VX21(3) = VX21(1)  ' определяем координаты левого края фронта волны и его скорость
Y21(3) = Y21(1) + w1 * Sin(An(10) + pi / 2) / 2: VY21(3) = VY21(1)  ' здесь An(10) + pi / 2 угол левого края фронта волны
'      ПРИ ДВИЖЕНИИ В AlfaV КРАЯ ФРОНТА ВОЛНЫ V12 и V21 УЖЕ ВЫЧИСЛЕНЫ, А R0, Т.Е. РАССТОЯНИЕ ОТ КРАЯ ФРОНТА ВОЛНЫ ДО ПЛОСКОСТИ, ОПРЕДЕЛЯЕТСЯ В DX_DY
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(1), Y21(1), Alfa5, 0) ' находим угол наклона движущегося зеркала AlfaZ, т.е. новое значение угла Alfa5
End If 'Check2.Value = 1
An(14) = 2 * AlfaZ - An(10): An(1) = An(14) '                            это будет угол скорости 1-го луча на участке 14
Info = "Alfa10=   " & Format(AlfaZ * kUgol, "000.000000") '
Picture1.CurrentX = -12.5: Picture1.CurrentY = 32 - ii: Picture1.Print Info
Info = "Alfa14=   " & Format(An(14) * kUgol, "000.000000")
Picture1.CurrentX = 4: Picture1.CurrentY = 32 - ii - 4: Picture1.Print Info
v1(14) = v1(10): v1k(ii) = v1(10)
If Check1.Value = 1 Then '                                  если учесть эффект Доплера (ЭД)
If Check33.Value = 0 Then Call Dopler_Zerkalo(Alfa5, AlfaZ, V(1), An(10), v1(10), 180) '  если моделировать эффект Доплера
'Private Sub Dopler_Zerkalo(ByVal Alfa0 As Double, ByVal Alfa10 As Double, ByVal VL As Double, ByVal AL As Double, ByVal v10 As Double, ByVal kodUgla As Integer)
' передаем в Dopler_Zerkalo углы наклона зеркала в покое и в движении и частоту света, а получаем частоту света v11 отраженного луча
'                                                                                и v1n(1) частоту света принятую движущимся зеркалом
If Check33.Value = 1 Then '                                  если рассчитать эффект Доплера аналитически
If Check26.Value = 0 Then '                                  и при этом учесть углы наклона движущихся зеркал, а не в статике
V12 = V(1) * Cos(An(10) - AlfaZ + pi / 2) '    это скорость луча в АСО вдоль нормали к движущейся грани призмы
V21 = VXiso3 * Cos(AlfaISO - AlfaZ - pi / 2) ' это скорость установки в АСО вдоль нормали к движущейся грани призмы навстречу лучу
End If
v1n(1) = v1(10) * (1 + V21 / V12) '                          частота света принятая поверхностью зеркала
v11 = v1n(1) / (1 - V21 / V12) '                             частота света отраженная поверхностью зеркала
End If
v1(14) = v11: v1k(ii) = v1n(1)
End If
VX21(1) = V(1) * Cos(An(14)): VY21(1) = V(1) * Sin(An(14)) '       ПЕРВЫЙ ЛУЧ ВСЕ ВРЕМЯ ЛЕТИТ В ОДНОЙ СРЕДЕ, Т.Е. V(1) ИЗМЕНЯТЬСЯ НЕ БУДЕТ
Nv(ii) = (T - T1) * v1(ii): TT(1) = TT(1) + Nv(ii)
T1 = T: X1iso = X1aso: Tk1(ii) = T1: Xk1(ii) = X1iso: Vs1(14) = V(1): v1(1) = v1(14): ii = 14
Tk1(11) = T1: Tk1(12) = T1: Tk1(13) = T1: Xk1(11) = X1iso: Xk1(12) = X1iso: Xk1(13) = X1iso ' ЭТО для отчета
X(110) = (X(3) + X(5)) / 2: Y(110) = (Y(3) + Y(5)) / 2: X(120) = X(110): Y(120) = Y(110) '  а ЭТО координаты фиктивного приемника для сплошного ЭД
kod(10) = 1: If kod(20) = 1 Then P0 = P00 '                        если и 2-ой луч уже отразился от зеркала, то устанавливаем нормальный шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "участок пути  " & 10 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
10: End If 'ii = 10
                                                     
                                                     
If ii = 11 Then '                                      1-ый луч пролетает мимо призмы и отражается от зеркала 4
Call DX_DY(X21(1), Y21(1), X(4), Y(4), Alfa4, 1) '
V12 = V(1) * Cos(Alfa4 + pi / 2 - An(11)) '           это скорость луча вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 11
P0 = P00 / kP0 '                               уменьшаем шаг решения если за два нормальных шага решения луч перелетит за зеркало
If R0 > (V12 + V21) * P0 Then GoTo 11 '        если за уменьшенный шаг решения луч не перелетел за зеркало, то он продолжает движение на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa4
If Check2.Value = 1 Then '          An(11) = 90                          если надо найти угол наклона движущегося зеркала
X21(3) = X21(1) + w1 * Cos(An(11) - pi / 2) / 2: VX21(3) = VX21(1) '     здесь всегда будет двигаться правый фронт волны
Y21(3) = Y21(1) + w1 * Sin(An(11) - pi / 2) / 2: VY21(3) = VY21(1)
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(1), Y21(1), Alfa4, 0) ' находим угол наклона движущегося зеркала AlfaZ
End If
An(14) = 2 * AlfaZ - An(11): An(1) = An(14)  '                           здесь AlfaZ это угол наклона движущегося или покоящегося зеркала
Info = "Alfa14=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -12.5: Picture1.CurrentY = 32 - ii: Picture1.Print Info
Info = "Alfa14=   " & Format(An(14) * kUgol, "000.000000")
Picture1.CurrentX = 4: Picture1.CurrentY = 32 - ii - 3: Picture1.Print Info
v1(14) = v1(10)
If Check1.Value = 1 Then '                                               если учесть эффект Доплера
If Check33.Value = 0 Then Call Dopler_Zerkalo(Alfa4, AlfaZ, V(1), An(11), v1(11), 0) ' если моделировать эффект Доплера
If Check33.Value = 1 Then '                                                            если рассчитать эффект Доплера аналитически
If Check26.Value = 0 Then '                                                            и при этом учесть углы движущихся зеркал
V12 = V(1) * Cos(AlfaZ + pi / 2 - An(11)) '           это скорость луча вдоль нормали к движущемуся зеркалу
V21 = VXiso3 * Cos(AlfaISO - AlfaZ + pi / 2) '        это скорость установки в АСО вдоль нормали к движущемуся зеркалу навстречу лучу
End If
v1n(1) = v1(10) * (1 + V21 / V12) '                               частота света принятая поверхностью зеркала
v11 = v1n(1) / (1 - V21 / V12) '                                  частота света отраженная поверхностью зеркала (призмы)
End If
v1(14) = v11: v1k(ii) = v1n(1) '                                  задаем частоту света v11 отраженного луча для следующего участка пути
End If '
VX21(1) = V(1) * Cos(An(14)): VY21(1) = V(1) * Sin(An(14)) '      ПЕРВЫЙ ЛУЧ ВСЕ ВРЕМЯ ЛЕТИТ В ОДНОЙ СРЕДЕ, Т.Е. V(1) ИЗМЕНЯТЬСЯ НЕ БУДЕТ
Nv(ii) = (T - T1) * v1(ii): TT(1) = TT(1) + Nv(ii)
T1 = T: X1iso = X1aso: Tk1(ii) = T1: Xk1(ii) = X1iso: Vs1(14) = V(1): v1(1) = v1(14): kod(11) = 1: ii = 14
Xk1(12) = X1iso: Xk1(13) = X1iso: Tk1(12) = T1: Tk1(13) = T1: '   ЭТО для отчета
X(111) = (X(4) + X(5)) / 2: Y(111) = (Y(4) + Y(5)) / 2 '          координаты фиктивного приемника на этом пути (у 2-го луча нет этого участка пути)
If jj = 24 And X(2) - X21(2) > 10 * VX21(2) * P00 Then P0 = P00 ' если 2-ой луч на участке 24 не долетит до центра зеркала и за 10-ть основных шагов
If kod(24) = 1 Then P0 = P00 '                                    если 2-ой луч уже отразился от зеркала, то устанавливаем нормальный шаг решения
If jj <> 24 And Check25.Value = 1 Then '                          а, если есть цилиндр, то надо проверить не идет ли точный расчет в цилиндре и,
If kod(2) = 0 Then P0 = P00 '                                     если kod(2) = 0, то значит не идет точный расчет и шаг можно увеличить
End If
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "участок пути  " & 11 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
11: End If 'ii = 11


If ii = 14 Then  '                                    участок пути 14 от левой грани призмы до зеркала 1, которое слева, или пролетает мимо
Call DX_DY(X21(1), Y21(1), X(1), Y(1), Alfa1, 1) '    призмы до зеркала 4 и отразившись от него летит до зеркала 1, которое установлено справа
V12 = V(1) * Cos(Alfa1 + pi / 2 - An(14)) '           An(14)=180, если зеркало расположено слева и это скорость луча вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa1 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If Check3.Value = 1 And Check17.Value = 1 Then '      An(14)=0, если зеркало расположено справа, т.е. так же, как и правое зеркало
V12 = V(1) * Cos(Alfa1 - pi / 2 - An(14)) '           это скорость луча вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa1 - pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
End If
If 2 * (V12 + V21) * P00 < R0 Then GoTo 14
P0 = P00 / kP0 '                                      уменьшаем шаг решения если за два нормальных шага решения луч перелетит за зеркало
If R0 > (V12 + V21) * P0 Then GoTo 14 '               а, если не перелетел за уменьшаем шаг решения, то продолжает движение на этом этапе пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa1 '                                        задаем угол наклона зеркала равным его углу в статике
If Check2.Value = 1 Then '                             если надо найти угол наклона движущегося зеркала
X21(3) = X21(1) + w1 * Cos(An(14) - pi / 2) / 2: VX21(3) = VX21(1) ' если зеркало расположено слева, то при An(14)= 180 и Alfa1 > pi/2
Y21(3) = Y21(1) + w1 * Sin(An(14) - pi / 2) / 2: VY21(3) = VY21(1) ' всегда движется правый фронт волны
If Check3.Value = 1 And Check17.Value = 1 Then
X21(3) = X21(1) - w1 * Sin(An(14)) / 2: VX21(3) = VX21(1) '          если зеркало расположено справа, то при An(14)= 0 и Alfa1 < pi/2
Y21(3) = Y21(1) + w1 * Cos(An(14)) / 2: VY21(3) = VY21(1) '          всегда движется левый фронт волны
End If
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(1), Y21(1), Alfa1, 2) '  находим угол наклона движущегося зеркала AlfaZ
End If 'Check2.Value = 1
An(18) = 2 * AlfaZ - An(14): An(1) = An(18)  '                        здесь AlfaZ будет угол наклона или движущегося или покоящегося зеркала
Info = "Alfa14=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -12.5: Picture1.CurrentY = 32 - ii: Picture1.Print Info
Info = "Alfa18=   " & Format(An(18) * kUgol, "000.000000")
Picture1.CurrentX = 4: Picture1.CurrentY = 32 - ii - 4: Picture1.Print Info
v1(18) = v1(14): v1k(ii) = v1(14)
If Check1.Value = 1 Then '                                                   если учесть эффект Доплера
If Check33.Value = 0 Then Call Dopler_Zerkalo(Alfa1, AlfaZ, V(1), An(14), v1(14), 90) ' если моделировать эффекта Доплера
If Check33.Value = 1 Then '                                                             если сделать аналитический расчет эффекта Доплера
If Check26.Value = 0 Then '                                                             и при этом учесть углы наклона движущихся зеркал
'                         если зеркало расположено слева (стандартная схема), то при An(14)= 180 и Alfa1 > pi/2 и всегда движется правый фронт волны
V12 = V(1) * Cos(AlfaZ + pi / 2 - An(14)) '      это скорость луча вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - AlfaZ + pi / 2) '   это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If Check3.Value = 1 And Check17.Value = 1 Then ' если зеркало расположено справа, то при An(14)= 0 и Alfa1 < pi/2 и всегда движется левый фронт волны
V12 = V(1) * Cos(AlfaZ - pi / 2 - An(14)) '      это скорость луча вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - AlfaZ - pi / 2) '   это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
End If
Info1 = Info1 & "AlfaZ для аналитического расчета=  " & AlfaZ * kUgol & vbCrLf:
Info1 = Info1 & "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "Alfa12=  " & (AlfaZ - An(14) + pi / 2) * kUgol & vbCrLf: Info1 = Info1 & "Alfa21=  " & (AlfaISO + pi / 2 - AlfaZ) * kUgol & vbCrLf
Info1 = Info1 & "cos(Alfa12)=  " & Cos(AlfaZ - An(14) + pi / 2) & vbCrLf: Info1 = Info1 & "cos(Alfa21)=  " & Cos(AlfaISO + pi / 2 - AlfaZ) & vbCrLf
End If 'Check26.Value = 0
v1n(1) = v1(14) * (1 + V21 / V12) '                            частота света принятая поверхностью зеркала
v11 = v1n(1) / (1 - V21 / V12) '                            частота света отраженная поверхностью зеркала
End If 'Check33.Value = 1
v1(18) = v11: v1k(ii) = v1n(1) '                     в покое и в движении и частоту света, а получаем частоту света v11 отраженного луча
End If 'Check1.Value = 1
VX21(1) = V(1) * Cos(An(18)): VY21(1) = V(1) * Sin(An(18))
Nv(ii) = (T - T1) * v1(ii): TT(1) = TT(1) + Nv(ii)
T1 = T: X1iso = X1aso: Tk1(ii) = T1:  Xk1(ii) = X1iso: Vs1(18) = V(1): v1(1) = v1(18): kod(14) = 1: ii = 18
Tk1(15) = T1: Xk1(15) = X1iso: Tk1(16) = T1: Xk1(16) = X1iso: Tk1(17) = T1: Xk1(17) = X1iso: '            ЭТО для отчета
X(114) = (X(3) + X(1)) / 2: Y(114) = (Y(3) + Y(1)) / 2 '          координаты фиктивного приемника для сплошного эффекта Доплера на пути 14
If jj = 24 And X(2) > X21(2) + 10 * VX21(2) * P00 Then P0 = P00 ' если 2-ой луч не долетит до центра зеркала и за 10-ть основных шагов
If kod(24) = 1 Then P0 = P00 '                                    если 2-ой луч уже отразился от зеркала, то устанавливаем нормальный шаг решения
If jj <> 24 And Check25.Value = 1 Then '                          если есть цилиндр, то надо проверить не идет ли точный расчет в цилиндре
If kod(2) = 0 Then P0 = P00 '                                     если kod(2) = 1, то значит идет точный расчет и шаг не надо увеличивать
End If
If Check13.Value = 0 Then '                                       если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                         по умолчанию не прерывать эксперимент
Info = "участок пути  " & 14 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                     значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
14: End If


If jj = 20 Then  '                                    2-ой луч отражается от правой грани призмы
Alfa5 = (pi - Alfa3) / 2 '                                       это угол наклона правой грани
Call DX_DY(X21(2), Y21(2), X(3), Y(3), Alfa5, 2)
V12 = V(2) * Cos(Alfa5 + pi / 2 - An(20)) '           это скорость луча в АСО вдоль нормали к правой грани
V21 = VXiso3 * Cos(AlfaISO - Alfa5 + pi / 2) '        это скорость установки в АСО вдоль нормали к правой грани навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 20
P0 = P00 / kP0 '                               уменьшаем шаг решения если за шаг решения луч перелетит за грань призмы
If R0 > (V12 + V21) * P0 Then GoTo 20 '        если за уменьшенный шаг решения луч не перелетит за грань призмы, то продолжит движение на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa5 '                                это угол наклона правой грани призмы
If Check2.Value = 1 Then '                     если надо найти угол наклона движущегося зеркала (здесь угол скорости луча An(20) примерно 90)
X21(3) = X21(2) + w1 * Cos(An(20) - pi / 2) / 2: VX21(3) = VX21(2)  '   An(20) - pi / 2 это угол края фронта волны (движется правый край)
Y21(3) = Y21(2) + w1 * Sin(An(20) - pi / 2) / 2: VY21(3) = VY21(2)
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(2), Y21(2), Alfa5, 0) 'находим угол наклона движущегося зеркала, т.е. находим новое значение AlfaZ
End If
Info = "Alfa20=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
v1(24) = v1(20): v1k(jj) = v1(20)
If Check1.Value = 1 Then '                             если учесть эффект Доплера
If Check33.Value = 0 Then Call Dopler_Zerkalo(Alfa5, AlfaZ, V(2), An(20), v1(20), 0) ' если моделировать эффекта Доплера
If Check33.Value = 1 Then '                                                            если сделать аналитический расчет эффекта Доплера
If Check26.Value = 0 Then '                                                            и при этом учесть углы движущихся зеркал
V12 = V(2) * Cos(AlfaZ + pi / 2 - An(20)) '           это скорость луча в АСО вдоль нормали к движущемуся зеркалу
V21 = VXiso3 * Cos(AlfaISO - AlfaZ + pi / 2) '        это скорость установки в АСО вдоль нормали к движущемуся зеркалу навстречу лучу
End If
v1n(1) = v1(20) * (1 + V21 / V12) '                   частота света принятая поверхностью зеркала
v11 = v1n(1) / (1 - V21 / V12) '                      частота света отраженная поверхностью зеркала
End If
v1(24) = v11: v1k(jj) = v1n(1) '                      получаем частоту света v11 отраженного луча, т.е. для участка 24 и принятую гранью призмы
End If '
An(24) = 2 * AlfaZ - An(20) '                         расчет ведем сразу для участка 24 (еслди будет цилиндр, то на участке 21 параметры будут те же)
VX21(2) = V(2) * Cos(An(24)): VY21(2) = V(2) * Sin(An(24)) '   СКОРОСТЬ СВЕТА БУДЕМ ИЗМЕНЯТЬ ТОЛЬКО ПРИ НАЛИЧИЕ ЦИЛИНДРА
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(24) = V(2): An(2) = An(24): v1(2) = v1(24): kod(20) = 1
X(120) = (X(3) + X(5)) / 2: Y(120) = (Y(3) + Y(5)) / 2 '           координаты фиктивного приемника для сплошного эффекта Доплера на пути 20
If Check25.Value = 0 Then '                                        если второй луч НЕ пролетает через цилиндр, то сразу jj = 24
Info = "Alfa24=   " & Format(An(24) * kUgol, "000.000000") '       угол под которым движется луч на следующем участке
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 4: Picture1.Print Info
Tk2(21) = T2: Xk2(21) = X2iso: Tk2(22) = T2: Xk2(22) = X2iso: Tk2(23) = T2: Xk2(23) = X2iso: jj = 24 ' а эти координаты и время для отчета,
End If 'Check25.Value = 0                                      если не будет цилиндра, т.к. там используются и значения предыдущих участков

If Check25.Value = 1 Then '                                        если второй луч пролетает и через цилиндр, то будет jj = 21
Info = "Alfa21=   " & Format(An(21) * kUgol, "000.000000") '       угол под которым движется луч на следующем участке
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 1: Picture1.Print Info
v1(21) = v1(24): Vs2(21) = V(2): An(21) = An(24): jj = 21 '        здесь на участке 21 параметры будут такие же, как и для участка 24
End If 'Check25.Value = 1

If kod(10) = 1 Then P0 = P00 '                                     если и 1-ой луч уже отразился, то устанавливаем нормальный шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "участок пути  " & 20 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
20: End If 'ii = 20

If jj = 21 Then  '                                         участок пути 21 от правой грани призмы до левой стеклянной крышки цилиндра
Call DX_DY(X21(2), Y21(2), X(7) - w71, Y(7), pi / 2, 2) '  находим расстояние RO вдоль нормали к левой стеклянной крышке цилиндра
V12 = V(2) * Cos(An(21))   '                               это скорость луча вдоль нормали к стеклянной крышке цилиндра
V21 = VXiso3 * Cos(AlfaISO - pi)  '                        это скорость установки в АСО вдоль нормали к стеклянной крышке цилиндра навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 21
P0 = P00 / kP0: kod(2) = 1 '                               уменьшаем шаг решения если за два шага решения луч перелетит за крышку цилиндра
If R0 > (V12 + V21) * P0 Then GoTo 21
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = pi / 2 '             не определяем угол наклона стеклянных крышек в движении, т.к. при наших углах движения лучей он будет примерно pi / 2
An(22) = An(21): An(2) = An(22) '                                и не учитываем преломление луча при входе в стеклянные крышки
Info = "Alfa21=   " & Format(pi / 2 * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
Info = "Alfa22=   " & Format(An(22) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 1: Picture1.Print Info
v1(22) = v1(21): v1k(jj) = v1(21) '                               эффект Доплера тоже не учитываем
If Check4.Value = 1 Then '                                        если учесть изменение оптической плотности среды
If Option2.Value = True Then V(2) = Vs0 / P21(22) '                  если учесть изменение скорости света при его постоянной частоте
If Option6.Value = True Then v1(22) = v1(21) * (P21(21) / P21(22)) ' если учесть изменение частоты света при его постоянной скорости
End If
VX21(2) = V(2) * Cos(An(22)): VY21(2) = V(2) * Sin(An(22))
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(22) = V(2): v1(2) = v1(22):
kod(21) = 1: kod(2) = 0: jj = 22 '                                 если kod(2) = 0, то 1-ый луч может лететь с нормальным шагом
P0 = P00 '                                    здесь принято, что 1-ой луч еще продолжает лететь или до зеркала 1 или до зеркала 4, т.к. цилиндр
'                                             устанавливается максимально близко к призме, и поэтому устанавливаем нормальный шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "участок пути  " & 21 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
21: End If

If jj = 22 Then  '                                    участок пути 22 в стеклянных крышках цилиндра (учитываем сразу две толщины крышек)
Call DX_DY(X21(2), Y21(2), X(7), Y(7), pi / 2, 2) '   находим расстояние RO вдоль нормали к крышке цилиндра
V12 = V(2) * Cos(An(22)) '                            это скорость луча вдоль нормали к крышке цилиндра
V21 = VXiso3 * Cos(AlfaISO - pi) '                    это скорость установки в АСО вдоль нормали к крышке цилиндра навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 22
P0 = P00 / kP0: kod(2) = 1 '                                      уменьшаем шаг решения если за два шага решения луч перелетит за крышку
If R0 > (V12 + V21) * P0 Then GoTo 22
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = pi / 2: An(23) = An(22): An(2) = An(23) '                 не учитываем преломление луча при выходе из стеклянной крышки
Info = "Alfa22=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
Info = "Alfa23=   " & Format(An(23) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 1: Picture1.Print Info
v1(23) = v1(22): v1k(jj) = v1(22) '                               и эффект Доплера тоже не учитываем
If Check4.Value = 1 Then '                                           если учесть изменение оптической плотности среды
If Option2.Value = True Then V(2) = Vs0 / P21(23) '                  если учесть изменение скорости света при его неизменной частоте
If Option6.Value = True Then v1(23) = v1(22) * (P21(22) / P21(23)) ' если учесть изменение частоты света при его неизменной скорости
End If
VX21(2) = V(2) * Cos(An(23)): VY21(2) = V(2) * Sin(An(23))
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(23) = V(2): v1(2) = v1(23): kod(2) = 0: kod(22) = 1: jj = 23
'                                     ///////  07.02.22  ///// изменил код, т.к. 1-ый луч в это время может может двигаться по разным путям
'P0 = P00 '      здесь принято, что 1-ой луч продолжает лететь или до зеркала 1 или до зеркала 4 и поэтому устанавливаем нормальный шаг решения
If kod(14) = 1 Then P0 = P00 '                                если 1-ой луч уже отразился от зеркала 1, то устанавливаем нормальный шаг решения
If ii = 14 Then '                                             а, если 1-ой луч только движется к зеркалу 1, то , нормальный шаг устанавливаем
If Check17.Value = 0 And X(1) < X21(1) + 10 * VX21(1) * P00 Then P0 = P00 ' если он не долетит до зеркала слева и за 10-ть основных шагов
If Check17.Value = 1 And X(1) > X21(1) + 10 * VX21(1) * P00 Then P0 = P00 ' если он не долетит до зеркала справа и за 10-ть основных шагов
End If
If ii = 11 Then '                                             а, если 1-ой луч только движется к зеркалу 4, то устанавливаем
If Y(4) > Y21(1) + 10 * VY21(1) * P00 Then P0 = P00 '         нормальный шаг, если 1-ый луч не долетит до него и за 10-ть основных шагов
End If
If ii = 18 Then P0 = P00 '                                    и, если 1-ой луч движется к экрану то устанавливаем нормальный шаг
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "участок пути  " & 22 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
22: End If

If jj = 23 Then  '                                 участок пути 23 внутри цилиндра до его правого торца (путь в стекле правой крышки уже учли)
Call DX_DY(X21(2), Y21(2), X(7) + w7, Y(7), pi / 2, 2) '       находим расстояние RO вдоль нормали к крышке цилиндра
V12 = V(2) * Cos(An(23))  '                                    это скорость луча вдоль нормали к крышке цилиндра
V21 = VXiso3 * Cos(AlfaISO - pi) '                             это скорость установки в АСО вдоль нормали к крышке цилиндра навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 23
P0 = P00 / kP0: kod(2) = 1 '                                   уменьшаем шаг решения если за два шаг решения луч перелетит за торец цилиндра
If R0 > (V12 + V21) * P0 Then GoTo 23
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = pi / 2: An(24) = An(23): An(2) = An(23) '                          не учитываем преломление луча при выходе из воздуха в цилиндре под
Info = "Alfa23=   " & Format(AlfaZ * kUgol, "000.000000") '                давлением в воздух при атмосферном давлении (крышки здесь уже нет)
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
Info = "Alfa24=   " & Format(An(24) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 1: Picture1.Print Info
v1(24) = v1(23): v1k(jj) = v1(23) '                                        и эффект Доплера не учитываем
If Check4.Value = 1 Then '                                           если учесть изменение оптической плотности среды
If Option2.Value = True Then V(2) = Vs0 / P21(24) '                  если учесть изменение скорости света при его неизменной частоте
If Option6.Value = True Then v1(24) = v1(23) * (P21(23) / P21(24)) ' если учесть изменение частоты света при его неизменной скорости
End If
VX21(2) = V(2) * Cos(An(24)): VY21(2) = V(2) * Sin(An(24))
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(24) = V(2): v1(2) = v1(24): kod(23) = 1: kod(2) = 0: jj = 24
'                                           ///////  07.02.22  ///// изменил код, т.к. 1-ый луч в это время может двигаться по разным путям
'P0 = P00 '      здесь принято, что 1-ой луч продолжает лететь или до зеркала 1 или до зеркала 4 и поэтому устанавливаем нормальный шаг решения
If kod(14) = 1 Then P0 = P00 '                                если 1-ой луч уже отразился от зеркала 1, то устанавливаем нормальный шаг решения
If ii = 14 Then '                                             а, если 1-ой луч только движется к зеркалу 1, то нормальный шаг устанавливаем
If Check17.Value = 0 And X(1) < X21(1) + 10 * VX21(1) * P00 Then P0 = P00 ' если он не долетит до зеркала слева и за 10-ть основных шагов
If Check17.Value = 1 And X(1) > X21(1) + 10 * VX21(1) * P00 Then P0 = P00 ' если он не долетит до зеркала справа и за 10-ть основных шагов
End If
If ii = 11 Then '                                             а, если 1-ой луч только движется к зеркалу 4, то устанавливаем
If Y(4) > Y21(1) + 10 * VY21(1) * P00 Then P0 = P00 '         нормальный шаг, если 1-ый луч не долетит до него и за 10-ть основных шагов
End If
If ii = 18 Then P0 = P00 '                                    и, если 1-ой луч движется к экрану то устанавливаем нормальный шаг
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "участок пути  " & 23 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
23: End If

If jj = 24 Then  '                                    участок пути 24 от призмы или правого торца цилиндра до правого зеркала и отражение
Call DX_DY(X21(2), Y21(2), X(2), Y(2), Alfa2, 2) '    находим расстояние RO вдоль нормали к зеркалу
V12 = V(2) * Cos(An(24) - Alfa2 + pi / 2) '           это скорость луча вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa2 - pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If 2 * (V12 + V21) * P00 < R0 Then GoTo 24
P0 = P00 / kP0 '                                      уменьшаем шаг решения если за два шага решения луч перелетит за зеркало
If R0 > (V12 + V21) * P0 Then GoTo 24
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = Alfa2
If Check2.Value = 1 Then '                                  если надо найти угол наклона движущегося зеркала
X21(3) = X21(2) - w1 * Sin(An(24)) / 2: VX21(3) = VX21(2) ' здесь при An(24)= 0 и Alfa2 < pi/2 будет двигаться левый фронт волны
Y21(3) = Y21(2) + w1 * Cos(An(24)) / 2: VY21(3) = VY21(2)
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(2), Y21(2), Alfa2, 2) ' находим угол наклона движущегося зеркала
End If
An(28) = 2 * AlfaZ - An(24): An(2) = An(28)
Info = "Alfa24=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
Info = "Alfa28=   " & Format(An(28) * kUgol, "000.000000")
Picture1.CurrentX = 10: Picture1.CurrentY = 42 - jj - 4: Picture1.Print Info
v1(28) = v1(24): v1k(jj) = v1(24)
If Check1.Value = 1 Then '                                   если учесть эффект Доплера
If Check33.Value = 0 Then Call Dopler_Zerkalo(Alfa2, AlfaZ, V(2), An(24), v1(24), 90)
If Check33.Value = 1 Then '                                  если сделать аналитический расчет эффекта Доплера
If Check26.Value = 0 Then '                                  и если учесть движение зеркал, то находим новые значения V12 и V21
V12 = V(2) * Cos(An(24) - AlfaZ + pi / 2) '                  это скорость луча вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - AlfaZ - pi / 2) '               это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
End If
v1n(1) = v1(24) * (1 + V21 / V12) '                          частота света принятая поверхностью зеркала
v11 = v1n(1) / (1 - V21 / V12) '                             частота света отраженная поверхностью зеркала
End If
v1(28) = v11: v1k(jj) = v1n(1)  '                            получаем частоту света v11 отраженного луча и v1n(1) принятую зеркалом
End If '
VX21(2) = V(2) * Cos(An(28)): VY21(2) = V(2) * Sin(An(28))
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(28) = V(2): v1(2) = v1(28): kod(24) = 1: jj = 28
Tk2(25) = T2: Xk2(25) = X2iso: Tk2(26) = T2: Xk2(26) = X2iso: Tk2(27) = T2: Xk2(27) = X2iso '                       ЭТО для отчета
X(124) = (X(3) + X(2)) / 2: Y(124) = (Y(3) + Y(2)) / 2
'                                            ///////  07.02.22  ///// изменил код, т.к. 1-ый луч в это время может двигаться по разным путям
If kod(14) = 1 Then P0 = P00 '                                если 1-ой луч уже отразился от зеркала 1, то устанавливаем нормальный шаг решения
If ii = 14 Then '                                             а, если 1-ой луч только движется к зеркалу 1, то , нормальный шаг устанавливаем
If Check17.Value = 0 And X(1) < X21(1) + 10 * VX21(1) * P00 Then P0 = P00 ' если он не долетит до зеркала слева и за 10-ть основных шагов
If Check17.Value = 1 And X(1) > X21(1) + 10 * VX21(1) * P00 Then P0 = P00 ' если он не долетит до зеркала справа и за 10-ть основных шагов
End If
If ii = 11 Then '                                             а, если 1-ой луч только движется к зеркалу 4, то устанавливаем
If Y(4) > Y21(1) + 10 * VY21(1) * P00 Then P0 = P00 '         нормальный шаг, если 1-ый луч не долетит до него и за 10-ть основных шагов
End If
If ii = 18 Then P0 = P00 '                                    и, если 1-ой луч движется к экрану то устанавливаем нормальный шаг
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "участок пути  " & 24 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
24: End If


If ii = 18 Then  '                                  участок пути 18 от левого зеркала до экрана
V12 = V(1) * Cos(An(18) - pi / 2) '                 это скорость луча в АСО вдоль нормали к экрану при приближении к нему (AlfaZ=0)
V21 = VXiso3 * Cos(AlfaISO + pi / 2) '              это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = Y(6) - Y21(1)
If 2 * (V12 + V21) * P00 < R0 Then GoTo 18 ' если за два основных шага решения луч не перелетит за экран
P0 = P00 / kP0 '                             в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 18 '      если за уменьшенный шаг решения луч перелетит за экран, то это будет последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = 0 '                                  статический угол наклона приемника
If Check2.Value = 1 Then '                   если надо найти угол наклона движущегося приемника (здесь угол скорости луча An(18) примерно 90)
X21(3) = X21(1) + w1 * Cos(An(18) - pi / 2) / 2: VX21(3) = VX21(1) ' стандартная схема (луч падает слева и движется правый край фронта)
Y21(3) = Y21(1) + w1 * Sin(An(18) - pi / 2) / 2: VY21(3) = VY21(1) ' здесь An(18) - pi / 2 угол правого края фронта волны
'If Check3.Value = 1 And Check17.Value = 1 Then ' если луч пролетает мимо призмы и отражается от зеркала 4, а потом от зеркала 1
If An(18) > pi / 2 Then '                                             тогда движется левый край фронта волны
X21(3) = X21(1) - w1 * Cos(An(18) - pi / 2) / 2: VX21(3) = VX21(1)  ' и An(18) - pi / 2 угол левого края фронта волны
Y21(3) = Y21(1) - w1 * Sin(An(18) - pi / 2) / 2: VY21(3) = VY21(1)
End If
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(1), Y21(1), 0, 0) ' находим угол наклона движущегося зеркала, т.е. экрана (приемника)
End If 'Check2.Value = 1
Info = "Alfa18=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -12.5: Picture1.CurrentY = 32 - ii: Picture1.Print Info
v1(19) = v1(18): v1k(ii) = v1(18)
If Check1.Value = 1 Then '                                если учесть эффект Доплера
If Check33.Value = 0 Then Call Dopler_Zerkalo(0, AlfaZ, V(1), An(18), v1(18), 270) '  если моделировать (вообще то здесь AlfaZ не нужен)
If Check33.Value = 1 Then '                                                           если сделать аналитический расчет
If Check26.Value = 0 Then '                               если расчет делать по углам зеркал в движении, то находим новые значения V12 и V21
'если зеркало расположено слева (стандартная схема), то движется правый фронт волны и поэтому используем угол наклона правого края приемника
'                                                                  если движется левый край фронта волны, то приводим угол наклона левого
If AlfaZ > pi / 2 And AlfaZ < 3 * pi / 2 Then AlfaZ = AlfaZ - pi ' края приемника к углу наклона правого края и по нему производим расчет
V12 = V(1) * Cos(An(18) - pi / 2 - AlfaZ) '                 это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO + pi / 2 + AlfaZ) '              это скорость установки в АСО вдоль нормали к экрану навстречу лучу
Info1 = Info1 & "AlfaZ для аналитического расчета=  " & AlfaZ * kUgol & vbCrLf:
Info1 = Info1 & "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "Alfa12=  " & (An(18) - pi / 2 - AlfaZ) * kUgol & vbCrLf: Info1 = Info1 & "Alfa21=  " & (AlfaISO + pi / 2 + AlfaZ) * kUgol & vbCrLf
Info1 = Info1 & "cos(Alfa12)=  " & Cos(An(18) - pi / 2 - AlfaZ) & vbCrLf: Info1 = Info1 & "cos(Alfa21)=  " & Cos(AlfaISO + pi / 2 + AlfaZ) & vbCrLf
End If 'Check26.Value = 0 Then
v1n(1) = v1(18) * (1 + V21 / V12) '                            частота света принятая поверхностью зеркала
v11 = v1n(1) / (1 - V21 / V12) '                               частота света отраженная поверхностью зеркала, т.е. экраном (здесь не нужна)
End If ' Check33.Value = 1
v1(19) = v1n(1): v1k(ii) = v1n(1) '                            v1(19)=v1n(1) частота света принятая приемником, т.е. экраном
End If ' Check1.Value = 1
Nv(ii) = (T - T1) * v1(ii): TT(1) = TT(1) + Nv(ii)
T1 = T: X1iso = X1aso: Tk1(ii) = T1: Xk1(ii) = X1iso: Vs1(ii) = V(1): kod(18) = 1: ii = 19 '
P21(19) = P21(18): Vs1(19) = V(1): An(19) = An(18): Nv(19) = TT(1) '      это для отчета при ii=19
Tk1(19) = 2 * T: Xk1(19) = 2 * X1iso '  в отчете выводится разность конечной и предыдущей величины потому принимаем для ii=19 два времени и пути
Xn1(18) = X21(1): Yn1(18) = Y21(1) '                        координаты 1-го луча при касании экрана в момент времени Т1
If Check3.Value = 0 Or Check17.Value = 1 Then  '                    если отмечен чекбокс 3 и не отмечен чекбокс 17, то луч полетит до экрана от
X(118) = (X(1) + X(6)) / 2: Y(118) = (Y(1) + Y(6)) / 2 '            источника и эти координаты фиктивного приемника уже вычислены при ii = 1
End If
P0 = P00 '                                                  если 2-ой луч еще долеко от экрана, то устанавливаем нормальный шаг решения
If Y21(2) + 2 * P00 * VY21(2) >= Y(6) Then P0 = P00 / kP0 ' а если за следующее два шага 2-ой луч перелетит экран, то уменьшаем шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 18 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
18: End If


If jj = 28 Then  '                                  участок пути 28 от правого зеркала до экрана
V12 = V(2) * Cos(An(28) - pi / 2) '                 это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO + pi / 2) '              это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = Y(6) - Y21(2)
If 2 * (V12 + V21) * P00 < R0 Then GoTo 28 '        если за два основных шага решения общий луч не перелетит за экран
P0 = P00 / kP0 '                                    в противном случае уменьшаем шаг решения
If (V12 + V21) * P0 < R0 Then GoTo 28 '       если за уменьшенный шаг решения луч перелетит за экран, то это будет последний шаг на этом пути
Info1 = "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "(V12+V21)*P0=  " & (V12 + V21) * P0 & vbCrLf: Info1 = Info1 & "R0=    " & R0 & vbCrLf
AlfaZ = 0 '                                      статический угол наклона приемника (экрана)
If Check2.Value = 1 Then  ' если надо найти угол наклона движущегося приемника (здесь угол скорости луча An(28) примерно 90 или больше)
X21(3) = X21(2) - w1 * Cos(An(28) - pi / 2) / 2: VX21(3) = VX21(2)  ' An(28) - pi / 2 угол края фронта волны (движется левый край)
Y21(3) = Y21(2) - w1 * Sin(An(28) - pi / 2) / 2: VY21(3) = VY21(2)
If An(28) < pi / 2 Then '                                             но, если все таки движется правый край фронта, то
X21(3) = X21(2) + w1 * Cos(An(28) - pi / 2) / 2: VX21(3) = VX21(2)
Y21(3) = Y21(2) + w1 * Sin(An(28) - pi / 2) / 2: VY21(3) = VY21(2) '  An(28) - pi / 2 угол конца фронта волны (движется правый конец)
End If
Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(2), Y21(2), 0, 0) '  находим угол наклона движущегося приемника, т.е. находим новое значение AlfaZ
End If
Info = "Alfa28=   " & Format(AlfaZ * kUgol, "000.000000")
Picture1.CurrentX = -6.5: Picture1.CurrentY = 42 - jj: Picture1.Print Info
v1(29) = v1(28): v1k(jj) = v1(28)
If Check1.Value = 1 Then '                                если учесть эффект Доплера
If Check33.Value = 0 Then Call Dopler_Zerkalo(0, AlfaZ, V(2), An(28), v1(28), 270)
If Check33.Value = 1 Then '                               если сделать аналитический расчет
If Check26.Value = 0 Then '                               если расчет делать по углам зеркал в движении, то находим новые значения V12 и V21
If AlfaZ > pi / 2 And AlfaZ < 3 * pi / 2 Then AlfaZ = AlfaZ - pi ' приводим угол наклона левого края приемника к углу наклона правого края
V12 = V(2) * Cos(An(28) - pi / 2 - AlfaZ) '                        это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO + pi / 2 + AlfaZ) '                     это скорость установки в АСО вдоль нормали к экрану навстречу лучу
Info1 = Info1 & "AlfaZ для аналитического расчета=  " & AlfaZ * kUgol & vbCrLf
Info1 = Info1 & "V12=  " & V12 & vbCrLf: Info1 = Info1 & "V21=  " & V21 & vbCrLf
Info1 = Info1 & "Alfa12=  " & (An(28) - pi / 2 - AlfaZ) * kUgol & vbCrLf: Info1 = Info1 & "Alfa21=  " & (AlfaISO + pi / 2 + AlfaZ) * kUgol & vbCrLf
Info1 = Info1 & "cos(Alfa12)=  " & Cos(An(28) - pi / 2 - AlfaZ) & vbCrLf: Info1 = Info1 & "cos(Alfa21)=  " & Cos(AlfaISO + pi / 2 + AlfaZ) & vbCrLf
End If
v1n(1) = v1(28) * (1 + V21 / V12) '                            частота света принятая поверхностью экрана
v11 = v1n(1) / (1 - V21 / V12) '                               частота света отраженная поверхностью экрана (здесь не нужна)
End If 'Check33.Value = 1
v1(29) = v1n(1): v1k(jj) = v1n(1) '                            v1n(1) частота света принятая приемником, т.е. экраном
End If 'Check1.Value = 1
Nv(jj) = (T - T2) * v1(jj): TT(2) = TT(2) + Nv(jj)
T2 = T: X2iso = X2aso: Tk2(jj) = T2: Xk2(jj) = X2iso: Vs2(jj) = V(2): kod(28) = 1: jj = 29 '
P21(29) = P21(28): Vs2(29) = V(2): An(29) = An(28): Nv(29) = TT(2)
Tk2(29) = 2 * T: Xk2(29) = 2 * X2iso '                в отчете выводится разность конечной и предыдущей величины поэтому при jj=29 два времени и пути
Xn2(28) = X21(2): Yn2(28) = Y21(2) '                        координаты 2-го луча при касании экрана в момент времени Т2
X(128) = (X(2) + X(6)) / 2: Y(128) = (Y(2) + Y(6)) / 2 '            координаты фиктивного приемника для сплошного эффекта Доплера
P0 = P00 '                                                  если 1-ый луч еще долеко от экрана, то устанавливаем нормальный шаг решения
If Y21(1) + 2 * P00 * VY21(1) >= Y(6) Then P0 = P00 / kP0 ' а если за следующие два шага 1-ый луч перелетит экран, то уменьшаем шаг решения
If Check13.Value = 0 Then '                                        если спрашивать разрешение на прерывание эксперимента при поэтапном решении
Kyn = 6 '                                                          по умолчанию не прерывать эксперимент
Info = "пройден участок пути  " & 28 & vbCrLf: Info = Info & Info1 & vbCrLf: Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНОЕ ДВИЖЕНИЕ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson")
If Kyn <> 6 Then kodEnd = 1 '                                      значит прервать эксперимент (закончить)
End If 'Check13.Value = 0
28: End If


If ii = 19 And jj = 29 Then '                  если оба луча достигли экрана, то закончить эксперимент
NC = NC0 + 1: kodEnd = 1
If Check10.Value = 1 Then
Info = " частота луча на этом участке пути и принятая поверхностью в конце этого участка пути"
Picture1.CurrentX = -12: Picture1.CurrentY = 13: Picture1.Print Info
For i = 10 To 18
Info = "v(" & i & ")/v01=   " & Format(v1(i) / v0, "0.000000000") & "    " & Format(v1k(i) / v0, "0.000000000") _
& "                         v(" & i + 10 & ")/v02=   " & Format(v1(i + 10) / v00, "0.000000000") & "    " & Format(v1k(i + 10) / v00, "0.000000000")
Picture1.CurrentX = -12: Picture1.CurrentY = 20 - 4 * i / 5: Picture1.Print Info
Next i
End If
Text71.Text = v1(19) / v0: Text72.Text = v1(29) / v0  '        частота света принятая экраном
For i = 9 To 18
TT(100 + i) = Tk1(i) 'сохраняем время движения лучей на участках пути для сплошного эффекта Доплера
Next i
For i = 19 To 28
TT(100 + i) = Tk2(i)
Next i
End If 'ii = 19 And jj = 29
 
 
If NC >= NC0 Then '                                           если пора выводить текущие данные на экран
If ii < 18.5 Then Text13.Text = X21(1) '                      текущие координаты концов лучей (до момента касания ими экрана)
If ii < 18.5 Then Text15.Text = Y21(1)
If jj < 28.5 Then Text14.Text = X21(2)
If jj < 28.5 Then Text16.Text = Y21(2)
If ii > 18.5 Then Text13.Text = Xn1(18) '                     координаты концов лучей в момента касания ими экрана
If ii > 18.5 Then Text15.Text = Yn1(18)
If jj > 28.5 Then Text14.Text = Xn2(28)
If jj > 28.5 Then Text16.Text = Yn2(28)
NC = 0
Text23.Text = Fix(MF * VX21(1)) / MF: Text25.Text = Fix(MF * VY21(1)) / MF ' скорости лучей по осям координат
Text24.Text = Fix(MF * VX21(2)) / MF: Text26.Text = Fix(MF * VY21(2)) / MF
Text17.Text = T: Text47.Text = ii: Text48.Text = jj '                      текущее время и номера отрезков пути двух лучей на данный момент
Text31.Text = T1: Text32.Text = T2 '                                        затраченное время при движение до этого участка пути
Text33.Text = v1(1) / v0: Text34.Text = v1(2) / v00 '                       частота света на текущем участке пути
Text35.Text = X1iso: Text36.Text = X2iso '                                  пройденный путь до этого участка пути
Text37.Text = V(1): Text38.Text = V(2) '                                    суммарные скорости лучей на текущем участке пити
Text51.Text = TT(1): Text52.Text = TT(2) '                                  количество колебаний до этого участка пути
Text61.Text = An(1) * kUgol: Text62.Text = An(2) * kUgol '                  углы скоростей на текущем участке пути
If Check11.Value = 1 Then Shema3 '                                          если включена анимация
If Check14.Value = 1 Then Picture1.Circle (X21(1) / ML, Y21(1) / ML), 0.03, RGB(255, 0, 0)
If Check15.Value = 1 Then Picture1.Circle (X21(2) / ML, Y21(2) / ML), 0.03, RGB(0, 0, 255)
If ii = 1 Then Picture1.Circle (X21(10) / ML, Y21(10) / ML), 0.03, RGB(0, 255, 0) '        рисуем путь середины общего луча

If Check24.Value = 1 And P0 = P00 / kP0 Then '               если идет запись в отладочный файл
Print #pp, ii, jj, T, X21(1), Y21(1), X21(2), Y21(2)
End If

If kodEnd = 1 Then GoTo 90
End If ' NC = NC0

Do While DoEvents() ' идем на 1, после обработки сообщений в очереди операционной системы, а если будет сообщение
GoTo 1 '              от кнопки <Остановить>, то kodEnd будет равен 1 и на следующем шаге будет уже GoTo 90
Loop '
80: Info = "Ошибка решения при ii= " & ii & "  и jj= " & jj & "  AlfaZ=  " & AlfaZ * kUgol
MsgBox Info, , "Maikelson"
90: If Check5.Value = 1 Then Otcheot3 '                 выводим отчет
If Check24.Value = 1 Then Close pp '                    закрываем отладочный файл
End Sub





'                                       НАХОДИМ РАССТОЯНИЕ МЕЖДУ ПРЯМОЙ ЛИНИЕЙ И ТОЧКОЙ
Private Sub DX_DY(ByVal X2 As Double, ByVal Y2 As Double, ByVal X1 As Double, ByVal Y1 As Double, ByVal Alfa12 As Double, ByVal kodN As Long)
'Call DX_DY(X21(1), Y21(1), X(3), Y(3), Alfa5, 0)   ii=10  Yudin
'Call DX_DY(X21(1), Y21(1), X(30), Y(30), Alfa3, 1) ii=10  Maikelson

a = Tan(Alfa12): b = -1: c = Y1 - Tan(Alfa12) * X1 ' это коэффициенты уравнения прямой линии a*X+b*Y+c=0
R0 = Abs(a * X2 + b * Y2 + c) / Sqr(a ^ 2 + b ^ 2)
'       ЗДЕСЬ БЫЛ РАСЧЕТ ДЕТЕЛЕЙ ПУТИ, НО Я ЕГО УБРАЛ, Т,К., ЕСЛИ НЕ ВКЛЮЧЕНО Auto, ТО В ОТЧЕТЕ ПО КАЖДОМУ ЭТАПУ ВСЕ, ЧТО НАДО, ЕСТЬ
'       НО ТЕПЕРЬ DX_DY и DX_DY_Dopler СТАЛИ ИДЕНТИЧНЫМИ И НАДО БЫ ОДИН УБРАТЬ
End Sub

Private Sub DX_DY_Dopler(ByVal X2 As Double, ByVal Y2 As Double, ByVal X1 As Double, ByVal Y1 As Double, ByVal Alfa12 As Double)
a = Tan(Alfa12): b = -1: c = Y1 - Tan(Alfa12) * X1 '                         это коэффициенты уравнения прямой линии a*X+b*Y+c=0
R0 = Abs(a * X2 + b * Y2 + c) / Sqr(a ^ 2 + b ^ 2)
End Sub







'                               удалил первоначальный расчет AlfaV по углам и с анимацией деталей расчета
'        А ЗДЕСЬ СДЕЛАЛ РАСЧЕТ R0 ПО УРАВНЕНИЮ ПРЯМОЙ И ТОЧКИ, А ТАКЖЕ ДОБАВИЛ АНАЛИТИЧЕСКИЙ РАСЧЕТ МОЙ И ПО ХЕДРИКУ
Private Sub AlfaV(ByVal VX As Double, ByVal VY As Double, ByVal X2 As Double, ByVal Y2 As Double, _
ByVal X1 As Double, ByVal Y1 As Double, ByVal Alfa12 As Double, ByVal kodX As Long) ' находим угол наклона движущихся поверхностей
'Call AlfaV(VX21(3), VY21(3), X21(3), Y21(3), X21(2), Y21(2), Alfa2, 2) ' jj=24       X21(3) и Y21(3) координаты края фронта волны

If Check28.Value = 0 Then '                   моделирование процесса отражения фронта волны от движущейся поверхности
X0(10) = X1: Y0(10) = Y1 '                                                            это точка где луч коснулся поверхности зеркала
'      в DX_DY определено R0 между лучом и поверхностью зеркала или пластины, а здесь это будет расстояние между краем фронта волны и
'      поверхностью, но V12+V21, определенное после первого обращения в DX_DY, это так и будет скорость сближения света с поверхностью
Call DX_DY_Dopler(X2, Y2, X1, Y1, Alfa12) '              находим начальное расстояние от края фронта волны до движущейся плоскости
If R0 <= 1.1 * (V12 + V21) * P00 Then GoTo 210 '          если фронт за один шаг перелетит за плоскости зеркала или пластины
'                                                          (так будет, если луч падает перпендикулярно плоскости зеркала)
11: P0 = P00 '                                                         начало цикла расчета
If R0 <= 2 * (V12 + V21) * P00 Then P0 = P00 / kP0 '  с двойкой программа работает более устойчиво
X1 = X1 + VXiso * P0: Y1 = Y1 + VYiso * P0 '          это координаты начальной точки касания луча на движущемся зеркале
X2 = X2 + VX * P0: Y2 = Y2 + VY * P0 '                это координаты одного из краев фронта волны
Call DX_DY_Dopler(X2, Y2, X1, Y1, Alfa12)

If Check9.Value = 1 Then  '                           выводим на рисунок движение фронтов волн при падении их на плоскость
NC = NC + 1
If NC >= NC0 Then
NC = 0: Picture1.Line (X0(10) / ML, Y0(10) / ML)-(X2 / ML, Y2 / ML), RGB(0, 250, 0)
End If
End If 'Check9.Value = 1

If kodEnd = 1 Then GoTo 210
Do While DoEvents() '                              идем на 200, после обработки сообщений в очереди операционной
GoTo 200 '                                         системы, а если будет сообщение от кнопки <Остановить>,
Loop '                                             то kodEnd будет равен 1 и на следующем шаге будет уже GoTo 210
200: If R0 > (V12 + V21) * P0 Then GoTo 11 '       проверяем расстояние между краем фронта волны и плоскостью зеркала
210: Picture1.Line (X0(10) / ML, Y0(10) / ML)-(X2 / ML, Y2 / ML), RGB(0, 250, 0)
dX = X2 - X0(10): dY = Y2 - Y0(10): AlfaZ = ArcTangensR(dX, dY) '                это угл наклона зеркала при его движении
End If 'Check28.Value = 0

If Check28.Value = 1 Then '    если рассчитать аналитически угол наклона движущегося зеркала, который в покое был Alfa12
If Check29.Value = 0 Then '                                          если мой расчет
If Abs(VXiso) > Abs(VYiso) Then Y2 = (X2 - X1) * Tan(Alfa12) / (1 + Tan(Alfa12) * VXiso / Vs) '   если установка движется вдоль оси Х
If Abs(VYiso) > Abs(VXiso) Then Y2 = Vs * (X2 - X1) * Tan(Alfa12) / (Vs - VYiso) '                если установка движется вдоль оси Y
AlfaZ = Atn(Y2 / (X2 - X1)) '                                        это угл наклона зеркала при его движении по моему расчету
End If

If Check29.Value = 1 Then '                                          если по Хедрику
If Abs(VXiso) > Abs(VYiso) Then '                                    если установка движется вдоль оси Х
AlfaZ = Atn(Tan(Alfa12) * (1 - VXiso / Vs))    '                     это угл наклона зеркала при его движении по Хедрику
If Alfa12 > pi / 2 Then AlfaZ = Atn(Tan(Alfa12) * (1 + VXiso / Vs))
End If
If Abs(VYiso) > Abs(VXiso) Then '                                    если установка движется вдоль оси Y
AlfaZ = Atn(Tan(Alfa12) * (1 + VYiso / Vs))  '                       это угл наклона зеркала при его движении по Хедрику
End If
End If 'Check29.Value = 1
If AlfaZ < 0 Then AlfaZ = AlfaZ + pi
End If 'Check28.Value = 1
End Sub




Private Sub Dopler_Zerkalo(ByVal Alfa0 As Double, ByVal Alfa10 As Double, ByVal VL As Double, ByVal AL As Double, ByVal v10 As Double, ByVal kodUgla As Integer) 'эффект Доплера
'например, при jj=24 будет Call Dopler_Zerkalo(Alfa2, AlfaZ, V(2), An(24), v1(24), 90), т.е. передаем в Dopler_Zerkalo в момент касания зеркала
'                              углы наклона зеркала (в покое Alfa0 и в движении Alfa10) и скорость луча VL, его угол скорости AL и частоту v10,
'                              а так же kodUgla, который указывает примерное направление отраженного луча (0, 90, 180 или 270 градусов)
'                              здесь скорость падающего луча и отраженного равны и поэтому не задаем их разными
Dim X1#, X2#, Y1#, Y2# ' координаты центра зеркала (Х1 и Y1) и центров двух фронтов волн (Х2 и Y2) приближающихся к зеркалу с интервалом в 10 длин волн
Dim X41#, X42#, X44#, Y41#, Y42#, Y44# ' координаты двух краев и середины плоскости приемника
On Error GoTo 90

An(9) = 2 * Alfa10 - AL '            находим An(9), т.е. угол скорости луча после отражения от движущегося зеркала
'                                    здесь V12 это скорость луча в АСО от источника вдоль нормали к зеркалу, т.е. при его приближении к зеркалу,
'                                    а V21 скорость движения зеркала навстречу лучу (тоже вдоль нормали к поверхности зеркала) уже есть,
'                                    а скорость приближения луча к плоскости приемника будет равна скорости луча, т.к. приемник неподвижен, а
An(44) = An(9) + pi / 2 '            его плоскость распологаем перпендикулярно углу движения отраженного луча, т.е. под углом An(44)
m = VL / v10 '                       m - длина волны луча с частотой сигнала v10 при скорости света VL
X44 = 0: Y44 = 0 '                   координаты одного из концов плоскости покоящегося приемника
If kodUgla = 0 Then X44 = 25 * m
If kodUgla = 90 Then Y44 = 25 * m
If kodUgla = 180 Then X44 = -25 * m
If kodUgla = 270 Then Y44 = -25 * m '                   (если скорость ИСО больше Vs/5 , то приемник надо отодвигать дальше)
Q31 = AL - pi / 2 '                                                                    угол наклона фронта плоской волны
VXs(11) = VL * Cos(AL): VYs(11) = VL * Sin(AL): VXs(12) = VXs(11): VYs(12) = VYs(11) ' скорости левого 1 и правого 2 краев двух
VXs(21) = VXs(11): VYs(21) = VYs(11): VXs(22) = VXs(21): VYs(22) = VYs(21) '           фронтов сигналов по осям координат при Т=0

dT = 15 / v10 ' dT = 15 * m / VL                         координаты 1-го фронта волны задаем такие, чтобы через время dT, когда он пролетит
'                                                        расстояние в 15 длин волны, он коснулся своим центром поверхности движущегося зеркала,
X1 = -VXiso * dT: Y1 = -VYiso * dT '                     координаты которого в этот момент времени будут X1=0 и Y1=0
X(11) = X1 - 20 * m * Cos(Alfa0): Y(11) = Y1 - 20 * m * Sin(Alfa0) ' координаты левого края зеркала
X(12) = X1 + 20 * m * Cos(Alfa0): Y(12) = Y1 + 20 * m * Sin(Alfa0) ' координаты правого края зеркала
'                                                              X2, Y2 координаты фиктивного источника волн с частотой полученной для этого участка пути
X2 = -15 * m * Cos(AL): Y2 = -15 * m * Sin(AL) '                       координаты центра 1-го фронта волны отодвигаем от зеркала на 15*m для Т=Е=0
'                                                                      и находим координаты краев фронта волны при его ширине 20*m
Xs(1, 11) = X2 - 10 * m * Cos(Q31): Ys(1, 11) = Y2 - 10 * m * Sin(Q31) ' координаты левой точки 1-го фронта волны, который полетит (К ЗЕРКАЛУ) не отражаясь от зеркала
Xs(1, 12) = X2 + 10 * m * Cos(Q31): Ys(1, 12) = Y2 + 10 * m * Sin(Q31) ' координаты правой точки 1-го фронта волны, который полетит (К ЗЕРКАЛУ) не отражаясь от зеркала
Xs(1, 13) = 0: Xs(1, 14) = 0: Ys(1, 13) = 0: Ys(1, 14) = 0 '             а на пути до зеркала координаты отраженных точек будут совпадать с не отраженными

X2 = -(N0 + 15) * m * Cos(AL): Y2 = -(N0 + 15) * m * Sin(AL) '         координаты центра 2-го фронта волны (отодвигаем от 1-го фронта при N0=10 на
'                                                                      25-15= 10-ть длин волны) и находим координаты краев этого фронта волны
'          НО ТАК БУДЕТ, ЕСЛИ ИСТОЧНИК ПОКОИЛСЯ в АСО, когда 2-ой ФРОНТ ВЫЛЕТАЕТ ТОЧНО ИЗ ТОГО ЖЕ МЕСТА, ОТКУДА ВЫЛЕТЕЛ 1-ый ФРОНТ
'          ТУТ НАДО координаты центра 2-го фронта волны СДВИНУТЬ, но как и куда не понятно (узнать можно только при сплошном эффекте Доплера)
Xs(2, 11) = X2 - 10 * m * Cos(Q31): Ys(2, 11) = Y2 - 10 * m * Sin(Q31) ' координаты левой точки 2-го фронта волны, который полетит (К ЗЕРКАЛУ)не отражаясь от зеркала
Xs(2, 12) = X2 + 10 * m * Cos(Q31): Ys(2, 12) = Y2 + 10 * m * Sin(Q31) ' координаты правой точки 2-го фронта волны, который полетит (К ЗЕРКАЛУ)не отражаясь от зеркала
Xs(2, 13) = 0: Xs(2, 14) = 0: Ys(2, 13) = 0: Ys(2, 14) = 0 '             координаты краев отраженного 2-го фронта волны

For i = 1 To 9: kodVY(i) = 0: Next i '           коды наступления момента касания фронтом волны поверхности зеркала или оси абсцисс
kodR = 0: E = 0:  NP = 0 '                       код прерывания выполнения программы и начальное время и счетчик циклов расчета
Tn1(1) = 0: Tn1(2) = 0: Tk1(1) = 0: Tk1(2) = 0 ' время приема левого и правого краев 1-го и 2-го фронта волны на зеркале (мембране)
Tn2(1) = 0: Tn2(2) = 0: Tk2(1) = 0: Tk2(2) = 0 ' время приема левого и правого краев 1-го и 2-го фронта отраженной волны на приемнике
Tn1(3) = 0: Tk1(3) = 0: Tn2(3) = 0: Tk2(3) = 0 ' среднее время приема 1-го и 2-го фронта волны на зеркале и на приемнике
P0 = P00 / kP0

10:
E = E + P0: NP = NP + 1 '                               E - фиктивное время
X1 = X1 + P0 * VXiso: Y1 = Y1 + P0 * VYiso '            новые координаты средней точки зеркала
X(11) = X(11) + P0 * VXiso: Y(11) = Y(11) + P0 * VYiso 'новые координаты левой точки зеркала
X(12) = X(12) + P0 * VXiso: Y(12) = Y(12) + P0 * VYiso 'новые координаты правой точки зеркала

Xs(1, 11) = Xs(1, 11) + P0 * VXs(11): Ys(1, 11) = Ys(1, 11) + P0 * VYs(11) 'новые координаты левой точки 1-го фронта сигнала
Xs(1, 12) = Xs(1, 12) + P0 * VXs(12): Ys(1, 12) = Ys(1, 12) + P0 * VYs(12) 'новые координаты правой точки 1-го фронта сигнала
If kodVY(1) = 1 Then
Xs(1, 13) = Xs(1, 13) + P0 * VXs(13): Ys(1, 13) = Ys(1, 13) + P0 * VYs(13) 'новые координаты левой точки 1-го фронта отраженного сигнала
End If
If kodVY(2) = 1 Then
Xs(1, 14) = Xs(1, 14) + P0 * VXs(14): Ys(1, 14) = Ys(1, 14) + P0 * VYs(14) 'новые координаты правой точки 1-го фронта отраженного сигнала
End If

Xs(2, 11) = Xs(2, 11) + P0 * VXs(21): Ys(2, 11) = Ys(2, 11) + P0 * VYs(21) 'новые координаты левой точки 2-го фронта сигнала при E >= dT
Xs(2, 12) = Xs(2, 12) + P0 * VXs(22): Ys(2, 12) = Ys(2, 12) + P0 * VYs(22) 'новые координаты правой точки 2-го фронта сигнала при E >= dT
If kodVY(5) = 1 Then
Xs(2, 13) = Xs(2, 13) + P0 * VXs(23): Ys(2, 13) = Ys(2, 13) + P0 * VYs(23) 'новые координаты левой точки 2-го фронта отраженного сигнала
End If
If kodVY(6) = 1 Then
Xs(2, 14) = Xs(2, 14) + P0 * VXs(24): Ys(2, 14) = Ys(2, 14) + P0 * VYs(24) 'новые координаты правой точки 2-го фронта отраженного сигнала
End If


If kodVY(1) = 1 Then GoTo 20 '                                     движение левого края 1-го фронта луча до зеркала
Call DX_DY_Dopler(Xs(1, 11), Ys(1, 11), X1, Y1, Alfa0) '
If (V12 + V21) * P0 < R0 Then GoTo 20 '                            если за шаг решения левый край фронта луча не достигнет плоскости зеркала
Tn1(1) = E: kodVY(1) = 1 '            запоминаем время когда расстояние от левого края 1-го фронта луча до зеркала станет меньше (V12+V21)*P0
VXs(13) = VL * Cos(An(9)): VYs(13) = VL * Sin(An(9)) '             скорость левого края фронта луча после отражения
Xs(1, 13) = Xs(1, 11): Ys(1, 13) = Ys(1, 11) '                     координата левого края фронта луча после отражения
Info = "kod=1     T=  " & E & vbCrLf
Info = Info & "(V12+V21)*P0/L1=  " & (V12 + V21) * P0 / L0 & vbCrLf: Info = Info & "R0/L1=                      " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd

20:
If kodVY(2) = 1 Then GoTo 30 '                                      движение правого края 1-го фронта луча до зеркала
Call DX_DY_Dopler(Xs(1, 12), Ys(1, 12), X1, Y1, Alfa0) '
If (V12 + V21) * P0 < R0 Then GoTo 30 '                             если за шаг решения правый край фронта луча не достигнет плоскости зеркала
Tn1(2) = E: kodVY(2) = 1 '           запоминаем время когда расстояние от правого края 1-го фронта луча до зеркала станет меньше (V12+V21)*P0
VXs(14) = VL * Cos(An(9)): VYs(14) = VL * Sin(An(9)) '              скорость правого края фронта луча после отражения
Xs(1, 14) = Xs(1, 12): Ys(1, 14) = Ys(1, 12) '                      координата правого края фронта луча после отражения
Info = "kod=2     T=  " & E & vbCrLf
Info = Info & "(V12+V21)*P0/L1=  " & (V12 + V21) * P0 / L0 & vbCrLf: Info = Info & "R0/L1=                      " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd

30:
If kodVY(1) = 0 Or kodVY(3) = 1 Then GoTo 40 '                       движение левого края 1-го фронта луча отраженного от зеркала
Call DX_DY_Dopler(Xs(1, 13), Ys(1, 13), X44, Y44, An(44)) '
If VL * P0 < R0 Then GoTo 40
Tk1(1) = E: kodVY(3) = 1 '               запоминаем время когда расстояние от левого края 1-го фронта луча до приемника станет меньше VL* P0
Info = "kod=3     T=  " & E & vbCrLf
Info = Info & "Vs*P0/L1=  " & VL * P0 / L0 & vbCrLf: Info = Info & "R0/L1=                  " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd

40:
If kodVY(2) = 0 Or kodVY(4) = 1 Then GoTo 50 '                       движение правого края 1-го фронта луча отраженного от зеркала
Call DX_DY_Dopler(Xs(1, 14), Ys(1, 14), X44, Y44, An(44)) '
If VL * P0 < R0 Then GoTo 50
Tk1(2) = E: kodVY(4) = 1 '               запоминаем время когда расстояние от правого края 1-го фронта луча до приемника станет меньше VL* P0
Info = "kod=4     T=  " & E & vbCrLf
Info = Info & "Vs*P0/L1=  " & VL * P0 / L0 & vbCrLf: Info = Info & "R0/L1=                  " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd

50:
If kodVY(5) = 1 Then GoTo 55 '                                       движение левого края 2-го фронта луча до зеркала
Call DX_DY_Dopler(Xs(2, 11), Ys(2, 11), X1, Y1, Alfa0) '
If (V12 + V21) * P0 < R0 Then GoTo 55 '                              если за шаг решения левый край фронта луча не достигнет плоскости зеркала
Tn2(1) = E: kodVY(5) = 1 '               запоминаем время когда расстояние от левого края 2-го фронта луча до зеркала станет меньше (V12+V21)* P0
VXs(23) = VL * Cos(An(9)): VYs(23) = VL * Sin(An(9))
Xs(2, 13) = Xs(2, 11): Ys(2, 13) = Ys(2, 11) '                       координата левого края фронта луча после отражения
Info = "kod=5     T=  " & E & vbCrLf
Info = Info & "(V12+V21)*P0/L1=  " & (V12 + V21) * P0 / L0 & vbCrLf: Info = Info & "R0/L1=                      " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd

55:
If kodVY(6) = 1 Then GoTo 60 '                                        движение правого края 2-го фронта луча до зеркала
Call DX_DY_Dopler(Xs(2, 12), Ys(2, 12), X1, Y1, Alfa0) '
If (V12 + V21) * P0 < R0 Then GoTo 60 '                               если за шаг решения левый край фронта луча не достигнет плоскости зеркала
Tn2(2) = E: kodVY(6) = 1 '               запоминаем время когда расстояние от правого края 2-го фронта луча до зеркала станет меньше (V12+V21)* P0
VXs(24) = VL * Cos(An(9)): VYs(24) = VL * Sin(An(9))
Xs(2, 14) = Xs(2, 12): Ys(2, 14) = Ys(2, 12) '                        координата правого края фронта луча после отражения
Info = "kod=6     T=  " & E & vbCrLf
Info = Info & "(V12+V21)*P0/L1=  " & (V12 + V21) * P0 / L0 & vbCrLf: Info = Info & "R0/L1=                      " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd

60:
If kodVY(5) = 0 Or kodVY(7) = 1 Then GoTo 65 '                         движение левого края 2-го фронта луча отраженного от зеркала
Call DX_DY_Dopler(Xs(2, 13), Ys(2, 13), X44, Y44, An(44)) '
If VL * P0 < R0 Then GoTo 65
Tk2(1) = E: kodVY(7) = 1 '                запоминаем время когда расстояние от левого края 2-го фронта луча до приемника станет меньше VL* P0
Info = "kod=7     T=  " & E & vbCrLf
Info = Info & "Vs*P0/L1=  " & VL * P0 / L0 & vbCrLf: Info = Info & "R0/L1=                   " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd

65:
If kodVY(6) = 0 Or kodVY(8) = 1 Then GoTo 70 '                         движение правого края 2-го фронта луча отраженного от зеркала
Call DX_DY_Dopler(Xs(2, 14), Ys(2, 14), X44, Y44, An(44)) '
If VL * P0 < R0 Then GoTo 70
Tk2(2) = E: kodVY(8) = 1 '               запоминаем время когда расстояние от правого края 2-го фронта луча до приемника станет меньше VL* P0
Info = "kod=8     T=  " & E & vbCrLf
Info = Info & "Vs*P0/L1=  " & VL * P0 / L0 & vbCrLf: Info = Info & "R0/L1=                  " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd

70:
If kodVY(3) = 1 And kodVY(4) = 1 Then
If kodVY(7) = 1 And kodVY(8) = 1 Then
Tn1(3) = (Tn1(1) + Tn1(2)) / 2 '                                    время приема 1-го фронта волны на зеркале (мембране)
Tn2(3) = (Tn2(1) + Tn2(2)) / 2 '                                    время приема 2-го фронта волны на зеркале (мембране)
Tn1(4) = Tn2(3) - Tn1(3): v1n(1) = N0 / Tn1(4) '  Tn1(4) это время для N0 периодов сигнала принятого на зеркале, а v1n(1) это частота
Tk1(3) = (Tk1(1) + Tk1(2)) / 2 '                                    время приема 1-го фронта волны на приемнике
Tk2(3) = (Tk2(1) + Tk2(2)) / 2 '                                    время приема 2-го фронта волны на приемнике
Tk2(4) = Tk2(3) - Tk1(3): v1k(1) = N0 / Tk2(4) '  Tk2(4) это время для N0 периодов сигнала принятого на приемнике
v11 = v1k(1): kodR = 1   '                                          частота света после отражения от зеркала и принятая неподвижным приемником
Info1 = Info1 & "T1sr=    " & T - dT + Tn1(3) & vbCrLf
Info1 = Info1 & "T2sr=    " & T - dT + Tn2(3) & vbCrLf
Info1 = Info1 & "v1/v0=    " & v1n(1) / v0 & vbCrLf
Info1 = Info1 & "v2/v0=    " & v1k(1) / v0 & vbCrLf
End If
End If

If NP >= NC0 Or kodR = 1 Then   '                        если пора выводить текущие данные на экран
Text17.Text = E: NP = 0
If Check12.Value = 1 Then '                                   если рисовать детали
If Check20.Value = 0 Then '                                   если не рисовать траектории, а стирать предыдущие точки
Picture1.Cls: Risunok1
End If
Picture1.Line (X(11) / Mv1, Y(11) / Mv1 + 10)-(X(12) / Mv1, Y(12) / Mv1 + 10), 1 'рисуем поверхность зеркала

If Check20.Value = 0 Then Picture1.Line (Xs(1, 11) / Mv1, Ys(1, 11) / Mv1 + 10)-(Xs(1, 12) / Mv1, Ys(1, 12) / Mv1 + 10), RGB(0, 0, 250) ' рисуем фронт 1-го сигнала
Picture1.Circle (Xs(1, 11) / Mv1, Ys(1, 11) / Mv1 + 10), 0.05, 1  '      рисуем края фронта 1-го  сигнала
Picture1.Circle (Xs(1, 12) / Mv1, Ys(1, 12) / Mv1 + 10), 0.05, 1  '      эти точки не стираем
If Check20.Value = 0 Then Picture1.Line (Xs(1, 13) / Mv1, Ys(1, 13) / Mv1 + 10)-(Xs(1, 14) / Mv1, Ys(1, 14) / Mv1 + 10), RGB(0, 0, 250) ' рисуем фронт 1-го сигнала
Picture1.Circle (Xs(1, 13) / Mv1, Ys(1, 13) / Mv1 + 10), 0.05, 1  '      рисуем края фронта 1-го отраженного сигнала
Picture1.Circle (Xs(1, 14) / Mv1, Ys(1, 14) / Mv1 + 10), 0.05, 1  '      эти точки не стираем

If Check20.Value = 0 Then Picture1.Line (Xs(2, 11) / Mv1, Ys(2, 11) / Mv1 + 10)-(Xs(2, 12) / Mv1, Ys(2, 12) / Mv1 + 10), RGB(0, 0, 250) ' рисуем фронт 2-го сигнала
Picture1.Circle (Xs(2, 11) / Mv1, Ys(2, 11) / Mv1 + 10), 0.05, 1  '      рисуем края фронта 2-го  сигнала
Picture1.Circle (Xs(2, 12) / Mv1, Ys(2, 12) / Mv1 + 10), 0.05, 1  '      эти точки не стираем
If Check20.Value = 0 Then Picture1.Line (Xs(2, 13) / Mv1, Ys(2, 13) / Mv1 + 10)-(Xs(2, 14) / Mv1, Ys(2, 14) / Mv1 + 10), RGB(0, 0, 250) ' рисуем фронт 2-го сигнала
Picture1.Circle (Xs(2, 13) / Mv1, Ys(2, 13) / Mv1 + 10), 0.05, 1  '      рисуем края фронта 2-го отраженного сигнала
Picture1.Circle (Xs(2, 14) / Mv1, Ys(2, 14) / Mv1 + 10), 0.05, 1  '      эти точки не стираем

X41 = X44 + 40 * m * Cos(An(44)): Y41 = Y44 + 40 * m * Sin(An(44)) '             приемник распологаем перпендикулярно отраженному лучу
X42 = X44 - 40 * m * Cos(An(44)): Y42 = Y44 - 40 * m * Sin(An(44)) '             и находим координаты его левого и правого краев
Picture1.Line (X42 / Mv1, Y42 / Mv1 + 10)-(X41 / Mv1, Y41 / Mv1 + 10), RGB(0, 0, 250) '  рисуем поверхность приемника
End If 'Check12.Value = 1
End If 'NC0

If kodEnd = 1 Then GoTo 100
If kodR = 1 Then GoTo 100
Do While DoEvents() ' идем на 10, после обработки сообщений в очереди
GoTo 10 '             операционной системы, а если будет сообщение от кнопки <Остановить>,
Loop '                то kodEnd будет равен 1 и на следующем шаге будет уже GoTo 100
90: MsgBox "Ошибка рассчета в Dopler_Zerkalo", , "Maikelson": Exit Sub
100: End Sub













Private Sub Dopler_Lazer() '                                  эффект Доплера от скорости движения лазера
Dim X1#, X2#, Y1#, Y2# ' координаты центра приемника (Х1 и Y1) и центров двух фронтов волн (Х2 и Y2) при их вылете из лазера
Dim Alfa0# '             угол наклона приемника
On Error GoTo 90

m = L0: X2 = 0: Y2 = 0 '                                             длина волны и начальные координаты средней точки лазера
X1 = N0 * m * Cos(Betta):  Y1 = N0 * m * Sin(Betta) '                24_04_21 было одно N0 (так и оставлю для однозначности)
X(11) = X1 - 20 * m * Sin(Betta): Y(11) = Y1 + 20 * m * Cos(Betta) ' координаты левого края приемника   (плоскость которого перпендикулярна
X(12) = X1 + 20 * m * Sin(Betta): Y(12) = Y1 - 20 * m * Cos(Betta) ' координаты правого края приемника          направлению движения света)
Alfa0 = Betta - pi / 2: Q31 = Alfa0 '                                углы наклона приемника и фронта плоской волны
VXs(11) = Vs * Cos(Betta): VYs(11) = Vs * Sin(Betta): VXs(12) = VXs(11): VYs(12) = VYs(11) ' скорости левого 1 и правого 2 краев 1-го фронта
VXs(21) = 0: VYs(21) = 0: VXs(22) = 0: VYs(22) = 0 '                                         скорости левого 1 и правого 2 краев 2-го фронта
dT = N0 / v0 '                                                  когда 1-ый фронт пролетит за время dT расстояние в N0 длин волны, то начнется
kodDMY = 0 '                                                    движение 2-го фронта, а kodDMY = 0 означает, что 2-ой фронт не начал движение
Xs(1, 11) = X2 - 20 * m * Cos(Q31): Ys(1, 11) = Y2 - 20 * m * Sin(Q31) ' координаты левой точки 1-го фронта волны в момент времени Е=0
Xs(1, 12) = X2 + 20 * m * Cos(Q31): Ys(1, 12) = Y2 + 20 * m * Sin(Q31) ' координаты правой точки 1-го фронта волны

'    а зачем они сейчас    - для анимации?
'Xs(2, 11) = X2 - 20 * m * Cos(Q31): Ys(2, 11) = Y2 - 20 * m * Sin(Q31) ' координаты левой точки 2-го фронта волны
'Xs(2, 12) = X2 + 20 * m * Cos(Q31): Ys(2, 12) = Y2 + 20 * m * Sin(Q31) ' координаты правой точки 2-го фронта волны

For i = 1 To 9: kodVY(i) = 0: Next i '           коды наступления момента касания фронтом волны поверхности покоящегося в АСО приемника
kodEnd = 0: kodR = 0: E = 0: NP = 0 '            коды прерывания выполнения программы и начальное время и счетчик циклов расчета
Tn1(1) = 0: Tn1(2) = 0 '                         время приема левого и правого краев 1-го фронта волны неподвижным приемником
Tn2(1) = 0: Tn2(2) = 0 '                         время приема левого и правого краев 2-го фронта волны неподвижным приемником
P0 = P00 / kP0 '                                 шаг решения при реальном времени

10:
NP = NP + 1: E = E + P0 '                                E - фиктивное время в этой процедуре
X2 = X2 + P0 * VXiso: Y2 = Y2 + P0 * VYiso '             новые координаты средней точки лазера
Xs(1, 11) = Xs(1, 11) + P0 * VXs(11): Ys(1, 11) = Ys(1, 11) + P0 * VYs(11) 'новые координаты левой точки 1-го фронта сигнала
Xs(1, 12) = Xs(1, 12) + P0 * VXs(12): Ys(1, 12) = Ys(1, 12) + P0 * VYs(12) 'новые координаты правой точки 1-го фронта сигнала
Xs(2, 11) = Xs(2, 11) + P0 * VXs(21): Ys(2, 11) = Ys(2, 11) + P0 * VYs(21) 'новые координаты левой точки 2-го фронта сигнала
Xs(2, 12) = Xs(2, 12) + P0 * VXs(22): Ys(2, 12) = Ys(2, 12) + P0 * VYs(22) 'новые координаты правой точки 2-го фронта сигнала'

If E >= dT And kodDMY = 0 Then '            в этот момент начнется движение от движущегося лазера до покоящегося приемника 2-го фронта волны
kodDMY = 1 '                                          на этом шаге уже учтено смещение X2 и Y2, которое отразится и в Xs(2, 11) и в Xs(2, 12)
'                                                     а далее пойдет изменение этих координат выше за счет VXs(21...22) и VYs(21...22)
Xs(2, 11) = X2 - 20 * m * Cos(Q31): Ys(2, 11) = Y2 - 20 * m * Sin(Q31) '    координаты левой точки 2-го фронта волны
Xs(2, 12) = X2 + 20 * m * Cos(Q31): Ys(2, 12) = Y2 + 20 * m * Sin(Q31) '    координаты правой точки 2-го фронта волны
VXs(21) = VXs(11): VYs(21) = VYs(11): VXs(22) = VXs(21): VYs(22) = VYs(21) 'скорости будут такие же, как и у 1-го фронта
End If

If kodVY(1) = 1 Then GoTo 20 '                                      движение левого края 1-го фронта луча до неподвижного приемника
Call DX_DY_Dopler(Xs(1, 11), Ys(1, 11), X1, Y1, Alfa0) '
If Vs * P0 < R0 Then GoTo 20 '          если за шаг решения левый край фронта луча не достигнет плоскости неподвижного приемника
Tn1(1) = E: kodVY(1) = 1 '              запоминаем время когда расстояние от левого края 1-го фронта луча до приемника станет меньше Vs*P0
Info = "kod=1     T=  " & E & vbCrLf
Info = Info & "Vs*P0/L1=  " & Vs * P0 / L0 & vbCrLf: Info = Info & "R0/L1=        " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd
20:
If kodVY(2) = 1 Then GoTo 30 '                                      движение правого края 1-го фронта луча до неподвижного приемника
Call DX_DY_Dopler(Xs(1, 12), Ys(1, 12), X1, Y1, Alfa0) '
If Vs * P0 < R0 Then GoTo 30 '          если за шаг решения левый край фронта луча не достигнет плоскости неподвижного приемника
Tn1(2) = E: kodVY(2) = 1 '              запоминаем время когда расстояние от правого края 1-го фронта луча до приемника станет меньше Vs*P0
Info = "kod=2     T=  " & E & vbCrLf
Info = Info & "Vs*P0/L1=  " & Vs * P0 / L0 & vbCrLf: Info = Info & "R0/L1=        " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd
30:
If kodVY(5) = 1 Then GoTo 50 '                                       движение левого края 2-го фронта луча до неподвижного приемника
Call DX_DY_Dopler(Xs(2, 11), Ys(2, 11), X1, Y1, Alfa0) '
If Vs * P0 < R0 Then GoTo 50 '          если за шаг решения левый край фронта луча не достигнет плоскости неподвижного приемника
Tn2(1) = E: kodVY(5) = 1 '              запоминаем время когда расстояние от левого края 2-го фронта луча до приемника станет меньше Vs*P0
Info = "kod=5     T=  " & E & vbCrLf
Info = Info & "Vs*P0/L1=  " & Vs * P0 / L0 & vbCrLf: Info = Info & "R0/L1=        " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd
50:
If kodVY(6) = 1 Then GoTo 60 '                                        движение правого края 2-го фронта луча до неподвижного приемника
Call DX_DY_Dopler(Xs(2, 12), Ys(2, 12), X1, Y1, Alfa0) '
If Vs * P0 < R0 Then GoTo 60 '          если за шаг решения левый край фронта луча не достигнет плоскости неподвижного приемника
Tn2(2) = E: kodVY(6) = 1 '              запоминаем время когда расстояние от правого края 2-го фронта луча до приемника станет меньше Vs*P0
Info = "kod=6     T=  " & E & vbCrLf
Info = Info & "Vs*P0/L1=  " & Vs * P0 / L0 & vbCrLf: Info = Info & "R0/L1=        " & R0 / L0 & vbCrLf
If Check19.Value = 0 Then StopEnd
60:

If kodVY(1) = 1 And kodVY(2) = 1 Then
If kodVY(5) = 1 And kodVY(6) = 1 Then
Tn1(3) = (Tn1(1) + Tn1(2)) / 2 '                                    время приема 1-го фронта волны неподвижным приемником
Tn2(3) = (Tn2(1) + Tn2(2)) / 2 '                                    время приема 2-го фронта волны неподвижным приемником
Tn1(4) = Tn2(3) - Tn1(3): v1n(1) = N0 / Tn1(4) '          за время Tn1(4) будет принято неподвижным приемником N0 периодов сигнала
kodR = 1
End If
End If

If NP >= NC0 Or kodR = 1 Then '                                 если пора выводить текущие данные на экран
Text17.Text = E: NP = 0
If Check12.Value = 1 Then '                                   если рисовать детали
If Check20.Value = 0 Then '                                   если не рисовать траектории, а стирать предыдущие точки
Picture1.Cls: Risunok1
End If
Picture1.Line (X(11) / Mv1, Y(11) / Mv1)-(X(12) / Mv1, Y(12) / Mv1), 1  '                               рисуем поверхность приемника
Picture1.Line (Xs(1, 11) / Mv1, Ys(1, 11) / Mv1)-(Xs(1, 12) / Mv1, Ys(1, 12) / Mv1), RGB(0, 0, 250)   ' рисуем фронт 1-го сигнала
Picture1.Line (Xs(2, 11) / Mv1, Ys(2, 11) / Mv1)-(Xs(2, 12) / Mv1, Ys(2, 12) / Mv1), RGB(0, 0, 250)   ' рисуем фронт 2-го сигнала
End If 'Check12.Value = 1
End If 'NP = NC0

If kodEnd = 1 Then GoTo 100
If kodR = 1 Then GoTo 100
Do While DoEvents() ' идем на 10, после обработки сообщений в очереди
GoTo 10 '             операционной системы, а если будет сообщение от кнопки <Остановить>,
Loop '                то kodEnd будет равен 1 и на следующем шаге будет уже GoTo 100
90: MsgBox "Ошибка рассчета в Dopler_Lazer", , "Maikelson": Exit Sub
100: End Sub

Private Sub StopEnd() ' остановить прохождения участка пути при касании фронтом волны зеркала в подпрограммах Dopler_Zerkalo и Dopler_Lazer
Kyn = 6 '                                              по умолчанию не прерывать расчет эффекта Доплера
Info = Info & "ПРОДОЛЖИТЬ ПОЭТАПНЫЙ РАСЧЕТ?"
Kyn = MsgBox(Info, vbYesNo, "Maikelson_Dopler")
If Kyn <> 6 Then kodR = 1 '                            значит прервать выполнение расчета эффекта Доплера (закончить)
End Sub

'Private Sub Check23_Click() '                     загрузить форму графика фаз двух лучей
'If Check5.Value = 1 Then Form5.Show '             ЭТА ФОРМА ОТСУТСТВУЕТ
'Form5.Picture2.Scale (0, 10.5)-(26, 0)
'If Check23.Value = 0 Then Unload Form5
'End Sub

Private Sub Check5_Click() '                     загрузить форму отчета
If Check5.Value = 1 Then Form9.Show
Form9.picBox.Scale (0, 10.5)-(26, 0)
If Check5.Value = 0 Then Unload Form9
End Sub

Private Sub Otcheot1() '                                           отчет Майкельсон
On Error GoTo 80
Info = "ii = 10 и jj = 20                                 общий путь до стеклянной поверхности наклонного полупрозрачного зеркала" & vbCrLf
Info = Info & "  ii = 11  внутри наклонного полупрозрачного зеркала до отражения ___________  jj = 21  внутри наклонного полупрозрачного зеркала до преломления" & vbCrLf
Info = Info & "  ii = 12  нет ___________________________________________________________  jj = 22  свободно ввверх до преломления на прозрачной пластине " & vbCrLf
Info = Info & "  ii = 13  внутри наклонного полупрозрачного зеркала влево до преломления ___   jj = 23  внутри прозрачной пластины вверх до преломления " & vbCrLf
Info = Info & "  ii = 14  свободно влево до левого зеркала ________________________________  jj = 24  свободно ввверх до верхнего зеркала " & vbCrLf
Info = Info & "  ii = 15  свободно вправо до преломления _________________________________  jj = 25  свободно вниз до преломления на прозрачной пластине " & vbCrLf
Info = Info & "  ii = 16  внутри наклонного полупрозрачного зеркала вправо до преломления __   jj = 26  внутри прозрачной пластины вниз до преломления " & vbCrLf
Info = Info & "  ii = 17  нет ___________________________________________________________  jj = 27  свободно вниз до отражения от полупрозрачного зеркала " & vbCrLf
Info = Info & "  ii = 18  свободно вправо до приемника ___________________________________  jj = 28  свободно вправо до приемника" & vbCrLf & vbCrLf

E = 1: If Option7.Value = True Then E = MK '        если Real
Info = Info & "Т с, v1(i) МГц, V(i) м/с, а если Real то T=10^6*T= мкс   v1(i)=v1(i)/10^6= ТГц    V(i)=V(i)/10^6= тыс.км/с   Nv= Nv/10^6 " _
& "     Yk1=   " & Format(Fix(MF * Yn1(18)) / MF, "0.000000000") & "    Yk2=    " & Format(Fix(MF * Yn2(28)) / MF, "0.000000000") & vbCrLf & vbCrLf
Info = Info & "i           T1(i+10)                   T2(i+20)                     S1(i+10)              S2(i+20)             v1(i+10)/v01" _
& "          v1(i+20)/v02           V1(i+10)               V2(i+20)              P21(i+10)         P21(i+20)" _
& "           An(i+10)             An(i+20)               Nv(i+10)              Nv(i+20)" & vbCrLf
Form9.picBox.CurrentX = 0.2: Form9.picBox.CurrentY = 10.5: Form9.picBox.Print Info

For i = 0 To 9 '                                                              i+10 и i+20 это номера участков пути лучей
Info = i & "       " & Format(Fix(E * MK * MK * (Tk1(i + 10) - Tk1(i + 9))) / MK / MK, "0.000000000000") & "        " & Format(Fix(E * MK * MK * (Tk2(i + 20) - Tk2(i + 19))) / MK / MK, "0.000000000000") _
& "        " & Format(Fix(MK * (Xk1(i + 10) - Xk1(i + 9))) / MK, "000.000000") & "       " & Format(Fix(MK * (Xk2(i + 20) - Xk2(i + 19))) / MK, "000.000000") _
& "        " & Format(v1(i + 10) / v0, "0.000000000") & "       " & Format(v1(i + 20) / v00, "0.000000000") _
& "        " & Format(Fix(MK * Vs1(i + 10)) / MK / E, "000.0000000") & "       " & Format(Fix(MK * Vs2(i + 20)) / MK / E, "000.0000000") _
& "        " & Format(P21(i + 10), "0.0000000") & "       " & Format(P21(i + 20), "0.0000000") _
& "        " & Format(An(i + 10) * kUgol, "000.000000") & "       " & Format(An(i + 20) * kUgol, "000.000000") _
& "        " & Format(Fix(MK * Nv(i + 10)) / MK, "0.000000") & "       " & Format(Fix(MK * Nv(i + 20)) / MK, "0.000000")
If i = 3 Then Form9.picBox.ForeColor = &H80000002
If i = 6 Then Form9.picBox.ForeColor = &H80000008
Form9.picBox.CurrentX = 0: Form9.picBox.CurrentY = 5 - i / 2: Form9.picBox.Print Info
Next i
GoTo 100
80: MsgBox "Ошибка в отчете ", , "Maikelson": Exit Sub
100: End Sub

Private Sub Otcheot3() '                                           отчет Юдин
On Error GoTo 80
Info = "ii = 10 и jj = 20                             общий путь до переднего торца зеркальной треугольной призмы" & vbCrLf
Info = Info & "  ii = 11  стандартно нет или мимо призмы до экрана или дополнительного зеркала______  jj = 21  если есть цилиндр, то до его левой стеклянной крышки цилиндра" & vbCrLf
Info = Info & "  ii = 12  нет ___________________________________________________________________  jj = 22  если есть цилиндр, то сразу в двух (левой и правой) стеклянных крышках " & vbCrLf
Info = Info & "  ii = 13  нет ___________________________________________________________________  jj = 23  если есть цилиндр, то внутри него " & vbCrLf
Info = Info & "  ii = 14  от левой грани призмы или дополнительного зеркала до левого зеркала ________ jj = 24 от правой грани призмы или от правой крышки цилиндра до правого зеркала    " & vbCrLf
Info = Info & "  ii = 15  нет________________________ ___________________________________________  jj = 25  нет " & vbCrLf
Info = Info & "  ii = 16  нет ___________________________________________________________________  jj = 26  нет " & vbCrLf
Info = Info & "  ii = 17  нет ___________________________________________________________________  jj = 27  нет " & vbCrLf
Info = Info & "  ii = 18  от лазера или от левого зеркала (вариант справа) до поверхности экрана _______  jj = 28  от правого зеркала до поверхности экрана" & vbCrLf & vbCrLf

E = 1: If Option7.Value = True Then E = MK '        если Real
Info = Info & "Т в с, v1(i) в МГц, V(i) в м/с, а если Real то T=10^6*T= мкс   v1(i)=v1(i)/10^12= ТГц    V(i)=V(i)/10^6= тыс.км/с   Nv= Nv/10^6 " _
& "     Xk1=   " & Format(Fix(MF * Xn1(18)) / MF, "0.000000000") & "    Xk2=    " & Format(Fix(MF * Xn2(28)) / MF, "0.000000000") & vbCrLf & vbCrLf

Info = Info & "i           T1(i+10)                    T2(i+20)                     S1(i+10)              S2(i+20)             v1(i+10)/v01" _
& "         v1(i+20)/v02            V1(i+10)              V2(i+20)              P21(i+10)         P21(i+20)" _
& "           An(i+10)              An(i+20)               Nv(i+10)              Nv(i+20)" & vbCrLf
Form9.picBox.CurrentX = 0.2: Form9.picBox.CurrentY = 10.5: Form9.picBox.Print Info

For i = 0 To 9 '                                                              i+10 и i+20 это номера участков пути лучей
If Check25.Value = 0 And i = 2 Then GoTo 70 '          если нет цилиндра, то нет и данных для этих этапов пути
If Check25.Value = 0 And i = 3 Then GoTo 70 '          если нет цилиндра
If i = 5 Or i = 6 Or i = 7 Then GoTo 70
Info = i & "       " & Format(Fix(E * MK * MK * (Tk1(i + 10) - Tk1(i + 9))) / MK / MK, "0.000000000000") & "        " & Format(Fix(E * MK * MK * (Tk2(i + 20) - Tk2(i + 19))) / MK / MK, "0.000000000000") _
& "        " & Format(Fix(MK * (Xk1(i + 10) - Xk1(i + 9))) / MK, "000.000000") & "       " & Format(Fix(MK * (Xk2(i + 20) - Xk2(i + 19))) / MK, "000.000000") _
& "        " & Format(v1(i + 10) / v0, "0.000000000") & "       " & Format(v1(i + 20) / v00, "0.000000000") _
& "        " & Format(Fix(MK * Vs1(i + 10)) / MK / E, "000.0000000") & "       " & Format(Fix(MK * Vs2(i + 20)) / MK / E, "000.0000000") _
& "        " & Format(P21(i + 10), "0.0000000") & "       " & Format(P21(i + 20), "0.0000000") _
& "        " & Format(An(i + 10) * kUgol, "000.000000") & "       " & Format(An(i + 20) * kUgol, "000.000000") _
& "        " & Format(Fix(MK * Nv(i + 10)) / MK, "0.000000") & "       " & Format(Fix(MK * Nv(i + 20)) / MK, "0.000000")
Form9.picBox.CurrentX = 0: Form9.picBox.CurrentY = 5 - i / 2: Form9.picBox.Print Info
70: Next i
GoTo 100
80: MsgBox "Ошибка в отчете ", , "Maikelson": Exit Sub
100: End Sub






Private Sub Command2_Click() '                остановить выполнение эксперимента
kodEnd = 1
End Sub

Private Sub Command3_Click() '                продолжить выполнение эксперимента
NC0 = Text10.Text: kodEnd = 0:
If Option1.Value = True Then Maikelson '      моделируется эксперимент Майкельсона-Морли
If Option8.Value = True Then Yudin '          моделируется эксперимент Юдина
End Sub

Private Sub Command4_Click() '                сделать NC0 шагов решения
NC0 = Text10.Text: kodEnd = 1
If Option1.Value = True Then Maikelson '      моделируется эксперимент Майкельсона-Морли
If Option8.Value = True Then Yudin '          моделируется эксперимент Юдина
End Sub

Private Sub Command14_Click() '                остановить выполнение эксперимента (дублирующая кнопка у сплошного эффекта Доплера)
kodEnd = 1
End Sub

Private Sub Command10_Click() '               продолжить выполнение эксперимента по сплошному эффекту Доплера
kodEnd = 0
If Option1.Value = True Then Maikelson_Dopler '       моделируется эксперимент Майкельсона-Морли
If Option8.Value = True Then Yudin_Dopler '           моделируется эксперимент Юдина
End Sub

Private Sub Command5_Click() '                          Очистить картинку
Picture1.Cls: Risunok1
X(1) = Text1.Text: Y(1) = Text66.Text: X(2) = Text67.Text: Y(2) = Text2.Text  '     координаты центра левого и правого зеркал
X(3) = 0: Y(3) = 0: X(4) = 0: Y(4) = Text3.Text   '                                 координаты вехних центров пластин
w1 = Text27.Text: h1 = Text28.Text / 1000 '                                         длина пластин и толщина пластин
w7 = Text49.Text '                                                                  длина цилиндра с воздухом
Alfa1 = Text4.Text / kUgol: Alfa2 = Text5.Text / kUgol: Alfa3 = Text6.Text / kUgol: Alfa4 = Text7.Text / kUgol 'углы наклона зеркал и пластин
X(5) = 0: Y(5) = Text9.Text  '                                                      координаты центра источника света
ML = Text19.Text   '                                                                масштаб изображения

If Option8.Value = False Then '                            если схема Майкельсона
X(6) = Text8.Text: Y(6) = 0 '                                                       координаты центра приемника (экрана)
Shema1
Info = " 1- левое зеркало   2- вехнее зеркало  3- полупрозрачное зеркало   4- прозрачная пластина " & vbCrLf
Info = Info & "  5- источник света   6- объектив трубы или экран" & vbCrLf & vbCrLf
Picture1.CurrentX = -12: Picture1.CurrentY = 24.9: Picture1.Print Info
Info = "       углы наклона движущихся поверхностей                                углы под которыми движутся лучи"
Picture1.CurrentX = -12: Picture1.CurrentY = 22.9: Picture1.Print Info
Picture1.CurrentX = X(1) / ML - 1: Picture1.CurrentY = Y(1) / ML: Picture1.Print 1
Picture1.CurrentX = X(2) / ML: Picture1.CurrentY = Y(2) / ML + 1: Picture1.Print 2
Picture1.CurrentX = X(3) / ML: Picture1.CurrentY = Y(3) / ML + 1: Picture1.Print 3
Picture1.CurrentX = X(4) / ML: Picture1.CurrentY = Y(4) / ML + 1: Picture1.Print 4
Picture1.CurrentX = X(5) / ML - 1.5: Picture1.CurrentY = Y(5) / ML + 0.5: Picture1.Print 5
Picture1.CurrentX = X(6) / ML + 1: Picture1.CurrentY = Y(6) / ML: Picture1.Print 6
End If
If Option8.Value = True Then '                           если схема установки Юдина
X(6) = 0: Y(6) = Text8.Text '                                                       координаты центра приемника (экрана)
X(7) = X(3) + (X(2) - X(3) - w7) / 3: Y(7) = Y(3)
Shema3
Info = " 1- левое зеркало   2- правое зеркало  3- зеркальная призма  4- зеркало  5- источник света  " & vbCrLf
Info = Info & "  6- объектив трубы или экран  " & vbCrLf & vbCrLf
Picture1.CurrentX = -12: Picture1.CurrentY = 24.9: Picture1.Print Info
Info = "       углы наклона движущихся поверхностей                                 углы под которыми движутся лучи"
Picture1.CurrentX = -12: Picture1.CurrentY = 22.9: Picture1.Print Info
Picture1.CurrentX = X(1) / ML - 1: Picture1.CurrentY = Y(1) / ML: Picture1.Print 1
Picture1.CurrentX = X(2) / ML: Picture1.CurrentY = Y(2) / ML: Picture1.Print 2
Picture1.CurrentX = X(3) / ML: Picture1.CurrentY = (Y(3)) / ML + 1: Picture1.Print 3
Picture1.CurrentX = X(4) / ML: Picture1.CurrentY = (Y(4)) / ML + 1: If Check17.Value = 1 Then Picture1.Print 4
Picture1.CurrentX = X(5) / ML - 1.5: Picture1.CurrentY = Y(5) / ML + 0.5: Picture1.Print 5
Picture1.CurrentX = X(6) / ML + 0.5: Picture1.CurrentY = (Y(6)) / ML + 1: Picture1.Print 6
End If
End Sub

Private Sub Risunok1() '                            нанести сетку на рисунок
Picture1.Scale (-14, 25)-(16, -5)
For i = -12 To 16 Step 2 ' по оси X
For j = -4 To 24 Step 2 '  по оси Y
Picture1.Line (-14, j)-(16, j), RGB(200, 200, 200): Picture1.Line (i, -5)-(i, 25), RGB(200, 200, 200)
Picture1.CurrentX = i - 0.3: Picture1.CurrentY = -4.3: Picture1.Print i
Picture1.CurrentX = -14: Picture1.CurrentY = j + 0.5: Picture1.Print j
Next j
Next i
Picture1.Line (-14, 0)-(16, 0), 1: Picture1.Line (0, -5)-(0, 25), 1
End Sub

Private Sub Shema1() '                            нарисовать установку Майкельсона
Picture1.Line (X(15) / ML, Y(15) / ML)-(X(16) / ML, Y(16) / ML), RGB(255, 255, 255)
Picture1.Line (X(16) / ML, Y(16) / ML)-(X(18) / ML, Y(18) / ML), RGB(255, 255, 255)
Picture1.Line (X(17) / ML, Y(17) / ML)-(X(18) / ML, Y(18) / ML), RGB(255, 255, 255)
Picture1.Line (X(17) / ML, Y(17) / ML)-(X(15) / ML, Y(15) / ML), RGB(255, 255, 255)
Picture1.Line (X(25) / ML, Y(25) / ML)-(X(26) / ML, Y(26) / ML), RGB(255, 255, 255)
Picture1.Line (X(26) / ML, Y(26) / ML)-(X(28) / ML, Y(28) / ML), RGB(255, 255, 255)
Picture1.Line (X(27) / ML, Y(27) / ML)-(X(28) / ML, Y(28) / ML), RGB(255, 255, 255)
Picture1.Line (X(27) / ML, Y(27) / ML)-(X(25) / ML, Y(25) / ML), RGB(255, 255, 255)
Picture1.Line (X(35) / ML, Y(35) / ML)-(X(36) / ML, Y(36) / ML), RGB(255, 255, 255)
Picture1.Line (X(36) / ML, Y(36) / ML)-(X(38) / ML, Y(38) / ML), RGB(255, 255, 255)
Picture1.Line (X(37) / ML, Y(37) / ML)-(X(38) / ML, Y(38) / ML), RGB(255, 255, 255)
Picture1.Line (X(37) / ML, Y(37) / ML)-(X(35) / ML, Y(35) / ML), RGB(255, 255, 255)
Picture1.Line (X(45) / ML, Y(45) / ML)-(X(46) / ML, Y(46) / ML), RGB(255, 255, 255)
Picture1.Line (X(46) / ML, Y(46) / ML)-(X(48) / ML, Y(48) / ML), RGB(255, 255, 255)
Picture1.Line (X(47) / ML, Y(47) / ML)-(X(48) / ML, Y(48) / ML), RGB(255, 255, 255)
Picture1.Line (X(47) / ML, Y(47) / ML)-(X(45) / ML, Y(45) / ML), RGB(255, 255, 255)
Picture1.Circle (X(55) / ML, Y(55) / ML), 0.4, RGB(255, 255, 255)
Picture1.Line (X(66) / ML + w1 / 2 / ML, Y(66) / ML - w1 / 4 / ML)-(X(66) / ML, Y(66) / ML + w1 / 4 / ML), RGB(255, 255, 255), B

X(11) = X(1) - w1 * Cos(Alfa1) / 2: X(12) = X(11) - h1 * Sin(Alfa1) '     левое зеркало
X(13) = X(1) + w1 * Cos(Alfa1) / 2: X(14) = X(13) - h1 * Sin(Alfa1)
Y(11) = Y(1) - w1 * Sin(Alfa1) / 2: Y(12) = Y(11) + h1 * Cos(Alfa1)
Y(13) = Y(1) + w1 * Sin(Alfa1) / 2: Y(14) = Y(13) + h1 * Cos(Alfa1)
Picture1.Line (X(11) / ML, Y(11) / ML)-(X(12) / ML, Y(12) / ML), 1: Picture1.Line (X(12) / ML, Y(12) / ML)-(X(14) / ML, Y(14) / ML), 1
Picture1.Line (X(13) / ML, Y(13) / ML)-(X(14) / ML, Y(14) / ML), 1: Picture1.Line (X(13) / ML, Y(13) / ML)-(X(11) / ML, Y(11) / ML), 1
X(21) = X(2) - w1 * Cos(Alfa2) / 2: X(22) = X(21) - h1 * Sin(Alfa2) '     верхнее зеркало
X(23) = X(2) + w1 * Cos(Alfa2) / 2: X(24) = X(23) - h1 * Sin(Alfa2)
Y(21) = Y(2) - w1 * Sin(Alfa2) / 2: Y(22) = Y(21) + h1 * Cos(Alfa2)
Y(23) = Y(2) + w1 * Sin(Alfa2) / 2: Y(24) = Y(23) + h1 * Cos(Alfa2)
Picture1.Line (X(21) / ML, Y(21) / ML)-(X(22) / ML, Y(22) / ML), 1: Picture1.Line (X(22) / ML, Y(22) / ML)-(X(24) / ML, Y(24) / ML), 1
Picture1.Line (X(23) / ML, Y(23) / ML)-(X(24) / ML, Y(24) / ML), 1: Picture1.Line (X(23) / ML, Y(23) / ML)-(X(21) / ML, Y(21) / ML), 1
X(31) = X(3) - w1 * Cos(Alfa3) / 2: X(32) = X(31) - h1 * Sin(Alfa3) '     полупрозрачное зеркало
X(33) = X(3) + w1 * Cos(Alfa3) / 2: X(34) = X(33) - h1 * Sin(Alfa3)
Y(31) = Y(3) - w1 * Sin(Alfa3) / 2: Y(32) = Y(31) + h1 * Cos(Alfa3)
Y(33) = Y(3) + w1 * Sin(Alfa3) / 2: Y(34) = Y(33) + h1 * Cos(Alfa3)
Picture1.Line (X(31) / ML, Y(31) / ML)-(X(32) / ML, Y(32) / ML), 1: Picture1.Line (X(32) / ML, Y(32) / ML)-(X(34) / ML, Y(34) / ML), 1
Picture1.Line (X(33) / ML, Y(33) / ML)-(X(34) / ML, Y(34) / ML), 1: Picture1.Line (X(33) / ML, Y(33) / ML)-(X(31) / ML, Y(31) / ML), 1
X(41) = X(4) - w1 * Cos(Alfa4) / 2: X(42) = X(41) - h1 * Sin(Alfa4) '     компенсационная пластина
X(43) = X(4) + w1 * Cos(Alfa4) / 2: X(44) = X(43) - h1 * Sin(Alfa4)
Y(41) = Y(4) - w1 * Sin(Alfa4) / 2: Y(42) = Y(41) + h1 * Cos(Alfa4)
Y(43) = Y(4) + w1 * Sin(Alfa4) / 2: Y(44) = Y(43) + h1 * Cos(Alfa4)
Picture1.Line (X(41) / ML, Y(41) / ML)-(X(42) / ML, Y(42) / ML), 1: Picture1.Line (X(42) / ML, Y(42) / ML)-(X(44) / ML, Y(44) / ML), 1
Picture1.Line (X(43) / ML, Y(43) / ML)-(X(44) / ML, Y(44) / ML), 1: Picture1.Line (X(43) / ML, Y(43) / ML)-(X(41) / ML, Y(41) / ML), 1

Picture1.Circle (X(5) / ML, Y(5) / ML), 0.4, RGB(0, 255, 0) '             источник света
Picture1.Line (X(6) / ML + w1 / 2 / ML, Y(6) / ML - w1 / 4 / ML)-(X(6) / ML, Y(6) / ML + w1 / 4 / ML), , B '     приемник

X(15) = X(11): X(16) = X(12): X(17) = X(13): X(18) = X(14)
Y(15) = Y(11): Y(16) = Y(12): Y(17) = Y(13): Y(18) = Y(14)
X(25) = X(21): X(26) = X(22): X(27) = X(23): X(28) = X(24)
Y(25) = Y(21): Y(26) = Y(22): Y(27) = Y(23): Y(28) = Y(24)
X(35) = X(31): X(36) = X(32): X(37) = X(33): X(38) = X(34)
Y(35) = Y(31): Y(36) = Y(32): Y(37) = Y(33): Y(38) = Y(34)
X(45) = X(41): X(46) = X(42): X(47) = X(43): X(48) = X(44)
Y(45) = Y(41): Y(46) = Y(42): Y(47) = Y(43): Y(48) = Y(44)
X(55) = X(5): Y(55) = Y(5)
X(66) = X(6): Y(66) = Y(6)
End Sub

Private Sub Shema2() '                            нарисовать установку Демьянова

End Sub

Private Sub Shema3() '                            нарисовать установку Юдина
Picture1.Line (X(15) / ML, Y(15) / ML)-(X(16) / ML, Y(16) / ML), RGB(255, 255, 255) ' стираем левое зеркало
Picture1.Line (X(16) / ML, Y(16) / ML)-(X(18) / ML, Y(18) / ML), RGB(255, 255, 255)
Picture1.Line (X(17) / ML, Y(17) / ML)-(X(18) / ML, Y(18) / ML), RGB(255, 255, 255)
Picture1.Line (X(17) / ML, Y(17) / ML)-(X(15) / ML, Y(15) / ML), RGB(255, 255, 255)

Picture1.Line (X(25) / ML, Y(25) / ML)-(X(26) / ML, Y(26) / ML), RGB(255, 255, 255) ' стираем правое зеркало
Picture1.Line (X(26) / ML, Y(26) / ML)-(X(28) / ML, Y(28) / ML), RGB(255, 255, 255)
Picture1.Line (X(27) / ML, Y(27) / ML)-(X(28) / ML, Y(28) / ML), RGB(255, 255, 255)
Picture1.Line (X(27) / ML, Y(27) / ML)-(X(25) / ML, Y(25) / ML), RGB(255, 255, 255)

Picture1.Line (X(34) / ML, Y(34) / ML)-(X(35) / ML, Y(35) / ML), RGB(255, 255, 255) ' стираем треугольную призму
Picture1.Line (X(34) / ML, Y(34) / ML)-(X(33) / ML, Y(33) / ML), RGB(255, 255, 255)
Picture1.Line (X(35) / ML, Y(35) / ML)-(X(33) / ML, Y(33) / ML), RGB(255, 255, 255)

If Check17.Value = 1 Then
Picture1.Line (X(45) / ML, Y(45) / ML)-(X(46) / ML, Y(46) / ML), RGB(255, 255, 255) ' стираем компенсационную пластину, которая
Picture1.Line (X(46) / ML, Y(46) / ML)-(X(48) / ML, Y(48) / ML), RGB(255, 255, 255) ' тут является зеркалом, если она есть
Picture1.Line (X(47) / ML, Y(47) / ML)-(X(48) / ML, Y(48) / ML), RGB(255, 255, 255)
Picture1.Line (X(47) / ML, Y(47) / ML)-(X(45) / ML, Y(45) / ML), RGB(255, 255, 255)
End If

If Check25.Value = 1 Then
Picture1.Line (X(75) / ML, Y(75) / ML)-(X(76) / ML, Y(76) / ML), RGB(255, 255, 255) ' стираем цилиндр, если он входит в
Picture1.Line (X(76) / ML, Y(76) / ML)-(X(78) / ML, Y(78) / ML), RGB(255, 255, 255) ' конструкцию установки
Picture1.Line (X(77) / ML, Y(77) / ML)-(X(78) / ML, Y(78) / ML), RGB(255, 255, 255)
Picture1.Line (X(77) / ML, Y(77) / ML)-(X(75) / ML, Y(75) / ML), RGB(255, 255, 255)
End If

Picture1.Circle (X(55) / ML, Y(55) / ML), 0.5, RGB(255, 255, 255) '                   стираем источник света

Picture1.Line (X(65) / ML, Y(65) / ML)-(X(66) / ML, Y(66) / ML), RGB(255, 255, 255) ' стираем экран
Picture1.Line (X(66) / ML, Y(66) / ML)-(X(68) / ML, Y(68) / ML), RGB(255, 255, 255)
Picture1.Line (X(67) / ML, Y(67) / ML)-(X(68) / ML, Y(68) / ML), RGB(255, 255, 255)
Picture1.Line (X(67) / ML, Y(67) / ML)-(X(65) / ML, Y(65) / ML), RGB(255, 255, 255)

X(11) = X(1) - w1 * Cos(Alfa1) / 2: X(13) = X(1) + w1 * Cos(Alfa1) / 2 '     левое зеркало
Y(11) = Y(1) - w1 * Sin(Alfa1) / 2: Y(13) = Y(1) + w1 * Sin(Alfa1) / 2
If Check17.Value = 0 Then '
X(12) = X(11) - h1 * Sin(Alfa1): Y(12) = Y(11) + h1 * Cos(Alfa1)
X(14) = X(13) - h1 * Sin(Alfa1): Y(14) = Y(13) + h1 * Cos(Alfa1)
End If
If Check17.Value = 1 Then '
X(12) = X(11) + h1 * Sin(Alfa1): Y(12) = Y(11) - h1 * Cos(Alfa1)
X(14) = X(13) + h1 * Sin(Alfa1): Y(14) = Y(13) - h1 * Cos(Alfa1)
End If
Picture1.Line (X(11) / ML, Y(11) / ML)-(X(12) / ML, Y(12) / ML), 1: Picture1.Line (X(12) / ML, Y(12) / ML)-(X(14) / ML, Y(14) / ML), 1
Picture1.Line (X(13) / ML, Y(13) / ML)-(X(14) / ML, Y(14) / ML), 1: Picture1.Line (X(13) / ML, Y(13) / ML)-(X(11) / ML, Y(11) / ML), 1

X(21) = X(2) - w1 * Cos(Alfa2) / 2: X(22) = X(21) + h1 * Sin(Alfa2) '     правое зеркало
X(23) = X(2) + w1 * Cos(Alfa2) / 2: X(24) = X(23) + h1 * Sin(Alfa2)
Y(21) = Y(2) - w1 * Sin(Alfa2) / 2: Y(22) = Y(21) - h1 * Cos(Alfa2)
Y(23) = Y(2) + w1 * Sin(Alfa2) / 2: Y(24) = Y(23) - h1 * Cos(Alfa2)
Picture1.Line (X(21) / ML, Y(21) / ML)-(X(22) / ML, Y(22) / ML), 1: Picture1.Line (X(22) / ML, Y(22) / ML)-(X(24) / ML, Y(24) / ML), 1
Picture1.Line (X(23) / ML, Y(23) / ML)-(X(24) / ML, Y(24) / ML), 1: Picture1.Line (X(23) / ML, Y(23) / ML)-(X(21) / ML, Y(21) / ML), 1

'                                                                 если угол на передней грани призмы 90 градусов
X(31) = X(3) - w1 * Sin(Alfa3 / 2) / 2: X(32) = X(3) + w1 * Sin(Alfa3 / 2) / 2 '     левая и правая точки задней грани призмы
Y(31) = Y(3) + w1 * Cos(Alfa3 / 2) / 2: Y(32) = Y(3) + w1 * Cos(Alfa3 / 2) / 2 '     левая и правая точки задней грани призмы
If Check3.Value = 1 Then X(31) = X(3) '                           если угол на передней грани призмы 45 градусов
Picture1.Line (X(31) / ML, Y(31) / ML)-(X(32) / ML, Y(32) / ML), 1
Picture1.Line (X(31) / ML, Y(31) / ML)-(X(3) / ML, Y(3) / ML), 1: Picture1.Line (X(32) / ML, Y(32) / ML)-(X(3) / ML, Y(3) / ML), 1

If Check17.Value = 1 Then '                                       если вместо компенсационной пластины у нас будет зеркало
X(41) = X(4) - w1 * Cos(Alfa4) / 2: X(42) = X(41) - h1 * Sin(Alfa4)
X(43) = X(4) + w1 * Cos(Alfa4) / 2: X(44) = X(43) - h1 * Sin(Alfa4)
Y(41) = Y(4) - w1 * Sin(Alfa4) / 2: Y(42) = Y(41) + h1 * Cos(Alfa4)
Y(43) = Y(4) + w1 * Sin(Alfa4) / 2: Y(44) = Y(43) + h1 * Cos(Alfa4)
Picture1.Line (X(41) / ML, Y(41) / ML)-(X(42) / ML, Y(42) / ML), 1: Picture1.Line (X(42) / ML, Y(42) / ML)-(X(44) / ML, Y(44) / ML), 1
Picture1.Line (X(43) / ML, Y(43) / ML)-(X(44) / ML, Y(44) / ML), 1: Picture1.Line (X(43) / ML, Y(43) / ML)-(X(41) / ML, Y(41) / ML), 1
End If

If Check25.Value = 1 Then '                                       если цилиндр входит в конструкцию установки, то рисуем и цилиндр
X(71) = X(7): X(72) = X(7): X(73) = X(7) + w7: X(74) = X(7) + w7
Y(71) = Y(7) + 4 * h1: Y(72) = Y(7) - 4 * h1: Y(73) = Y(7) + 4 * h1: Y(74) = Y(7) - 4 * h1
Picture1.Line (X(71) / ML, Y(71) / ML)-(X(72) / ML, Y(72) / ML), 1: Picture1.Line (X(72) / ML, Y(72) / ML)-(X(74) / ML, Y(74) / ML), 1
Picture1.Line (X(73) / ML, Y(73) / ML)-(X(74) / ML, Y(74) / ML), 1: Picture1.Line (X(73) / ML, Y(73) / ML)-(X(71) / ML, Y(71) / ML), 1
End If

Picture1.Circle (X(5) / ML, Y(5) / ML), 0.5, RGB(0, 255, 0) '                          источник света

X(61) = X(6) - w1 / 2: X(62) = X(61): X(63) = X(6) + w1 / 2: X(64) = X(63)   '         экран
Y(61) = Y(6): Y(62) = Y(6) + h1: Y(63) = Y(6): Y(64) = Y(6) + h1
Picture1.Line (X(61) / ML, Y(61) / ML)-(X(62) / ML, Y(62) / ML), 1: Picture1.Line (X(62) / ML, Y(62) / ML)-(X(64) / ML, Y(64) / ML), 1
Picture1.Line (X(63) / ML, Y(63) / ML)-(X(64) / ML, Y(64) / ML), 1: Picture1.Line (X(63) / ML, Y(63) / ML)-(X(61) / ML, Y(61) / ML), 1

X(15) = X(11): X(16) = X(12): X(17) = X(13): X(18) = X(14)
Y(15) = Y(11): Y(16) = Y(12): Y(17) = Y(13): Y(18) = Y(14)
X(25) = X(21): X(26) = X(22): X(27) = X(23): X(28) = X(24)
Y(25) = Y(21): Y(26) = Y(22): Y(27) = Y(23): Y(28) = Y(24)
X(33) = X(3): X(34) = X(31): X(35) = X(32)
Y(33) = Y(3): Y(34) = Y(31): Y(35) = Y(32)
X(45) = X(41): X(46) = X(42): X(47) = X(43): X(48) = X(44)
Y(45) = Y(41): Y(46) = Y(42): Y(47) = Y(43): Y(48) = Y(44)
X(55) = X(5): Y(55) = Y(5)
X(65) = X(61): X(66) = X(62): X(67) = X(63): X(68) = X(64)
Y(65) = Y(61): Y(66) = Y(62): Y(67) = Y(63): Y(68) = Y(64)
X(75) = X(71): X(76) = X(72): X(77) = X(73): X(78) = X(74)
Y(75) = Y(71): Y(76) = Y(72): Y(77) = Y(73): Y(78) = Y(74)
End Sub

Private Sub Command6_Click() '                 Сохранить картинку в файл
On Error GoTo 90
SavePicture Picture1.Image, "Maikelson_4_" & Text21.Text & ".bmp"
GoTo 100
90: MsgBox "Ошибка записи в файл", , "Maikelson": Exit Sub
100: End Sub

Private Sub Command9_Click() '     перейти с параметрами полученными при проведение эксперимента на форму интерференции
Form3.Show
X(1) = Xn1(18): Y(1) = Yn1(18): X(2) = Xn2(28): Y(2) = Yn2(28)
Q1 = An(18): Q2 = An(28)
Form3.Text22.Text = Fix(1000 * VXiso) / MK: Form3.Text23.Text = Fix(1000 * VYiso) / MK ' тут VXiso= VXiso и VYiso= VYiso

If Option1.Value = True Then '                                  если установка Майкельсона, то разворачиваем экран на +90 градусов
Form3.Text22.Text = Fix(1000 * -VYiso) / MK: Form3.Text23.Text = Fix(1000 * VXiso) / MK ' а тут теперь VXiso= - VYiso , а VYiso= VXiso
X(1) = -Yn1(18): Y(1) = Xn1(18): X(2) = -Yn2(28): Y(2) = Xn2(28) '                    координаты тоже поменяются местами
Q1 = An(18) + pi / 2: If Q1 > 2 * pi Then Q1 = Q1 - 2 * pi '                          а углы увеличатся на 90 градусов
Q2 = An(28) + pi / 2: If Q2 > 2 * pi Then Q2 = Q2 - 2 * pi
End If

v1(19) = Text71.Text: v1(29) = Text72.Text ' это частота принятая экраном или после эксперимента или уточненная при сплошном эффекте Доплера
'v1(19) = Text33.Text: v1(29) = Text34.Text'                              а это будет частота в эксперименте на участке до экрана
T1 = Text31.Text: T2 = Text32.Text: G1 = Text51.Text: G2 = Text52.Text '   это общее время движения и количество колебаний света двух лучей

Form3.Text24.Text = Vs / 1000: Form3.Text67.Text = Fix(MK * MK * Vs / v0) / MK '   скорость света в воздухе и длина волны 1-го луча в мкм
Form3.Text25.Text = v0 / 10 ^ 6: Form3.Text63.Text = v00 / 10 ^ 6 '                частота лазеров 1 и 2 (если их два)
Form3.Text1.Text = Q1 * kUgol: Form3.Text2.Text = Q2 * kUgol '                     углы скоростей на текущем участке
Form3.Text3.Text = v1(19): Form3.Text4.Text = v1(29)   '                           частота света луча ИЛИ принятая экраном
Form3.Text5.Text = V(1) / Vs: Form3.Text6.Text = V(2) / Vs '                       суммарные скорости лучей на текущих участках 18 и 28
Form3.Text7.Text = G1: Form3.Text8.Text = G2 '                          количество колебаний в лучах до экрана с учетом эффекта Доплера
Form3.Text9.Text = T1: Form3.Text10.Text = T2 '                                    затраченное лучами время движения до экрана
Form3.Text64.Text = v0 * T1: Form3.Text65.Text = v00 * T2 '                        количество колебаний источника за время Т1 и Т2
Form3.Text26.Text = Fix(MK * MK * X(1)) / MK / MK: Form3.Text28.Text = Fix(MF * Y(1)) / MF: ' координаты лучей по оси Х при касании экрана
Form3.Text27.Text = Fix(MK * MK * X(2)) / MK / MK: Form3.Text29.Text = Fix(MF * Y(2)) / MF ' координаты лучей по оси Y при касании экрана
Form3.Text40.Text = "1E-17": Form3.Text32.Text = "1E-14" '       если реальные данные
If Option4.Value = True Then '                                   если тестовые данные
Form3.Text40.Text = "1E-6": Form3.Text32.Text = "1E-2" '         шаг решения и масштаб времени для графика
End If
End Sub

Private Sub Command11_Click() '                    сохранить исходные данные размеров установки
On Error GoTo 30
Info1 = Text39.Text: Y(4) = Text3.Text '           координата верхнего центра компенсационной пластины или дополнительного зеркала
X(1) = Text1.Text: Y(1) = Text66.Text: X(2) = Text67.Text: Y(2) = Text2.Text '   координаты центров левого и верхнего или правого зеркал
X(6) = 0: Y(6) = Text8.Text  '                                                   координаты центра приемника (экрана)
Alfa1 = Text4.Text: Alfa2 = Text5.Text: Alfa3 = Text6.Text: Alfa4 = Text7.Text ' углы наклона зеркал и пластин
DV = Text69.Text  '                                                              диаметр луча лазера в мм
pp = FreeFile
Open App.Path + "\Dat\Maikelson_" & Info1 & ".dat" For Output As #pp
On Error GoTo 340
Print #pp, Format(Fix(MF * X(1)), "0"), Format(Fix(MF * Y(1)), "0"), Format(Fix(MF * X(2)), "0"), Format(Fix(MF * Y(2)), "0"), _
Format(Fix(MF * Alfa1), "0"), Format(Fix(MF * Alfa2), "0"), Format(Fix(MF * Alfa3), "0"), Format(Fix(MF * Alfa4), "0"), _
Format(Fix(MF * Y(4)), "0"), Format(Fix(MF * Y(6)), "0"), Format(Fix(MF * DV), "0")
Close pp
GoTo 350
30: MsgBox "Задайте правильно данные", , "Maikelson": GoTo 350
340: MsgBox "Ошибка записи в файл \Dat\Maikelson_" & Info1 & ".dat", , "Maikelson1": Close pp
350: End Sub

Private Sub Command12_Click() '                         загрузить исходные данные размеров установки
CD1.CancelError = False '                               Обеспечиваем генерацию ошибки при нажатии на Cancel
Info = "All Files (*.*)|*.*"
CD1.Filter = Info '                                     задаем свойства Filter
CD1.FilterIndex = 1 '                                   Устанавливаем необходимый индекс (1-значит All)
CD1.FileName = Empty '                                  Обеспечиваем защиту от неправильного введенного имени файла или дериктории
CD1.Flags = cdlOFNFileMustExist Or cdlOFNHideReadOnly ' скрываем флажек Read Only
CD1.ShowOpen '                                          Вызываем диалоговое окно Open (можно CD1.Action = 1)
Info1 = CD1.FileName
On Error GoTo 130
pp = FreeFile
Open Info1 For Input As #pp
On Error GoTo 100
Input #pp, X(1), Y(1), X(2), Y(2), Alfa1, Alfa2, Alfa3, Alfa4, Y(4), Y(6), DV
Close pp
Text1.Text = X(1) / MF: Text66.Text = Y(1) / MF: Text67.Text = X(2) / MF: Text2.Text = Y(2) / MF
Text4.Text = Alfa1 / MF: Text5.Text = Alfa2 / MF: Text6.Text = Alfa3 / MF: Text7.Text = Alfa4 / MF
Text3.Text = Y(4) / MF: Text8.Text = Y(6) / MF: Text69.Text = DV / MF
GoTo 150
100: Info = "Ошибка чтения данных из файла " & Info1
MsgBox Info, , "Maikelson1": Close pp: GoTo 150
130: MsgBox "Не могу найти файл " & Info1, , "Maikelson1"
150: End Sub

Private Sub Command13_Click() '             сделать расчет времени движения и пройденного лучами пути по методике Майкельсона
If Option8.Value = True Then GoTo 80 '                                если установка Юдина, то это ошибка
On Error GoTo 90 '                                                    если не проведен вычислительный эксперимент, то нет исходных данных
Picture1.FillColor = &H8000000E
Picture1.FillStyle = 0
Picture1.Line (-16, 1)-(16, -5), RGB(255, 255, 255), B
Picture1.FillColor = RGB(0, 0, 0)
Picture1.FillStyle = 1
Info = " Рассчет по теории Майкельсона"
Picture1.CurrentX = -12: Picture1.CurrentY = 1: Picture1.Print Info
T1 = 2 * (X0(3) - X0(1)) * (1 + VXiso3 ^ 2 / Vs ^ 2) / Vs
T2 = 2 * (Y0(2) - Y0(3)) * (1 + VXiso3 ^ 2 / Vs ^ 2 / 2) / Vs
G1 = v0 * T1: G2 = v0 * T2
Info = "T1=   " & Format(T1, "0.0000000000000") & "       N1(t)=   " & Format(G1, "000000000.0000") & "       T2=   " & Format(T2, "0.0000000000000") & "       N2(t)=   " & Format(G2, "000000000.0000")
Picture1.CurrentX = -14: Picture1.CurrentY = 0: Picture1.Print Info
Info = "            T1-T2 =   " & Format(T1 - T2, "0.000000000000") & "                N1(t) - N2(t) =   " & Format(G1 - G2, "000000000.0000")
Picture1.CurrentX = -12: Picture1.CurrentY = -1: Picture1.Print Info

If Check7.Value = 1 Then '              сравнительный эксперимент
T1 = Tk1(16) - Tk1(11): T2 = Tk2(27) - Tk2(21): G1 = v0 * T1: G2 = v0 * T2
Info = " Эксперимент для сравнения с расчетом Майкельсона"
Picture1.CurrentX = -12: Picture1.CurrentY = -2: Picture1.Print Info
Info = "T1=   " & Format(T1, "0.0000000000000") & "       N1(t)=   " & Format(G1, "000000000.0000") & "       T2=   " & Format(T2, "0.0000000000000") & "       N2(t)=   " & Format(G2, "000000000.0000")
Picture1.CurrentX = -14: Picture1.CurrentY = -3: Picture1.Print Info
Info = "            T1-T2 =   " & Format(T1 - T2, "0.000000000000") & "                N1(t) - N2(t) =   " & Format(G1 - G2, "000000000.0000")
Picture1.CurrentX = -12: Picture1.CurrentY = -4: Picture1.Print Info
End If

If Check7.Value = 0 Then '              полный эксперимент, т.е. если учесть и пути от лазера до зеркала 3 и от зеркала 3 до экрана
T1 = Tk1(18): T2 = Tk2(28): G1 = v0 * T1: G2 = v0 * T2
Info = " Эксперимент для всего пути"
Picture1.CurrentX = -12: Picture1.CurrentY = -2: Picture1.Print Info
Info = "T1=   " & Format(T1, "0.0000000000000") & "       N1(t)=   " & Format(G1, "000000000.0000") & "       T2=   " & Format(T2, "0.0000000000000") & "       N2(t)=   " & Format(G2, "000000000.0000")
Picture1.CurrentX = -14: Picture1.CurrentY = -3: Picture1.Print Info
Info = "            T1-T2 =   " & Format(T1 - T2, "0.000000000000") & "                N1(t) - N2(t) =   " & Format(G1 - G2, "000000000.0000")
Picture1.CurrentX = -12: Picture1.CurrentY = -4: Picture1.Print Info
End If
GoTo 100
80: MsgBox "Необходим вычислительный эксперимент на установке Майкельсона", , "Maikelson": Exit Sub
90: MsgBox "Сначала надо выполнить вычислительный эксперимент", , "Maikelson": Exit Sub
100: End Sub


Private Sub Command16_Click() 'закрыть форму
Unload Me
End Sub






















Private Sub Command1_Click() '        повторить проведенный эксперимент, но только с моделированием сплошного эффекта Доплера, т.е. с двумя
On Error GoTo 80 '                    фронтами движущимися непрерывно от лазера до экрана (углы отражения и скорости лучей уже найдены ранее)
If Check27.Value = 0 Then GoTo 5
Info = "     Этот эксперимент выполняется  " & vbCrLf
Info = Info & "только без учета конусности луча" & vbCrLf
MsgBox Info, , "Maikelson": Exit Sub

5:
If Option1.Value = True Then GoTo 6
If Option8.Value = True And Check25.Value = 0 Then GoTo 6
Info = "Сплошной эксперимент выполняется  " & vbCrLf
Info = Info & "     только без цилиндра" & vbCrLf
MsgBox Info, , "Maikelson": Exit Sub

6:
Picture1.Cls: Risunok1 '                              выводим данные по частоте, которые были получены при проведении общего эксперимента
Info = " частота луча на этом участке пути и принятая поверхностью в конце этого участка пути"
Picture1.CurrentX = -12: Picture1.CurrentY = 24.5: Picture1.Print Info
For i = 10 To 18
Info = "v(" & i & ")/v01=   " & Format(v1(i) / v0, "0.000000000") & "    " & Format(v1k(i) / v0, "0.000000000") _
& "                         v(" & i + 10 & ")/v02=   " & Format(v1(i + 10) / v00, "0.000000000") & "    " & Format(v1k(i + 10) / v00, "0.000000000")
Picture1.CurrentX = -12: Picture1.CurrentY = 31.5 - 4 * i / 5: Picture1.Print Info
Next i

For i = 0 To 40
X(i) = X0(i): Y(i) = Y0(i) '        восстанавливаем исходные координаты элементов установки в момент времени Т=0
Next i '
DV = Text69.Text / 1000 '           ширина фронта волны в метрах (в окошке задаем в мм ширину всего фронта, как диаметр луча лазера)
'                                   в моей схеме, если один лазер, то ширина фронтов будет меньше, т.к. начальный фронт на призме делится
'                                   примерно пополам, а все остальные параметры остались неизменными и их можно не считывать повторно, но  шаг
'                                   решения и число циклов расчета, через которое выводятся данные на экран, мы можем изменить

'                                   СЕЙЧАС ЭТОЙ ФУНКЦИИ Х(5)=Х0(5) НЕТ, ПОЭТОМУ ПОВТОРИТЬ ТАКОЙ РАСЧЕТ НЕЛЬЗЯ
'          при разном шаге мы получаем разный ответ, т.к. точность определения моментов касания фронтами поверхностей, например, в тестовом примере
'          будет разной, если у нас не отмечен чекбокс Х(5)=Х0(5), когда 2-ой фронт формируется без учета смещения источника света по оси Х,
'          и при шаге 10^-4 мы на всех поверхностях получим частоту v/v0=1,015625000, а с уменьшением шага результат будет стремится к единице
'        так при шаге 10^-5 мы на всех поверхностях получим частоту v/v0=1,003086420
'          а при шаге 10^-6 мы на всех поверхностях получим частоту v/v0=1,000307787
'   и только при шаге 10^-7 мы на всех поверхностях получим частоту v/v0=1,000000000

P00 = Text40.Text: kP0 = Text46.Text '                          основной шаг решения и коэффициент его уменьшения для точных расчетов
P0 = P00 / kP0 '                                                основной шаг решения уменьшаем всегда
Text42.Text = Fix(MF * P00 * Vs0 / L0) / MF '                   путь лучей за один основной шаг (в длинах волн света) кроме участка до экрана при Skip у Юдина
Text53.Text = Fix(MF * P00 * Vs0 / kP0 / L0) / MF '             путь лучей за один уменьшенный шаг (в длинах волн света)
NC0 = Text10.Text '                                             число циклов расчета, после которых выводить графику
N0 = Text57.Text ' количество периодов сигнала после которого начнется движение 2-го фронта волны, которое можно изменить после проведения начального эксперимента
T0 = N0 / v0 '     время после которого начнется движение 2-го фронта волны через N0 периодов сигнала

On Error GoTo 90
For i = 1000 To 2230
Tn1(i) = 0: Tn2(i) = 0: Tk1(i) = 0: Tk2(i) = 0: V(i) = 0 ' V(10) и V(20) при этом сохранятся
Next i
For i = 0 To 22
X21(i) = 0: Y21(i) = 0: X22(i) = 0: Y22(i) = 0: VX21(i) = 0: VY21(i) = 0: VX22(i) = 0: VY22(i) = 0
Next i

'               СКОРОСТЬ СВЕТА V(10)=Vs, угол луча Betta И ЧАСТОТА света v1(10)=v0 на первом этапе УЖЕ БЫЛИ РАССЧИТАНЫ ПРИ ПРОВЕДЕНИЕ ЭКСПЕРИМЕНТА
VX21(11) = V(10) * Cos(Betta): VY21(11) = V(10) * Sin(Betta) '                 если учитывалась среда, то V(10) для оптической плотности воздуха
VX21(12) = V(10) * Cos(Betta): VY21(12) = V(10) * Sin(Betta)
VX21(21) = VX21(11): VX21(22) = VX21(12): VY21(21) = VY21(11): VY21(22) = VY21(12)

X21(11) = X(5) - DV * Cos(Betta - pi / 2) / 2: Y21(11) = Y(5) - DV * Sin(Betta - pi / 2) / 2 ' начальные координаты краев 1-го фронта
X21(12) = X(5) + DV * Cos(Betta - pi / 2) / 2: Y21(12) = Y(5) + DV * Sin(Betta - pi / 2) / 2 ' 1-го луча (до деления на два разных луча)
X21(21) = X21(11): X21(22) = X21(12): Y21(21) = Y21(11): Y21(22) = Y21(12) '                   они же будут и у 2-го луча 1-го фронта
'                                         и для вторых фронтов они до Т=Т0 будут соответствовать координатам движущегося лазера (лазеров)

ii = 1110: jj = 0 '   до отражения на полупрозрачной пластине, где луч разделится на два, ведем общий расчет для одного луча и это
iii = 1210: jjj = 0 ' будут участки для левого края фронта ii=1110 и ii=1111, а после этого будет ii=1113 и jj=1122, т.е. отдельные
'                     расчеты для левого края каждого из лучей, а для правого края фронта будет сначала iii=1210 и iii=1211, а после
kk = 0: pp = 0 '      разделения лучей будет iii=1213 и jjj=1222 и точно также для 2-го фронта двух лучей сначала для левого края будет
kkk = 0: ppp = 0 '    kk=2110 и pp=kk=2111, а после разделения kk=2113 и pp=2122 (и также по аналогии для правого края 2-го фронта волны)

Check6.Visible = True '                               эта опция позволяет при сплошном проходе совместить координаты двух фронтов волн в ИСО приемника
If Option1.Value = True Then Check6.Visible = False ' а на установке Майкельсона много мороки с этим чекбоксом, а эффект нам не очень нужен
Label43.Caption = "Y1ф1л": Label33.Caption = "Y1ф2л": Label5.Caption = "Y2ф1л": Label39.Caption = "Y2ф2л"

If Option8.Value = True Then '                       если установка Юдина, то изменяем некоторые параметры
If Check18.Value = 0 Then '                     если один лазер, то сразу делим луч на два, т.к. центр луча попадет точно на грань призмы,
X21(11) = X(5) - DV * Cos(Betta - pi / 2) / 2: Y21(11) = Y(5) - DV * Sin(Betta - pi / 2) / 2 ' начальные координаты левого края 1-го фронта
X21(12) = X(5): Y21(12) = Y(5) '                                                               1-го луча (правый край будет в середине лазера)
X21(21) = X(5): Y21(21) = Y(5) '                                                               начальные координаты правого края 1-го фронта
X21(22) = X(5) + DV * Cos(Betta - pi / 2) / 2: Y21(22) = Y(5) + DV * Sin(Betta - pi / 2) / 2 ' 2-го луча (левый край будет в середине лазера)
End If

If Check18.Value = 1 Then '              если будет и 2-ой лазер отстоящий от 1-го на расстоянии DV
X21(11) = X(5) - 3 * DV * Cos(Betta - pi / 2) / 2: Y21(11) = Y(5) - 3 * DV * Sin(Betta - pi / 2) / 2 ' начальные координаты левого и правого края
X21(12) = X(5) - DV * Cos(Betta - pi / 2) / 2: Y21(12) = Y(5) - DV * Sin(Betta - pi / 2) / 2 '         1-го фронта 1-го луча (от 1-го лазера)
X21(21) = X(5) + DV * Cos(Betta - pi / 2) / 2: Y21(21) = Y(5) + DV * Sin(Betta - pi / 2) / 2  '        начальные координаты левого и правого края
X21(22) = X(5) + 3 * DV * Cos(Betta - pi / 2) / 2: Y21(22) = Y(5) + 3 * DV * Sin(Betta - pi / 2) / 2 ' 1-го фронта 2-го луча (от 2-го лазера)
End If
ii = 1110: iii = 1210 '                        коды начальных участков пути левого и правого краев 1-го фронта 1-го луча
jj = 1120: jjj = 1220 '                        коды начальных участков пути левого и правого краев 1-го фронта 2-го луча
If Check3.Value = 1 Then '               если левый, т.е. 1-ый, луч летит прямо (не отражаясь от треугольной призмы)
ii = 1118: iii = 1218 '                  (здесь An(18) = An(10)  уже задано, т.к. это повтор основного эксперимента)
If Check17.Value = 1 Then  '             а если еще отмечен и чекбокс 17, то луч полетит до зеркала 4, а далее до зеркала 1
ii = 1111: iii = 1211 '                  (здесь An(11) = An(10)  уже задано)
End If
End If
Label43.Caption = "X1ф1л": Label33.Caption = "X1ф2л": Label5.Caption = "X2ф1л": Label39.Caption = "X2ф2л"
End If 'Option8.Value = True

kod(111) = 0: kod(121) = 0 ' коды прохождения левым и правым краями 1-го фронта 1-го луча неподвижного в АСО приемника
kod(211) = 0: kod(221) = 0 ' коды прохождения левым и правым краями 2-го фронта 1-го луча неподвижного в АСО приемника
kod(112) = 0: kod(122) = 0 ' коды прохождения левым и правым краями 1-го фронта 2-го луча неподвижного в АСО приемника
kod(212) = 0: kod(222) = 0 ' коды прохождения левым и правым краями 2-го фронта 2-го луча неподвижного в АСО приемника

kodEnd = 0: T = 0: kodVY(20) = 0 '                    при kodVY(20) = 0 движение 2-го фронта волны не началось
If Option1.Value = True Then Maikelson_Dopler '       моделируется эксперимент на установке Майкельсона-Морли
If Option8.Value = True Then Yudin_Dopler '           моделируется эксперимент на установке Юдина
GoTo 100
80: MsgBox "Введите правильно данные", , "Maikelson": Exit Sub
90: MsgBox "Ошибка расчета исходных данных", , "Maikelson": Exit Sub
100: End Sub





Private Sub Maikelson_Dopler() '             вычислительный эксперимент по сплошному эффекту Доплера на установке Майкельсона
'                             здесь нет неподвижноых приемников и поэтому определяется только частота принятая поверхностями зеркал и экрана
On Error GoTo 80 '                           после сообщения об ошибке отчет все равно будет выведен
1:
T = T + P0: NC = NC + 1
If T >= T0 And kodVY(20) = 0 Then '                                       если пришло время движения 2-го фронта, а он еще не начал движение
kk = 2110: kkk = 2210: pp = 0: ppp = 0: kodVY(20) = 1  '                  kodVY(20) = 1 это значит началось движение второго фронта волны

VX22(11) = V(10) * Cos(Betta): VY22(11) = V(10) * Sin(Betta) '                                 скорости краев 2-го фронта 1-го луча
VX22(12) = V(10) * Cos(Betta): VY22(12) = V(10) * Sin(Betta)
VX22(21) = VX22(11): VX22(22) = VX22(12): VY22(21) = VY22(11): VY22(22) = VY22(12) '           они же будут и у 2-го луча 2-го фронта

X22(11) = X(5) - DV * Cos(Betta - pi / 2) / 2: Y22(11) = Y(5) - DV * Sin(Betta - pi / 2) / 2  ' начальные координаты краев 2-го фронта
X22(12) = X(5) + DV * Cos(Betta - pi / 2) / 2: Y22(12) = Y(5) + DV * Sin(Betta - pi / 2) / 2  ' 1-го луча (до деления на два разных луча)
X22(21) = X22(11): X22(22) = X22(12): Y22(21) = Y22(11): Y22(22) = Y22(12) '                    они же будут и у 2-го луча 2-го фронта
End If

X(1) = X(1) + VXiso * P0: Y(1) = Y(1) + VYiso * P0 '    координаты центра левого зеркала
X(2) = X(2) + VXiso * P0: Y(2) = Y(2) + VYiso * P0 '    координаты центра верхнего зеркала
X(3) = X(3) + VXiso * P0: Y(3) = Y(3) + VYiso * P0 '    координаты центра задней поверхности полупрозрачного зекала
X(4) = X(4) + VXiso * P0: Y(4) = Y(4) + VYiso * P0 '    координаты центра задней поверхности прозрачной пластины
X(5) = X(5) + VXiso * P0: Y(5) = Y(5) + VYiso * P0 '    координаты центра источника света
X(6) = X(6) + VXiso * P0: Y(6) = Y(6) + VYiso * P0 '    координаты объектива
X(30) = X(30) + VXiso * P0: Y(30) = Y(30) + VYiso * P0 'координаты центра передней поверхности полупрозрачного зекала
X(40) = X(40) + VXiso * P0: Y(40) = Y(40) + VYiso * P0 'координаты центра передней поверхности прозрачной пластины

X21(11) = X21(11) + VX21(11) * P0: Y21(11) = Y21(11) + VY21(11) * P0 '               координаты левого и правого краев
X21(12) = X21(12) + VX21(12) * P0: Y21(12) = Y21(12) + VY21(12) * P0 '               1-го фронта волны 1-го луча
X21(21) = X21(21) + VX21(21) * P0: Y21(21) = Y21(21) + VY21(21) * P0 '               координаты левого и правого краев
X21(22) = X21(22) + VX21(22) * P0: Y21(22) = Y21(22) + VY21(22) * P0 '               1-го фронта волны 2-го луча

X22(11) = X22(11) + VX22(11) * P0: Y22(11) = Y22(11) + VY22(11) * P0 '               координаты левого и правого краев
X22(12) = X22(12) + VX22(12) * P0: Y22(12) = Y22(12) + VY22(12) * P0 '               2-го фронта волны 1-го луча
X22(21) = X22(21) + VX22(21) * P0: Y22(21) = Y22(21) + VY22(21) * P0 '               координаты левого и правого краев
X22(22) = X22(22) + VX22(22) * P0: Y22(22) = Y22(22) + VY22(22) * P0 '               2-го фронта волны 2-го луча

'ii, jj, iii, jjj 1000 +  - первый фронт волны (вылетает в момент времени T= 0)
'kk, pp, kkk, ppp 2000 +  - второй фронт волны (вылетает в момент времени T0= N0/v0)
'ii, jj, kk, pp   100  +  - левый край фронта 1-го и 2-го луча 1-го и 2-го фронтов волны
'iii,jjj, kkk,ppp 200  +  - правый край фронта 1-го и 2-го луча 1-го и 2-го фронтов волны
'ii, iii, kk, kkk 10...18 - этапы пути 1-го (горизонтального) луча
'jj, jjj, pp, ppp 20...28 - этапы пути 2-го (вертикального) луча

'Tn1(ii), Tn1(iii)        - время прохождения левым и правым краями фронта 1-го луча 1-го фронта волны своих этапов пути
'Tn2(jj), Tn2(jjj)        - время прохождения левым и правым краями фронта 2-го луча 1-го фронта волны своих этапов пути
'Tk1(kk), Tk1(kkk)        - время прохождения левым и правым краями фронта 1-го луча 2-го фронта волны своих этапов пути
'Tk2(pp), Tk2(ppp)        - время прохождения левым и правым краями фронта 2-го луча 2-го фронта волны своих этапов пути
'(Tn1(ii)+Tn1(iii))/2     - время в конце прохождения 1-м лучом 1-го фронта своих этапов пути 10... 18
'(Tn2(jj)+Tn2(jjj))/2     - время в конце прохождения 2-м лучом 1-го фронта своих этапов пути 20... 28
'(Tk1(kk)+Tk1(kkk))/2     - время в конце прохождения 1-м лучом 2-го фронта своих этапов пути 10... 18
'(Tk2(pp)+Tk2(ppp))/2     - время в конце прохождения 2-м лучом 2-го фронта своих этапов пути 20... 28


'                          /////////////////                   1-ый фронт                /////////////////////

'              /////////////////                  ОБЩИЙ ПУТЬ ЛЕВОГО КРАЯ 1-го фронта ДВУХ ЛУЧЕЙ                /////////////////////

If ii = 1110 Then  '              ////общий участок пути до прозрачной поверхности пластины полупрозрачного зеркала
Call DX_DY_Dopler(X21(11), Y21(11), X(30), Y(30), Alfa3) ' находим расстояние от луча до пластины
V12 = V(10) * Cos(An(10) - Alfa3 + pi / 2) '          это скорость луча в АСО вдоль нормали к плоскости стеклянной пластины
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1110  '
V(1111) = Vs1(11): V(1121) = V(1111) '                          скорости левых краев фронтов 2-х лучей 1-го фронта
VX21(11) = V(1111) * Cos(An(11)): VY21(11) = V(1111) * Sin(An(11)): VX21(21) = VX21(11): VY21(21) = VY21(11)
Tn1(ii) = T: Tn2(ii + 10) = T: ii = 1111 '              jj = 1121 не задаем, т.к. и на этом участке два луча полетят как один луч
1110: End If 'ii = 1110'                                2-ой луч тоже прошел этот этап, т.к. два луча летят тут как один

If ii = 1111 Then  '                                 ////общий участок пути в пластине до полупрозрачного поверхности
Call DX_DY_Dopler(X21(11), Y21(11), X(3), Y(3), Alfa3)
V12 = V(1111) * Cos(An(11) - Alfa3 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластины
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1111  '
'                                                         1-ый луч отражается от полупрозрачного зеркала
V(1113) = Vs1(13): VX21(11) = V(1113) * Cos(An(13)): VY21(11) = V(1113) * Sin(An(13)): Tn1(ii) = T: ii = 1113: '   ii = 1112 нет
'                                                         2-ой луч переходит в менее плотную среду
V(1122) = Vs2(22): VX21(21) = V(1122) * Cos(An(22)): VY21(21) = V(1122) * Sin(An(22)): Tn2(1121) = T: jj = 1122
1111: End If 'ii = 1111 '                                 2-ой луч тоже прошел этот этап, т.к. два луча летят тут как один


'       /////////////////                 продолжение ПУТИ ЛЕВОГО КРАЯ 1-го фронта 1-го ЛУЧА                   /////////////////////
If ii = 1113 Then  '                                 участок пути 13 в пластине влево до выхода из нее
Call DX_DY_Dopler(X21(11), Y21(11), X(30), Y(30), Alfa3)
V12 = V(1113) * Cos(An(13) - Alfa3 - pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 + pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1113 '           если за шаг решения луч НЕ вылетит из пластины
V(1114) = Vs1(14): VX21(11) = V(1114) * Cos(An(14)): VY21(11) = V(1114) * Sin(An(14)): Tn1(ii) = T: ii = 1114
1113: End If

If ii = 1114 Then  '                                 участок пути 14 до левого зеркала и отражение
Call DX_DY_Dopler(X21(11), Y21(11), X(1), Y(1), Alfa1)
V12 = V(1114) * Cos(An(14) - Alfa1 - pi / 2) '        это скорость луча в АСО вдоль нормали к левому зеркалу при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - Alfa1 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1114  '            если за шаг решения луч НЕ достигнет зеркала
V(1115) = Vs1(15): VX21(11) = V(1115) * Cos(An(15)): VY21(11) = V(1115) * Sin(An(15)): Tn1(ii) = T: ii = 1115
1114: End If '

If ii = 1115 Then  '                                  участок пути 15 от левого зеркала до пластины и преломление
Call DX_DY_Dopler(X21(11), Y21(11), X(30), Y(30), Alfa3)
V12 = V(1115) * Cos(An(15) - Alfa3 + pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1115  '          если за шаг решения луч НЕ перелетит за нижнюю грань полупрозрачной пластины
V(1116) = Vs1(16): VX21(11) = V(1116) * Cos(An(16)): VY21(11) = V(1116) * Sin(An(16)): Tn1(ii) = T: ii = 1116
1115: End If

If ii = 1116 Then  '                                  участок пути 16 в пластине вправо до полупрозрачного зеркала и преломление
Call DX_DY_Dopler(X21(11), Y21(11), X(3), Y(3), Alfa3)
V12 = V(1116) * Cos(An(16) - Alfa3 + pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1116 '           если за шаг решения луч НЕ перелетит за верхнюю грань полупрозрачной пластины
V(1118) = Vs1(18): VX21(11) = V(1118) * Cos(An(18)): VY21(11) = V(1118) * Sin(An(18)): Tn1(ii) = T: ii = 1118 '   ii = 1117 нет
1116: End If

If ii = 1118 Then  '                                  участок пути 18 от полупрозрачного зеркала до экрана
V12 = V(1118) * Cos(An(18)) '                         это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '                   это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = X(6) - X21(11)
If (V12 + V21) * P0 < R0 Then GoTo 1118  '            если за шаг решения луч НЕ перелетит за экран
Tn1(ii) = T: ii = 1119: Xn1(1) = X21(11): Yn1(1) = Y21(11) '
1118: End If


'         /////////////////        продолжение ПУТИ левого края 1-го ФРОНТА 2-го ЛУЧА (после раздвоения)      /////////////////////
'If jj = 1121 Then  '                           этого участка нет, т.к. он пройден общим лучом при ii=1111

If jj = 1122 Then  '                            участок пути 22 от полупрозрачного зеркала вверх до прозрачной пластины и преломление
Call DX_DY_Dopler(X21(21), Y21(21), X(40), Y(40), Alfa4)
V12 = V(1122) * Cos(An(22) - Alfa4 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине
V21 = VXiso3 * Cos(AlfaISO - Alfa4 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1122  '            если за шага решения луч НЕ перелетит за нижнюю грань прозрачной пластины
V(1123) = Vs2(23): VX21(21) = V(1123) * Cos(An(23)): VY21(21) = V(1123) * Sin(An(23)): Tn2(jj) = T: jj = 1123
1122: End If

If jj = 1123 Then  '                            участок пути 23 внутри прозрачной пластины и преломление
Call DX_DY_Dopler(X21(21), Y21(21), X(4), Y(4), Alfa4)
V12 = V(1123) * Cos(An(23) - Alfa4 + pi / 2) '       это скорость луча в АСО вдоль нормали к стеклянной пластине
V21 = VXiso3 * Cos(AlfaISO - Alfa4 - pi / 2) '       это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1123  '           если за шаг решения луч НЕ вылетит из прозрачной пластины
V(1124) = Vs2(24): VX21(21) = V(1124) * Cos(An(24)): VY21(21) = V(1124) * Sin(An(24)): Tn2(jj) = T: jj = 1124
1123: End If

If jj = 1124 Then  '                             участок пути 24 от прозрачной пластины вверх до зеркала и отражение
Call DX_DY_Dopler(X21(21), Y21(21), X(2), Y(2), Alfa2)
V12 = V(1124) * Cos(An(24) - Alfa2 - pi / 2) '        это скорость луча в АСО вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa2 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1124  '            если за шаг решения луч НЕ перелетит за зеркало
V(1125) = Vs2(25): VX21(21) = V(1125) * Cos(An(25)): VY21(21) = V(1125) * Sin(An(25)): Tn2(jj) = T: jj = 1125
1124: End If

If jj = 1125 Then  '                             участок пути 25 от зеркала вниз до прозрачной пластины и преломление
Call DX_DY_Dopler(X21(21), Y21(21), X(4), Y(4), Alfa4)
V12 = V(1125) * Cos(An(25) - Alfa4 - pi / 2) '     это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1125  '         если за шага решения луч НЕ влетит в пластину
V(1126) = Vs2(26): VX21(21) = V(1126) * Cos(An(26)): VY21(21) = V(1126) * Sin(An(26)): Tn2(jj) = T: jj = 1126
1125: End If

If jj = 1126 Then  '                             участок пути 26 внутри прозрачной пластины вниз и преломление
Call DX_DY_Dopler(X21(21), Y21(21), X(40), Y(40), Alfa4)
V12 = V(1126) * Cos(An(26) - Alfa4 - pi / 2) '     это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1126  '         если за шаг решения луч НЕ вылетит из пластины
V(1127) = Vs2(27): VX21(21) = V(1127) * Cos(An(27)): VY21(21) = V(1127) * Sin(An(27)): Tn2(jj) = T: jj = 1127
1126: End If

If jj = 1127 Then  '                             участок пути 27 от прозрачной пластины вниз до полупрозрачного зеркала и отражение
Call DX_DY_Dopler(X21(21), Y21(21), X(3), Y(3), Alfa3)
V12 = V(1127) * Cos(An(27) - Alfa3 - pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 + pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1127  '          если за шаг решения луч НЕ достигнет полупрозрачного зеркала
V(1128) = Vs2(28): VX21(21) = V(1128) * Cos(An(28)): VY21(21) = V(1128) * Sin(An(28)): Tn2(jj) = T: jj = 1128
1127: End If

If jj = 1128 Then  '                             участок пути 28 от полупрозрачного зеркала до экрана (объектива)
V12 = V(1128) * Cos(An(28)) '                    это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '              это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = X(6) - X21(21)
If (V12 + V21) * P0 < R0 Then GoTo 1128  '       если за шаг решения луч НЕ перелетит за экран
Tn2(jj) = T: jj = 1129: Xn1(2) = X21(21): Yn1(2) = Y21(21)
1128: End If



'              /////////////////                  ОБЩИЙ ПУТЬ ПРАВОГО КРАЯ 1-го фронта ДВУХ ЛУЧЕЙ                   /////////////////////

If iii = 1210 Then  '                          ////      общий участок пути до прозрачной поверхности полупрозрачного зеркала
Call DX_DY_Dopler(X21(12), Y21(12), X(30), Y(30), Alfa3) ' находим расстояние от луча до пластины
V12 = V(10) * Cos(An(10) - Alfa3 + pi / 2) '          это скорость луча в АСО вдоль нормали к плоскости стеклянной пластины
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1210  '
V(1211) = Vs1(11): V(1221) = V(1211) '                         скорости правых краев фронтов 2-х лучей 1-го фронта
VX21(12) = V(1211) * Cos(An(11)): VY21(12) = V(1211) * Sin(An(11)): VX21(22) = VX21(12): VY21(22) = VY21(12)
Tn1(iii) = T: Tn2(iii + 10) = T: iii = 1211 '                  jjj = 1221 не задаем, т.к. и на этом участке два луча полетят как один луч
1210: End If 'iii = 1210'                                      2-ой луч тоже прошел этот этап, т.к. два луча летят как один

If iii = 1211 Then  '                            ////     общий участок пути в пластине до полупрозрачной поверхности
Call DX_DY_Dopler(X21(12), Y21(12), X(3), Y(3), Alfa3)
V12 = V(1211) * Cos(An(11) - Alfa3 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластины
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1211  '
V(1213) = Vs1(13) '                                                         1-ый луч отражается от полупрозрачного зеркала
VX21(12) = V(1213) * Cos(An(13)): VY21(12) = V(1213) * Sin(An(13)): Tn1(iii) = T: iii = 1213 '   iii = 1212 нет
V(1222) = Vs2(22) '                                                         2-ой луч переходит в менее плотную среду
VX21(22) = V(1222) * Cos(An(22)): VY21(22) = V(1222) * Sin(An(22)): Tn2(1221) = T: jjj = 1222
1211: End If '                                            2-ой луч тоже прошел этот этап, т.к. два луча летят как один


'               /////////////////            продолжение  ПУТИ ПРАВОГО КРАЯ 1-го фронта 1-го ЛУЧА         /////////////////////
If iii = 1213 Then  '                                  участок пути 13 в пластине влево до выхода из нее
Call DX_DY_Dopler(X21(12), Y21(12), X(30), Y(30), Alfa3)
V12 = V(1213) * Cos(An(13) - Alfa3 - pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 + pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1213  '          если за шаг решения луч НЕ вылетит из пластины
V(1214) = Vs1(14): VX21(12) = V(1214) * Cos(An(14)): VY21(12) = V(1214) * Sin(An(14)): Tn1(iii) = T: iii = 1214
1213: End If

If iii = 1214 Then  '                                 участок пути 14 до левого зеркала и отражение
Call DX_DY_Dopler(X21(12), Y21(12), X(1), Y(1), Alfa1)
V12 = V(1214) * Cos(An(14) - Alfa1 - pi / 2) '        это скорость луча в АСО вдоль нормали к левому зеркалу при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - Alfa1 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1214  '            если за шаг решения луч НЕ достигнет зеркала
V(1215) = Vs1(15): VX21(12) = V(1215) * Cos(An(15)): VY21(12) = V(1215) * Sin(An(15)): Tn1(iii) = T: iii = 1215
1214: End If '

If iii = 1215 Then  '                                 участок пути 15 от левого зеркала до пластины и преломление
Call DX_DY_Dopler(X21(12), Y21(12), X(30), Y(30), Alfa3)
V12 = V(1215) * Cos(An(15) - Alfa3 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1215 '             если за шаг решения луч НЕ влетит в полупрозрачную пластину
V(1216) = Vs1(16): VX21(12) = V(1216) * Cos(An(16)): VY21(12) = V(1216) * Sin(An(16)): Tn1(iii) = T: iii = 1216
1215: End If

If iii = 1216 Then  '                                 участок пути 16 в пластине вправо до зеркальной поверхности и преломление
Call DX_DY_Dopler(X21(12), Y21(12), X(3), Y(3), Alfa3)
V12 = V(1216) * Cos(An(16) - Alfa3 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1216  '            если за шаг решения луч НЕ вылетит из полупрозрачной пластины
V(1218) = Vs1(18): VX21(12) = V(1218) * Cos(An(18)): VY21(12) = V(1218) * Sin(An(18)): Tn1(iii) = T: iii = 1218 '  iii = 1217 нет
1216: End If

If iii = 1218 Then  '                                 участок пути 18 от полупрозрачного зеркала до экрана
V12 = V(1218) * Cos(An(18)) '                         это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '                   это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = X(6) - X21(12)
If (V12 + V21) * P0 < R0 Then GoTo 1218  '            если за шаг решения луч НЕ перелетит за экран
Tn1(iii) = T: iii = 1219: Xk1(1) = X21(12): Yk1(1) = Y21(12) '
1218: End If



'                    /////////////////      продолжение ПУТИ правого края 1-го ФРОНТА 2-го ЛУЧА (после раздвоения)   /////////////////
'If jjj = 1221 Then  '                       этого участка нет, т.к. он пройден общим лучом при ii=11

If jjj = 1222 Then  '                           участок пути 22 от полупрозрачного зеркала вверх до прозрачной пластины и преломление
Call DX_DY_Dopler(X21(22), Y21(22), X(40), Y(40), Alfa4)
V12 = V(1122) * Cos(An(22) - Alfa4 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине
V21 = VXiso3 * Cos(AlfaISO - Alfa4 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1222 '             если за шаг решения луч НЕ влетит в полупрозрачную пластину
V(1223) = Vs2(23): VX21(22) = V(1223) * Cos(An(23)): VY21(22) = V(1223) * Sin(An(23)): Tn2(jjj) = T: jjj = 1223
1222: End If

If jjj = 1223 Then  '                          участок пути 23 внутри прозрачной пластины и преломление
Call DX_DY_Dopler(X21(22), Y21(22), X(4), Y(4), Alfa4)
V12 = V(1223) * Cos(An(23) - Alfa4 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине
V21 = VXiso3 * Cos(AlfaISO - Alfa4 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1223  '            если за шаг решения луч НЕ вылетит из прозрачной пластины
V(1224) = Vs2(24): VX21(22) = V(1224) * Cos(An(24)): VY21(22) = V(1224) * Sin(An(24)): Tn2(jjj) = T: jjj = 1224
1223: End If

If jjj = 1224 Then  '                         участок пути 24 от прозрачной пластины вверх до зеркала и отражение
Call DX_DY_Dopler(X21(22), Y21(22), X(2), Y(2), Alfa2)
V12 = V(1224) * Cos(An(24) - Alfa2 - pi / 2) '        это скорость луча в АСО вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa2 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1224 '             если за шаг решения луч НЕ перелетит за зеркало
V(1225) = Vs2(25): VX21(22) = V(1225) * Cos(An(25)): VY21(22) = V(1225) * Sin(An(25)): Tn2(jjj) = T: jjj = 1225
1224: End If

If jjj = 1225 Then  '                        участок пути 25 от зеркала вниз до прозрачной пластины и преломление
Call DX_DY_Dopler(X21(22), Y21(22), X(4), Y(4), Alfa4)
V12 = V(1225) * Cos(An(25) - Alfa4 - pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1225 '           если за шаг решения луч НЕ влетит в пластину
V(1226) = Vs2(26): VX21(22) = V(1226) * Cos(An(26)): VY21(22) = V(1226) * Sin(An(26)): Tn2(jjj) = T: jjj = 1226
1225: End If

If jjj = 1226 Then  '                        участок пути 26 внутри прозрачной пластины вниз и преломление
Call DX_DY_Dopler(X21(22), Y21(22), X(40), Y(40), Alfa4)
V12 = V(1226) * Cos(An(26) - Alfa4 - pi / 2) '       это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '       это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1226 '            если за шаг решения луч НЕ вылетит из пластины
V(1227) = Vs2(27): VX21(22) = V(1227) * Cos(An(27)): VY21(22) = V(1227) * Sin(An(27)): Tn2(jjj) = T: jjj = 1227
1226: End If

If jjj = 1227 Then  '                       участок пути 27 от прозрачной пластины вниз до полупрозрачного зеркала и отражение
Call DX_DY_Dopler(X21(22), Y21(22), X(3), Y(3), Alfa3)
V12 = V(1227) * Cos(An(27) - Alfa3 - pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 + pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1227  '          если за шаг решения луч НЕ перелетит за полупрозрачное зеркало
V(1228) = Vs2(28): VX21(22) = V(1228) * Cos(An(28)): VY21(22) = V(1228) * Sin(An(28)): Tn2(jjj) = T: jjj = 1228
1227: End If

If jjj = 1228 Then  '                      участок пути 28 от полупрозрачного зеркала до экрана (объектива)
V12 = V(1228) * Cos(An(28)) '                     это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '               это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = X(6) - X21(22)
If (V12 + V21) * P0 < R0 Then GoTo 1228  '        если за шаг решения луч НЕ перелетит за экран
Tn2(jjj) = T: jjj = 1229: Xk1(2) = X21(22): Yk1(2) = Y21(22)
1228: End If



'                          /////////////////                   2-ой фронт                /////////////////////

If kodVY(20) = 0 Then GoTo 70 '                    если не началось движение 2-го фронта

'              /////////////////                  ОБЩИЙ ПУТЬ ЛЕВОГО КРАЯ 2-го фронта ДВУХ ЛУЧЕЙ                /////////////////////

If kk = 2110 Then  '              ////общий участок пути до прозрачной поверхности пластины полупрозрачного зеркала
Call DX_DY_Dopler(X22(11), Y22(11), X(30), Y(30), Alfa3) ' находим расстояние от луча до пластины
V12 = V(10) * Cos(An(10) - Alfa3 + pi / 2) '               это скорость луча в АСО вдоль нормали к плоскости стеклянной пластины
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '             это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2110 '
V(2111) = Vs1(11): V(2121) = V(2111) ' скорости левых концов фронтов 2-х лучей 1-го фронта зависящие от оптической плотности среды
VX22(11) = V(2111) * Cos(An(11)): VY22(11) = V(2111) * Sin(An(11)): VX22(21) = VX22(11): VY22(21) = VY22(11)
Tk1(kk) = T: Tk2(kk + 10) = T: kk = 2111 '              pp = 2121 не задаем, т.к. и на этом участке два луча полетят как один луч
2110: End If 'ii = 2110'                                2-ой луч тоже прошел этот этап, т.к. два луча летят тут как один

If kk = 2111 Then  '                                 ////общий участок пути в пластине до полупрозрачного поверхности
Call DX_DY_Dopler(X22(11), Y22(11), X(3), Y(3), Alfa3)
V12 = V(2111) * Cos(An(11) - Alfa3 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластины
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2111 '
'                                                         1-ый луч отражается от полупрозрачного зеркала
V(2113) = Vs1(13): VX22(11) = V(2113) * Cos(An(13)): VY22(11) = V(2113) * Sin(An(13)): Tk1(kk) = T: kk = 2113: '   ii = 2112 нет
'                                                         2-ой луч переходит в менее плотную среду
V(2122) = Vs2(22): VX22(21) = V(2122) * Cos(An(22)): VY22(21) = V(2122) * Sin(An(22)): Tk2(2121) = T: pp = 2122
2111: End If 'ii = 2111 '                                 2-ой луч тоже прошел этот этап, т.к. два луча летят тут как один


'                         /////////////////           продолжение ПУТИ ЛЕВОГО КРАЯ 2-го фронта 1-го ЛУЧА            /////////////////////
If kk = 2113 Then  '                                 участок пути 13 в пластине влево до выхода из нее
Call DX_DY_Dopler(X22(11), Y22(11), X(30), Y(30), Alfa3)
V12 = V(2113) * Cos(An(13) - Alfa3 - pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 + pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2113 '           если за шаг решения луч НЕ вылетит из пластины
V(2114) = Vs1(14): VX22(11) = V(2114) * Cos(An(14)): VY22(11) = V(2114) * Sin(An(14)): Tk1(kk) = T: kk = 2114
2113: End If

If kk = 2114 Then  '                                 участок пути 14 до левого зеркала и отражение
Call DX_DY_Dopler(X22(11), Y22(11), X(1), Y(1), Alfa1)
V12 = V(2114) * Cos(An(14) - Alfa1 - pi / 2) '        это скорость луча в АСО вдоль нормали к левому зеркалу при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - Alfa1 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2114  '            если за шаг решения луч НЕ достигнет зеркала
V(2115) = Vs1(15): VX22(11) = V(2115) * Cos(An(15)): VY22(11) = V(2115) * Sin(An(15)): Tk1(kk) = T: kk = 2115
2114: End If '

If kk = 2115 Then  '                                  участок пути 15 от левого зеркала до полупрозрачной пластины и преломление
Call DX_DY_Dopler(X22(11), Y22(11), X(30), Y(30), Alfa3)
V12 = V(2115) * Cos(An(15) - Alfa3 + pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2115 '           если за шаг решения луч НЕ влетит в полупрозрачную пластину
V(2116) = Vs1(16): VX22(11) = V(2116) * Cos(An(16)): VY22(11) = V(2116) * Sin(An(16)): Tk1(kk) = T: kk = 2116
2115: End If

If kk = 2116 Then  '                                  участок пути 16 в пластине вправо до полупрозрачной поверхности и преломление
Call DX_DY_Dopler(X22(11), Y22(11), X(3), Y(3), Alfa3)
V12 = V(2116) * Cos(An(16) - Alfa3 + pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2116  '          если за шаг решения луч НЕ вылетит из полупрозрачной пластины
V(2118) = Vs1(18): VX22(11) = V(2118) * Cos(An(18)): VY22(11) = V(2118) * Sin(An(18)): Tk1(kk) = T: kk = 2118 '   kk = 2117 нет
2116: End If

If kk = 2118 Then  '                                    участок пути 18 от полупрозрачного зеркала до экрана
V12 = V(2118) * Cos(An(18)) '                         это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '                   это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = X(6) - X22(11)
If (V12 + V21) * P0 < R0 Then GoTo 2118  '            если за шаг решения луч НЕ перелетит за экран
Tk1(kk) = T: kk = 2119: Xn2(1) = X22(11): Yn2(1) = Y22(11) '
2118: End If


'               /////////////////    продолжение ПУТИ левого края 2-го ФРОНТА 2-го ЛУЧА (после раздвоения)     /////////////////////
'If pp = 2121 Then  '                       этого участка нет, т.к. он пройден общим лучом при kk=2111

If pp = 2122 Then  '                            участок пути 22 от полупрозрачного зеркала вверх до прозрачной пластины и преломление
Call DX_DY_Dopler(X22(21), Y22(21), X(40), Y(40), Alfa4)
V12 = V(2122) * Cos(An(22) - Alfa4 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине
V21 = VXiso3 * Cos(AlfaISO - Alfa4 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2122  '            если за шаг решения луч НЕ влетит в прозрачную пластину
V(2123) = Vs2(23): VX22(21) = V(2123) * Cos(An(23)): VY22(21) = V(2123) * Sin(An(23)): Tk2(pp) = T: pp = 2123
2122: End If

If pp = 2123 Then  '                             участок пути 23 внутри прозрачной пластины и преломление
Call DX_DY_Dopler(X22(21), Y22(21), X(4), Y(4), Alfa4)
V12 = V(2123) * Cos(An(23) - Alfa4 + pi / 2) '       это скорость луча в АСО вдоль нормали к стеклянной пластине
V21 = VXiso3 * Cos(AlfaISO - Alfa4 - pi / 2) '       это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2123 '            если за шаг решения луч НЕ вылетит из прозрачной пластины
V(2124) = Vs2(24): VX22(21) = V(2124) * Cos(An(24)): VY22(21) = V(2124) * Sin(An(24)): Tk2(pp) = T: pp = 2124
2123: End If

If pp = 2124 Then  '                             участок пути 24 от прозрачной пластины вверх до зеркала и отражение
Call DX_DY_Dopler(X22(21), Y22(21), X(2), Y(2), Alfa2)
V12 = V(2124) * Cos(An(24) - Alfa2 - pi / 2) '        это скорость луча в АСО вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa2 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2124 '             если за шаг решения луч НЕ перелетит за зеркало
V(2125) = Vs2(25): VX22(21) = V(2125) * Cos(An(25)): VY22(21) = V(2125) * Sin(An(25)): Tk2(pp) = T: pp = 2125
2124: End If

If pp = 2125 Then  '                             участок пути 25 от зеркала вниз до прозрачной пластины и преломление
Call DX_DY_Dopler(X22(21), Y22(21), X(4), Y(4), Alfa4)
V12 = V(2125) * Cos(An(25) - Alfa4 - pi / 2) '     это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2125 '          если за шаг решения луч НЕ влетит в пластину
V(2126) = Vs2(26): VX22(21) = V(2126) * Cos(An(26)): VY22(21) = V(2126) * Sin(An(26)): Tk2(pp) = T: pp = 2126
2125: End If

If pp = 2126 Then  '                             участок пути 26 внутри прозрачной пластины вниз и преломление
Call DX_DY_Dopler(X22(21), Y22(21), X(40), Y(40), Alfa4)
V12 = V(2126) * Cos(An(26) - Alfa4 - pi / 2) '     это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2126 '          если за шаг решения луч НЕ вылетит из пластины
V(2127) = Vs2(27): VX22(21) = V(2127) * Cos(An(27)): VY22(21) = V(2127) * Sin(An(27)): Tk2(pp) = T: pp = 2127
2126: End If

If pp = 2127 Then  '                             участок пути 27 от прозрачной пластины вниз до полупрозрачного зеркала и отражение
Call DX_DY_Dopler(X22(21), Y22(21), X(3), Y(3), Alfa3)
V12 = V(2127) * Cos(An(27) - Alfa3 - pi / 2) '      это скорость луча в АСО вдоль нормали к полупрозрачной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 + pi / 2) '      это скорость установки в АСО вдоль нормали к полупрозрачной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2127  '          если за шага решения луч НЕ перелетит за пластину
V(2128) = Vs2(28): VX22(21) = V(2128) * Cos(An(28)): VY22(21) = V(2128) * Sin(An(28)): Tk2(pp) = T: pp = 2128
2127: End If

If pp = 2128 Then  '                             участок пути 28 от полупрозрачного зеркала до экрана (объектива)
V12 = V(2128) * Cos(An(28)) '                    это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '              это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = X(6) - X22(21)
If (V12 + V21) * P0 < R0 Then GoTo 2128  '       если за шаг решения луч НЕ перелетит за экран
Tk2(pp) = T: pp = 2129: Xn2(2) = X22(21): Yn2(2) = Y22(21)
2128: End If



'                        /////////////////       ОБЩИЙ ПУТЬ ПРАВОГО КРАЯ 2-го фронта ДВУХ ЛУЧЕЙ      /////////////////////

If kkk = 2210 Then  '              ////общий участок пути до прозрачной поверхности пластины полупрозрачного зеркала
Call DX_DY_Dopler(X22(12), Y22(12), X(30), Y(30), Alfa3) ' находим расстояние от луча до пластины
V12 = V(10) * Cos(An(10) - Alfa3 + pi / 2) '          это скорость луча в АСО вдоль нормали к плоскости стеклянной пластины
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2210 '
V(2211) = Vs1(11): V(2221) = V(2211) '                скорости правых краев фронтов 2-х лучей 2-го фронта
VX22(12) = V(1211) * Cos(An(11)): VY22(12) = V(1211) * Sin(An(11)): VX22(22) = VX22(12): VY22(22) = VY22(12)
Tk1(kkk) = T: Tk2(kkk + 10) = T: kkk = 2211 '         ppp = 2221 не задаем, т.к. и на этом участке два луча полетят как один луч
2210: End If 'iii = 1210'                             2-ой луч тоже прошел этот этап, т.к. два луча летят как один

If kkk = 2211 Then  '                                 ////общий участок пути в пластине до полупрозрачной поверхности
Call DX_DY_Dopler(X22(12), Y22(12), X(3), Y(3), Alfa3)
V12 = V(2211) * Cos(An(11) - Alfa3 + pi / 2) '     это скорость луча в АСО вдоль нормали к стеклянной пластины
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2211 '
V(2213) = Vs1(13) '                                                         1-ый луч отражается от полупрозрачного зеркала
VX22(12) = V(2213) * Cos(An(13)): VY22(12) = V(2213) * Sin(An(13)): Tk1(kkk) = T: kkk = 2213 '   kkk = 2212 нет
V(2222) = Vs2(22) '                                                         2-ой луч переходит в менее плотную среду
VX22(22) = V(2222) * Cos(An(22)): VY22(22) = V(2222) * Sin(An(22)): Tk2(2221) = T: ppp = 2222
2211: End If '                                            2-ой луч тоже прошел этот этап, т.к. два луча летят как один


'                        /////////////////                  ПУТЬ ПРАВОГО КРАЯ 2-го фронта 1-го ЛУЧА                   /////////////////////
If kkk = 2213 Then  '                                  участок пути 13 в пластине влево до выхода из нее
Call DX_DY_Dopler(X22(12), Y22(12), X(30), Y(30), Alfa3)
V12 = V(2213) * Cos(An(13) - Alfa3 - pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 + pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2213 '           если за шаг решения луч НЕ вылетит из пластины
V(2214) = Vs1(14): VX22(12) = V(2214) * Cos(An(14)): VY22(12) = V(2214) * Sin(An(14)): Tk1(kkk) = T: kkk = 2214
2213: End If

If kkk = 2214 Then  '                                  участок пути 14 до левого зеркала и отражение
Call DX_DY_Dopler(X22(12), Y22(12), X(1), Y(1), Alfa1)
V12 = V(2214) * Cos(An(14) - Alfa1 - pi / 2) '     это скорость луча в АСО вдоль нормали к левому зеркалу при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - Alfa1 + pi / 2) '     это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2214 '          если за шаг решения луч НЕ достигнет зеркала
V(2215) = Vs1(15): VX22(12) = V(2215) * Cos(An(15)): VY22(12) = V(2215) * Sin(An(15)): Tk1(kkk) = T: kkk = 2215
2214: End If '

If kkk = 2215 Then  '                                  участок пути 15 от левого зеркала до пластины и преломление
Call DX_DY_Dopler(X22(12), Y22(12), X(30), Y(30), Alfa3)
V12 = V(2215) * Cos(An(15) - Alfa3 + pi / 2) '     это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '     это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2215 '          если за шаг решения луч НЕ влетит в полупрозрачную пластину
V(2216) = Vs1(16): VX22(12) = V(2216) * Cos(An(16)): VY22(12) = V(2216) * Sin(An(16)): Tk1(kkk) = T: kkk = 2216
2215: End If

If kkk = 2216 Then  '                                  участок пути 16 в пластине вправо до полупрозрачной поверхности и преломление
Call DX_DY_Dopler(X22(12), Y22(12), X(3), Y(3), Alfa3)
V12 = V(2216) * Cos(An(16) - Alfa3 + pi / 2) '     это скорость луча в АСО вдоль нормали к пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 - pi / 2) '     это скорость установки в АСО вдоль нормали к пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2216 '          если за шаг решения луч НЕ вылетит из полупрозрачнуй пластины
V(2218) = Vs1(18): VX22(12) = V(2218) * Cos(An(18)): VY22(12) = V(2218) * Sin(An(18)): Tk1(kkk) = T: kkk = 2218 '  kkk = 1217 нет
2216: End If

If kkk = 2218 Then  '                                  участок пути 18 от полупрозрачного зеркала до экрана
V12 = V(2218) * Cos(An(18)) '                     это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '               это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = X(6) - X22(12)
If (V12 + V21) * P0 < R0 Then GoTo 2218 '         если за шаг решения луч НЕ перелетит за экран
Tk1(kkk) = T: kkk = 2219: Xk2(1) = X22(12): Yk2(1) = Y22(12) '
2218: End If



'              /////////////////      продолжение ПУТИ правой стотоны 2-го ФРОНТА 2-го ЛУЧА (после раздвоения)     ////////////////
'If ppp = 2221 Then  '                       этого участка нет, т.к. он пройден общим лучом при ii=11

If ppp = 2222 Then  '                        участок пути 22 от полупрозрачного зеркала вверх до прозрачной пластины и преломление
Call DX_DY_Dopler(X22(22), Y22(22), X(40), Y(40), Alfa4)
V12 = V(2122) * Cos(An(22) - Alfa4 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине
V21 = VXiso3 * Cos(AlfaISO - Alfa4 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2222 '             если за шаг решения луч НЕ влетит в прозрачную пластину
V(2223) = Vs2(23): VX22(22) = V(2223) * Cos(An(23)): VY22(22) = V(2223) * Sin(An(23)): Tk2(ppp) = T: ppp = 2223
2222: End If

If ppp = 2223 Then  '                                 участок пути 23 внутри прозрачной пластины и преломление
Call DX_DY_Dopler(X22(22), Y22(22), X(4), Y(4), Alfa4)
V12 = V(2223) * Cos(An(23) - Alfa4 + pi / 2) '        это скорость луча в АСО вдоль нормали к стеклянной пластине
V21 = VXiso3 * Cos(AlfaISO - Alfa4 - pi / 2) '        это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2223  '            если за шаг решения луч НЕ вылетит из прозрачной пластины
V(2224) = Vs2(24): VX22(22) = V(2224) * Cos(An(24)): VY22(22) = V(2224) * Sin(An(24)): Tk2(ppp) = T: ppp = 2224
2223: End If

If ppp = 2224 Then  '                                 участок пути 24 от прозрачной пластины вверх до зеркала и отражение
Call DX_DY_Dopler(X22(22), Y22(22), X(2), Y(2), Alfa2)
V12 = V(2224) * Cos(An(24) - Alfa2 - pi / 2) '        это скорость луча в АСО вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa2 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2224  '            если за шаг решения луч НЕ перелетит за зеркало
V(2225) = Vs2(25): VX22(22) = V(2225) * Cos(An(25)): VY22(22) = V(2225) * Sin(An(25)): Tk2(ppp) = T: ppp = 2225
2224: End If

If ppp = 2225 Then  '                                 участок пути 25 от зеркала вниз до прозрачной пластины и преломление
Call DX_DY_Dopler(X22(22), Y22(22), X(4), Y(4), Alfa4)
V12 = V(1225) * Cos(An(25) - Alfa4 - pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2225  '          если за шаг решения луч НЕ влетит в пластину
V(2226) = Vs2(26): VX22(22) = V(2226) * Cos(An(26)): VY22(22) = V(2226) * Sin(An(26)): Tk2(ppp) = T: ppp = 2226
2225: End If

If ppp = 2226 Then  '                                  участок пути 26 внутри прозрачной пластины вниз и преломление
Call DX_DY_Dopler(X22(22), Y22(22), X(40), Y(40), Alfa4)
V12 = V(2226) * Cos(An(26) - Alfa4 - pi / 2) '       это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '       это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2226 '            если за шаг решения луч НЕ вылетит из пластины
V(2227) = Vs2(27): VX22(22) = V(2227) * Cos(An(27)): VY22(22) = V(2227) * Sin(An(27)): Tk2(ppp) = T: ppp = 2227
2226: End If

If ppp = 2227 Then  '                              участок пути 27 от прозрачной пластины вниз до полупрозрачного зеркала и отражение
Call DX_DY_Dopler(X22(22), Y22(22), X(3), Y(3), Alfa3)
V12 = V(2227) * Cos(An(27) - Alfa3 - pi / 2) '      это скорость луча в АСО вдоль нормали к стеклянной пластине при приближении к ней
V21 = VXiso3 * Cos(AlfaISO - Alfa3 + pi / 2) '      это скорость установки в АСО вдоль нормали к стеклянной пластине навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2227 '           если за шаг решения луч НЕ перелетит за полупрозрачную поверхность пластины
V(2228) = Vs2(28): VX22(22) = V(2228) * Cos(An(28)): VY22(22) = V(2228) * Sin(An(28)): Tk2(ppp) = T: ppp = 2228
2227: End If

If ppp = 2228 Then  '                              участок пути 28 от полупрозрачного зеркала до экрана (объектива)
V12 = V(2228) * Cos(An(28)) '                      это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '                это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = X(6) - X22(22)
If (V12 + V21) * P0 < R0 Then GoTo 2228 '          если за шаг решения луч НЕ перелетит за экран
Tk2(ppp) = T: ppp = 2229: Xk2(2) = X22(22): Yk2(2) = Y22(22)
2228: End If


If ii = 1119 And jj = 1129 Then '        если левые края фронов двух лучей 1-го фронта (после его раздвоения) достигли экрана
If iii = 1219 And jjj = 1229 Then '     если правые края фронов двух лучей 1-го фронта (после его раздвоения) достигли экрана
If kk = 2119 And pp = 2129 Then '        если левые края фронов двух лучей 2-го фронта (после его раздвоения) достигли экрана
If kkk = 2219 And ppp = 2229 Then '     если правые края фронов двух лучей 2-го фронта (после его раздвоения) достигли экрана
'(Tn1(ii)+Tn1(iii))/2     - время в конце прохождения 1-м лучом 1-го фронта своих этапов пути 10... 18
'(Tn2(jj)+Tn2(jjj))/2     - время в конце прохождения 2-м лучом 1-го фронта своих этапов пути 20... 28
'(Tk1(kk)+Tk1(kkk))/2     - время в конце прохождения 1-м лучом 2-го фронта своих этапов пути 10... 18
'(Tk2(pp)+Tk2(ppp))/2     - время в конце прохождения 2-м лучом 2-го фронта своих этапов пути 20... 28
'Tn1(1110) и Tn1(1210) - время в конце прохождения участка №10 левым и правым краями фронта 1-го луча 1-го фронта волны
'Tn2(1120) и Tn2(1220) - время в конце прохождения участка №20 левым и правым краями фронта 2-го луча 1-го фронта волны
'Tk1(2110) и Tk1(2210) - время в конце прохождения участка №10 левым и правым краями фронта 1-го луча 2-го фронта волны
'Tk2(2120) и Tk2(2220) - время в конце прохождения участка №20 левым и правым краями фронта 2-го луча 2-го фронта волны

For i = 10 To 28
Tk1(i) = 0: Tn1(i) = 0: Tk2(i) = 0: Tn2(i) = 0
Next i '

For i = 0 To 8
Tn1(i + 10) = (Tn1(i + 1110) + Tn1(i + 1210)) / 2: Tn2(i + 20) = (Tn2(i + 1120) + Tn2(i + 1220)) / 2
 '                                                время после прохождения i-го участка пути центрами 1-го и 2-го лучей 1-го фронта волны
Tk1(i + 10) = (Tk1(i + 2110) + Tk1(i + 2210)) / 2: Tk2(i + 20) = (Tk2(i + 2120) + Tk2(i + 2220)) / 2
Next i '                                          время после прохождения i-го участка пути центрами 1-го и 2-го лучей 2-го фронта волны
For i = 10 To 18
v1(i) = 0
If Tk1(i) <> 0 And Tn1(i) <> 0 Then v1(i) = N0 / (Tk1(i) - Tn1(i)) ' частота света в 1-м луче после прохождения i-го участка пути,
Next i '                                                             т.е принятая поверхностью в конце этого пути
For i = 20 To 28
v1(i) = 0
If Tk2(i) <> 0 And Tn2(i) <> 0 Then v1(i) = N0 / (Tk2(i) - Tn2(i)) ' частота света во 2-м луче после прохождения i-го участка пути,
Next i '                                                             т.е принятая поверхностью в конце этого пути

Y(8) = 4.5: Y(9) = 11.5 '                                              выводим отчет по времени
b = 1000: If Option7.Value = True Then b = MK
Info = "среднее время касания обоими краями фронта волны поверхностей в конце этих участков пути "
Picture1.CurrentX = -12.5: Picture1.CurrentY = 6.5: Picture1.Print Info
Info = "увеличенное в " & b & "  раз"
Picture1.CurrentX = -2.5: Picture1.CurrentY = 5.8: Picture1.Print Info
Info = "            1-ый фронт волн двух лучей                                                        2-ой фронт волн двух лучей"
Picture1.CurrentX = -12: Picture1.CurrentY = 5.1: Picture1.Print Info
For i = 10 To 18
Info = "i=   " & i & "    Tn1=   " & Format(b * Tn1(i), "0.000000000") & "   Tn2=   " & Format(b * Tn2(i + 10), "0.000000000") _
& "              Tk1=   " & Format(b * Tk1(i), "0.000000000") & "   Tk2=   " & Format(b * Tk2(i + 10), "0.000000000")
Picture1.CurrentX = -12: Picture1.CurrentY = Y(9) - 4 * i / 5: Picture1.Print Info
Next i
Y(8) = 16: Y(9) = 23 '                                                 координаты для вывода результатов по частоте

Info = "частота света после прохождения i-х путей, т.е. принятая поверхностью зеркала (стекла или экрана)"
Picture1.CurrentX = -12.5: Picture1.CurrentY = Y(8): Picture1.Print Info
For i = 10 To 18
Info = "i=   " & i - 10 & "    v(" & i & ")/v0=   " & Format(v1(i) / v0, "0.000000000") & _
"                         v(" & i + 10 & ")/v0=   " & Format(v1(i + 10) / v0, "0.000000000")
Picture1.CurrentX = -12: Picture1.CurrentY = Y(9) - 4 * i / 5: Picture1.Print Info
Next i

If Check6.Value = 1 Then '                                                  если показать координаты фронтов в ИСО экрана
Xn1(1) = Xn1(1) - VXiso * Tn1(1118): Yn1(1) = Yn1(1) - VYiso * Tn1(1118)  '   левый край 1-го фронта 1-го луча
Xk1(1) = Xk1(1) - VXiso * Tn1(1218): Yk1(1) = Yk1(1) - VYiso * Tn1(1218) '   правый край 1-го фронта 1-го луча
Xn2(1) = Xn2(1) - VXiso * Tk1(2118): Yn2(1) = Yn2(1) - VYiso * Tk1(2118)  '   левый край 2-го фронта 1-го луча
Xk2(1) = Xk2(1) - VXiso * Tk1(2218): Yk2(1) = Yk2(1) - VYiso * Tk1(2218)  '  правый край 2-го фронта 1-го луча

Xn1(2) = Xn1(2) - VXiso * Tn2(1128): Yn1(2) = Yn1(2) - VYiso * Tn2(1128) '    левый край 1-го фронта 2-го луча
Xk1(2) = Xk1(2) - VXiso * Tn2(1228): Yk1(2) = Yk1(2) - VYiso * Tn2(1228) '   правый край 1-го фронта 2-го луча
Xn2(2) = Xn2(2) - VXiso * Tk2(2128): Yn2(2) = Yn2(2) - VYiso * Tk2(2128) '    левый край 2-го фронта 2-го луча
Xk2(2) = Xk2(2) - VXiso * Tk2(2228): Yk2(2) = Yk2(2) - VYiso * Tk2(2228) '   правый край 2-го фронта 2-го луча
End If

NC = NC0: kodEnd = 1
Text71.Text = v1(18) / v0: Text73.Text = (Yn1(1) + Yk1(1)) / 2: Text74.Text = (Yn2(1) + Yk2(1)) / 2
Text72.Text = v1(28) / v0: Text75.Text = (Yn1(2) + Yk1(2)) / 2: Text76.Text = (Yn2(2) + Yk2(2)) / 2
End If 'kkk = 2219 And ppp = 2229
End If
End If
End If

70:
If NC >= NC0 Then '                             если пора выводить текущие данные на экран
NC = 0: Text17.Text = T
If Check11.Value = 1 Then Shema1 '                              если включена анимация
'                                                               первый фронт волны
If Check14.Value = 1 Then
Picture1.Line (Xold(1, 11) / ML, Yold(1, 11) / ML)-(Xold(1, 12) / ML, Yold(1, 12) / ML), RGB(255, 255, 255)
Picture1.Line (X21(11) / ML, Y21(11) / ML)-(X21(12) / ML, Y21(12) / ML), RGB(255, 0, 0)
Xold(1, 11) = X21(11): Yold(1, 11) = Y21(11): Xold(1, 12) = X21(12): Yold(1, 12) = Y21(12)
End If
If Check15.Value = 1 Then
Picture1.Line (Xold(1, 21) / ML, Yold(1, 21) / ML)-(Xold(1, 22) / ML, Yold(1, 22) / ML), RGB(255, 255, 255)
Picture1.Line (X21(21) / ML, Y21(21) / ML)-(X21(22) / ML, Y21(22) / ML), RGB(0, 0, 255)
Xold(1, 21) = X21(21): Yold(1, 21) = Y21(21): Xold(1, 22) = X21(22): Yold(1, 22) = Y21(22)
End If
Picture1.Circle (X21(11) / ML, Y21(11) / ML), 0.05, RGB(255, 0, 0)
Picture1.Circle (X21(12) / ML, Y21(12) / ML), 0.05, RGB(255, 0, 0)
Picture1.Circle (X21(21) / ML, Y21(21) / ML), 0.05, RGB(0, 0, 255)
Picture1.Circle (X21(22) / ML, Y21(22) / ML), 0.05, RGB(0, 0, 255)
If kodVY(20) = 1 Then '                                           второй фронт волны
If Check14.Value = 1 Then
Picture1.Line (Xold(2, 11) / ML, Yold(2, 11) / ML)-(Xold(2, 12) / ML, Yold(2, 12) / ML), RGB(255, 255, 255)
Picture1.Line (X22(11) / ML, Y22(11) / ML)-(X22(12) / ML, Y22(12) / ML), RGB(255, 0, 0)
Xold(2, 11) = X22(11): Yold(2, 11) = Y22(11): Xold(2, 12) = X22(12): Yold(2, 12) = Y22(12)
End If
If Check15.Value = 1 Then
Picture1.Line (Xold(2, 21) / ML, Yold(2, 21) / ML)-(Xold(2, 22) / ML, Yold(2, 22) / ML), RGB(255, 255, 255)
Picture1.Line (X22(21) / ML, Y22(21) / ML)-(X22(22) / ML, Y22(22) / ML), RGB(0, 0, 255)
Xold(2, 21) = X22(21): Yold(2, 21) = Y22(21): Xold(2, 22) = X22(22): Yold(2, 22) = Y22(22)
End If
Picture1.Circle (X22(11) / ML, Y22(11) / ML), 0.05, RGB(255, 0, 0)
Picture1.Circle (X22(12) / ML, Y22(12) / ML), 0.05, RGB(255, 0, 0)
Picture1.Circle (X22(21) / ML, Y22(21) / ML), 0.05, RGB(0, 0, 255)
Picture1.Circle (X22(22) / ML, Y22(22) / ML), 0.05, RGB(0, 0, 255)
End If 'kodVY(20) = 1
If kodEnd = 1 Then GoTo 90
End If ' NC = NC0

Do While DoEvents() ' идем на 1, после обработки сообщений в очереди
GoTo 1 '             операционной системы, а если будет сообщение от кнопки <Остановить>,
Loop '                то kodEnd будет равен 1 и на следующем шаге будет уже GoTo 90
80: MsgBox "Ошибка решения", , "Maikelson"
90: End Sub










Private Sub Yudin_Dopler() '             вычислительный эксперимент по полному эффекту Доплера на установке Юдина
On Error GoTo 80 '                           после сообщения об ошибке отчет все равно будет выведен
Picture1.Line (X(114) / ML, Y(114) / ML + 5)-(X(114) / ML, Y(114) / ML - 5), RGB(0, 0, 255) ' приемник на пути 1-го луча от призмы до зеркала
Picture1.Line (X(124) / ML, Y(124) / ML + 5)-(X(124) / ML, Y(124) / ML - 5), RGB(0, 0, 255) ' приемник на пути 2-го луча от призмы до зеркала
Picture1.Line (X(118) / ML - 5, Y(118) / ML)-(X(118) / ML + 5, Y(118) / ML), RGB(0, 0, 255) ' приемник на пути 1-го луча от зеркала до экрана
Picture1.Line (X(128) / ML - 5, Y(128) / ML)-(X(128) / ML + 5, Y(128) / ML), RGB(0, 0, 255) ' приемник на пути 2-го луча от зеркала до экрана

1:
If Check23.Value = 0 Then GoTo 6 ' если отмечен чекбокс перепрыгнуть Skip, то на пути к экрану будут участки пути пройденные с основным шагом решения
P0 = P00 / kP0 '                                               22/11/21
If Y22(11) < Y(1) + 2 * DV Or Y22(12) < Y(1) + 2 * DV Then GoTo 4 '  если левый или правый края 2-го фронта 1-го луча не выше левого зеркала
If Y22(21) < Y(2) + 2 * DV Or Y22(22) < Y(2) + 2 * DV Then GoTo 4 '  если левый или правый края 2-го фронта 2-го луча не выше правого зеркала
If Y21(11) < Y(118) - 1 * DV And Y21(12) < Y(118) - 1 * DV Then '  если левый и правый края 1-го фронта 1-го луча ниже фиктивного приемника
If Y21(21) < Y(128) - 1 * DV And Y21(22) < Y(128) - 1 * DV Then '  если левый и правый края 1-го фронта 2-го луча ниже фиктивного приемника
P0 = P00 '                                                       НА ЭТИХ УЧАСТКАХ ПУТЕЙ 18 И 28 МОЖНО ДВИГАТЬСЯ С ОСНОВНЫМ ШАГОМ
End If
End If
4: '                                                            09/02/22 убрал 4 из тела if if

If Y22(11) > Y(118) + 1 * DV And Y22(12) > Y(118) + 1 * DV Then '  если левый и правый края 2-го фронта 1-го луча выше фиктивного приемника
If Y22(21) > Y(128) + 1 * DV And Y22(22) > Y(128) + 1 * DV Then '  если левый и правый края 2-го фронта 2-го луча выше фиктивного приемника
If Y21(11) > Y(6) - 1 * DV Or Y21(12) > Y(6) - 1 * DV Then GoTo 5 '  если левый или правый края 1-го фронта 1-го луча близко к экрану
If Y21(21) > Y(6) - 1 * DV Or Y21(22) > Y(6) - 1 * DV Then GoTo 5 '  если левый или правый края 1-го фронта 2-го луча близко к экрану
P0 = P00
5:
End If '                                                       НА ЭТИХ УЧАСТКАХ ПУТЕЙ 18 И 28 МОЖНО ДВИГАТЬСЯ С ОСНОВНЫМ ШАГОМ
End If
6: ' надо будет приемники расположить вблизи экрана и тогда будет только по одному участку путей с основным шагом

T = T + P0: NC = NC + 1
If T >= T0 And kodVY(20) = 0 Then '                                       если пришло время движения 2-го фронта, а он еще не начал движение
kodVY(20) = 1  '                                                          если kodVY(20) = 1 это значит началось движение второго фронта волны
VX22(11) = V(10) * Cos(Betta): VY22(11) = V(10) * Sin(Betta) '                       скорости краев 2-го фронта 1-го луча
VX22(12) = V(10) * Cos(Betta): VY22(12) = V(10) * Sin(Betta) '(                      (в этом эксперименте не учитывается конусность луча)
VX22(21) = VX22(11): VX22(22) = VX22(12): VY22(21) = VY22(11): VY22(22) = VY22(12) ' они же будут и у 2-го фронта 2-го луча

If Check18.Value = 0 Then '                     ЕСЛИ ОДИН ЛАЗЕР
X22(11) = X(5) - DV * Cos(Betta - pi / 2) / 2: Y22(11) = Y(5) - DV * Sin(Betta - pi / 2) / 2 ' начальные координаты левого края 2-го фронта
X22(12) = X(5): Y22(12) = Y(5)  '                                                              1-го луча, т.к. сразу делим общий луч на два разных луча
X22(21) = X(5): Y22(21) = Y(5)   '                                                             начальные координаты левого края 2-го фронта
X22(22) = X(5) + DV * Cos(Betta - pi / 2) / 2: Y22(22) = Y(5) + DV * Sin(Betta - pi / 2) / 2 ' 2-го луча, т.к. сразу делим общий луч на два разных луча
End If 'Check18.Value = 0

If Check18.Value = 1 Then  '                    ЕСЛИ ДВА ЛАЗЕРА
X22(11) = X(5) - 3 * DV * Cos(Betta - pi / 2) / 2: Y22(11) = Y(5) - 3 * DV * Sin(Betta - pi / 2) / 2 ' начальные координаты левого и правого края
X22(12) = X(5) - DV * Cos(Betta - pi / 2) / 2:     Y22(12) = Y(5) - DV * Sin(Betta - pi / 2) / 2 '     2-го фронта 1-го луча (от 1-го лазера)
X22(21) = X(5) + DV * Cos(Betta - pi / 2) / 2:     Y22(21) = Y(5) + DV * Sin(Betta - pi / 2) / 2 '     начальные координаты левого и правого края
X22(22) = X(5) + 3 * DV * Cos(Betta - pi / 2) / 2: Y22(22) = Y(5) + 3 * DV * Sin(Betta - pi / 2) / 2 ' 2-го фронта 2-го луча (от 2-го лазера)
End If

kk = 2110: kkk = 2210 '                                    коды начальных участков пути левого и правого краев 2-го фронта волны 1-го луча
pp = 2120: ppp = 2220 '                                    коды начальных участков пути левого и правого краев 2-го фронта волны 2-го луча
If Check3.Value = 1 Then '         если левый, т.е. 1-ый, луч летит прямо (не отражаясь от треугольной призмы), а если еще отмечен
kk = 2118: kkk = 2218
If Check17.Value = 1 Then '        и чекбокс 17, то луч полетит до зеркала 4, а далее до зеркала 1, которое будет расположено тут справа
kk = 2111: kkk = 2211 '
End If
End If 'Check3.Value = 1
End If 'T >= T0 And kodVY(20) = 0

X(1) = X(1) + VXiso * P0: Y(1) = Y(1) + VYiso * P0 '    координаты центра левого зеркала
X(2) = X(2) + VXiso * P0: Y(2) = Y(2) + VYiso * P0 '    координаты центра правого зеркала
X(3) = X(3) + VXiso * P0: Y(3) = Y(3) + VYiso * P0 '    координаты передней грани треугольной призмы
X(4) = X(4) + VXiso * P0: Y(4) = Y(4) + VYiso * P0 '    координаты центра дополнительного зеркала
X(5) = X(5) + VXiso * P0: Y(5) = Y(5) + VYiso * P0 '    координаты центра источника света
X(6) = X(6) + VXiso * P0: Y(6) = Y(6) + VYiso * P0 '    координаты экрана
X(7) = X(7) + VXiso * P0: Y(7) = Y(7) + VYiso * P0 '    координаты левого торца цилиндра с воздухом (здесь пока не используется цилиндр)

X21(11) = X21(11) + VX21(11) * P0: Y21(11) = Y21(11) + VY21(11) * P0 '               координаты левого и правого концов
X21(12) = X21(12) + VX21(12) * P0: Y21(12) = Y21(12) + VY21(12) * P0 '               1-го фронта волны 1-го луча
X21(21) = X21(21) + VX21(21) * P0: Y21(21) = Y21(21) + VY21(21) * P0 '               координаты левого и правого концов
X21(22) = X21(22) + VX21(22) * P0: Y21(22) = Y21(22) + VY21(22) * P0 '               1-го фронта волны 2-го луча

X22(11) = X22(11) + VX22(11) * P0: Y22(11) = Y22(11) + VY22(11) * P0 '               координаты левого и правого концов
X22(12) = X22(12) + VX22(12) * P0: Y22(12) = Y22(12) + VY22(12) * P0 '               2-го фронта волны 1-го луча
X22(21) = X22(21) + VX22(21) * P0: Y22(21) = Y22(21) + VY22(21) * P0 '               координаты левого и правого концов
X22(22) = X22(22) + VX22(22) * P0: Y22(22) = Y22(22) + VY22(22) * P0 '               2-го фронта волны 2-го луча

'ii, jj, iii, jjj 1000 +  - первый фронт волны (вылетает в момент времени T= 0)
'kk, pp, kkk, ppp 2000 +  - второй фронт волны (вылетает в момент времени T= T0= N0/v0)
'ii, jj, kk, pp   100  +  - левый край фронта 1-го и 2-го лучей 1-го и 2-го фронта волны
'iii,jjj, kkk,ppp 200  +  - правый край фронта 1-го и 2-го лучей 1-го и 2-го фронта волны
'ii, iii, kk, kkk 10...18 - этапы пути 1-го луча (горизонтального у Майкельсона и левого у меня)
'jj, jjj, pp, ppp 20...28 - этапы пути 2-го луча (вертикального у Майкельсона и правого у меня)

'Tn1(ii), Tn1(iii)        - время прохождения левым и правым краями фронта 1-го луча 1-го фронта волны своих этапов пути
'Tn2(jj), Tn2(jjj)        - время прохождения левым и правым краями фронта 2-го луча 1-го фронта волны своих этапов пути
'Tk1(kk), Tk1(kkk)        - время прохождения левым и правым краями фронта 1-го луча 2-го фронта волны своих этапов пути
'Tk2(pp), Tk2(ppp)        - время прохождения левым и правым краями фронта 2-го луча 2-го фронта волны своих этапов пути

'(Tn1(ii)+Tn1(iii))/2     - время в конце прохождения 1-м лучом 1-го фронта волны своих этапов пути 10... 18
'(Tn2(jj)+Tn2(jjj))/2     - время в конце прохождения 2-м лучом 1-го фронта волны своих этапов пути 20... 28
'(Tk1(kk)+Tk1(kkk))/2     - время в конце прохождения 1-м лучом 2-го фронта волны своих этапов пути 10... 18
'(Tk2(pp)+Tk2(ppp))/2     - время в конце прохождения 2-м лучом 2-го фронта волны своих этапов пути 20... 28
' примеры индексации
'Tn1(3118), Tn1(3218) - время прохождения левым и правым краями 1-го фронта волны на этапе 18, т.е. 1-го луча, неподвижного в АСО приемника
'Tk1(4118), Tk1(4218) - время прохождения левым и правым краями 2-го фронта волны на этапе 18, т.е. 1-го луча, неподвижного в АСО приемника
'Tn2(3128), Tn2(3228) - время прохождения левым и правым краями 1-го фронта волны на этапе 28, т.е. 2-го луча, неподвижного в АСО приемника
'Tk2(4128), Tk2(4228) - время прохождения левым и правым краями 2-го фронта волны на этапе 28, т.е. 2-го луча, неподвижного в АСО приемника

'Tn1(118), Tk1(118) - среднее время прохождения 1-го и 2-го фронтов волны на этапе 18, т.е. 1-го луча, неподвижного в АСО приемника
'Tn2(128), Tk2(128) - среднее время прохождения 1-го и 2-го фронтов волны на этапе 28, т.е. 2-го луча, неподвижного в АСО приемника




'                          /////////////////                   1-ый фронт волны               /////////////////////

'                      /////////////////                  ПУТЬ 1-го фронта 1-го ЛУЧА                   /////////////////////

'              /////////////////                  ПУТЬ ЛЕВОГО КРАЯ 1-го фронта 1-го ЛУЧА                   /////////////////////

If ii = 1110 Then  '                                       участок пути левого края фронта 1-го луча до левой грани призмы и отражение
If kod(111) = 0 Then '                                     если левый край 1-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(10) + pi / 2 '                                 угол нормали к плоскости покоящегося приемника по ходу движения луча
'                         при kod(111) = 0 определяется время прохождения краем фронта неподвижного приемника, а затем делаем kod(111) = 1
Call DX_DY_Dopler(X21(11), Y21(11), X(110), Y(110), An(50)) '             находим расстояние от края фронта луча до неподвижного приемника
'           координаты неподвижного приемника X(110) и Y(110) на этом (и других участках пути) определены ранее при выполнении эксперимента
If Vs1(10) * P0 < R0 Then GoTo 1110 '                                     продолжаем искать момент времени, когда луч коснется приемника
Tn1(3110) = T: kod(111) = 1 ' теперь для левого края 1-го фронта 1-го луча будет определятся время прохождения им пути до левой грани призмы
End If ' kod(111) = 0
Alfa5 = (Alfa3 + pi) / 2 ' Alfa3 это угол при вершине переднего ребра призмы равный примерно 90 градусов, а Alfa5 угол наклона левой грани
An(30) = Alfa5 - pi / 2 '                                                   угол нормали к покоящейся грани призмы по ходу движения луча
'                                                        Alfa5 = (pi - Alfa3) / 2: An(30) = Alfa5 + pi / 2 ' а это будет для правой грани
Call DX_DY_Dopler(X21(11), Y21(11), X(3), Y(3), Alfa5) ' находим расстояние от луча до левой грани призмы
V12 = V(10) * Cos(An(10) - An(30)) '                     это скорость луча в АСО вдоль нормали к плоскости левой грани призмы
V21 = VXiso3 * Cos(AlfaISO - Alfa5 - pi / 2) '           это скорость установки в АСО вдоль нормали к левой грани призмы навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1110 '                если за шаг решения луч еще не долетел до грани призмы, то продолжаем его движение
kod(111) = 0: V(1114) = Vs1(14): VX21(11) = V(1114) * Cos(An(14)): VY21(11) = V(1114) * Sin(An(14)): Tn1(ii) = T: ii = 1114 '
1110: End If 'ii = 1110


If ii = 1111 Then  '                                  участок пути до зеркала, которое расположено за призмой по ходу движения луча
If kod(111) = 0 Then '                                если левый край 1-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(10) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(11), Y21(11), X(111), Y(111), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(10) * P0 < R0 Then GoTo 1111 '                         продолжаем движение фронта пока он не коснется приемника
Tn1(3111) = T: kod(111) = 1 ' теперь для левого края 1-го фронта 1-го луча будет определятся время прохождения им пути до дополнительного зеркала 4
End If ' kod(111) = 0
Call DX_DY_Dopler(X21(11), Y21(11), X(4), Y(4), Alfa4)
V12 = V(10) * Cos(Alfa4 + pi / 2 - An(10)) '           это скорость луча вдоль нормали к зеркалу, которое расположили за призмой
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '         это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1111
kod(111) = 0: V(1114) = Vs1(14): VX21(11) = V(1114) * Cos(An(14)): VY21(11) = V(1114) * Sin(An(14)): Tn1(ii) = T: ii = 1114
1111: End If 'ii = 1111


If ii = 1114 Then  '                             участок пути 14 до левого зеркала (которое как вариант может быть и справа) и отражение
If kod(111) = 0 Then '                           если левый край 1-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(14) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(11), Y21(11), X(114), Y(114), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(14) * P0 < R0 Then GoTo 1114 '                         если фронт не коснулся приемника, то продолжаем его движение
Tn1(3114) = T: kod(111) = 1 ' теперь для левого края 1-го фронта 1-го луча будет определятся время прохождения им пути до левого зеркала
End If 'kod(111) = 0
Call DX_DY_Dopler(X21(11), Y21(11), X(1), Y(1), Alfa1)
V12 = V(1114) * Cos(An(14) - Alfa1 - pi / 2) '        это скорость луча в АСО вдоль нормали к левому зеркалу при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - Alfa1 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If Check17.Value = 1 Then '            если луч летит до дополнительного зеркала 4, а далее до зеркала 1, которое будет расположено справа
V12 = V(1114) * Cos(An(14) - Alfa1 + pi / 2): V21 = VXiso3 * Cos(AlfaISO - Alfa1 - pi / 2)
End If
If (V12 + V21) * P0 < R0 Then GoTo 1114 '             если за шаг решения край фронта НЕ достигнет зеркала, то продолжаем движение
kod(111) = 0: V(1118) = Vs1(18): VX21(11) = V(1118) * Cos(An(18)): VY21(11) = V(1118) * Sin(An(18)): Tn1(ii) = T: ii = 1118
1114: End If '


If ii = 1118 Then  '                                  участок пути 18 от левого зеркала до экрана
If kod(111) = 0 Then '                                если левый край 1-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(18) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(11), Y21(11), X(118), Y(118), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(18) * P0 < R0 Then GoTo 1118 '                         если край фронта еще не достиг приемника, то продолжаем его движение
Tn1(3118) = T: kod(111) = 1 ' теперь для левого края 1-го фронта 1-го луча будет определятся время прохождения им пути до экрана
End If
R0 = Y(6) - Y21(11) '                               надо бы для корректности сделать здесь и далее Call DX_DY_Dopler
V12 = V(1118) * Cos(An(18) - pi / 2) '              это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '                 это скорость установки в АСО вдоль нормали к экрану навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1118 '           если за шаг решения луч НЕ перелетит за экран, то продолжаем его движение к экрану
Tn1(ii) = T: ii = 1119: Xn1(1) = X21(11): Yn1(1) = Y21(11) '
1118: End If

'              /////////////////                  ПУТЬ ПРАВОГО КРАЯ 1-го фронта 1-го ЛУЧА                   /////////////////////

If iii = 1210 Then  '                                 участок пути до левой грани призмы правого края 1-го фронта 1-го ЛУЧА
If kod(121) = 0 Then '                                если правый край 1-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(10) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(12), Y21(12), X(110), Y(110), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(10) * P0 < R0 Then GoTo 1210 '
Tn1(3210) = T: kod(121) = 1
End If
Alfa5 = (Alfa3 + pi) / 2 ' Alfa3 это угол при вершине переднего ребра призмы равный примерно 90 градусов, а Alfa5 угол наклона левой грани
An(30) = Alfa5 - pi / 2 '                                                   угол нормали к покоящейся грани призмы по ходу движения луча
Call DX_DY_Dopler(X21(12), Y21(12), X(3), Y(3), Alfa5) ' находим расстояние от края фронта до грани призмы
V12 = V(10) * Cos(An(10) - An(30)) '                     это скорость луча в АСО вдоль нормали к грани призмы по ходу движения луча
V21 = VXiso3 * Cos(AlfaISO - Alfa5 - pi / 2) '           это скорость установки в АСО вдоль нормали к грани призмы навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1210 '
kod(121) = 0: V(1214) = Vs1(14): VX21(12) = V(1214) * Cos(An(14)): VY21(12) = V(1214) * Sin(An(14)): Tn1(iii) = T: iii = 1214
1210: End If 'iii = 1210

If iii = 1211 Then  '                                участок пути до дополнительного зеркала, если луч пролетает мимо призмы
If kod(121) = 0 Then '                               если правый край 1-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(10) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(12), Y21(12), X(111), Y(111), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(10) * P0 < R0 Then GoTo 1211 '
Tn1(3211) = T: kod(121) = 1
End If
Call DX_DY_Dopler(X21(12), Y21(12), X(4), Y(4), Alfa4)
V12 = V(10) * Cos(Alfa4 + pi / 2 - An(10)) '           это скорость луча вдоль нормали к зеркалу, которое расположили за призмой
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '         это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1211 '
kod(121) = 0: V(1214) = Vs1(14): VX21(12) = V(1214) * Cos(An(14)): VY21(12) = V(1214) * Sin(An(14)): Tn1(iii) = T: iii = 1214
1211: End If

If iii = 1214 Then  '                 участок пути до левого зеркала и отражение (зеркало может быть и справа, если есть зеркало 4)
If kod(121) = 0 Then '                           если правый край 1-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(14) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(12), Y21(12), X(114), Y(114), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(14) * P0 < R0 Then GoTo 1214 '
Tn1(3214) = T: kod(121) = 1
End If
Call DX_DY_Dopler(X21(12), Y21(12), X(1), Y(1), Alfa1)
V12 = V(1214) * Cos(An(14) - Alfa1 - pi / 2) '        это скорость луча в АСО вдоль нормали к левому зеркалу при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - Alfa1 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If Check17.Value = 1 Then '            если луч летит до дополнительного зеркала 4, а далее до зеркала 1, которое будет расположено справа
V12 = V(1214) * Cos(An(14) - Alfa1 + pi / 2): V21 = VXiso3 * Cos(AlfaISO - Alfa1 - pi / 2)
End If
If (V12 + V21) * P0 < R0 Then GoTo 1214 '             если за шаг решения луч НЕ достигнет зеркала
kod(121) = 0: V(1218) = Vs1(18): VX21(12) = V(1218) * Cos(An(18)): VY21(12) = V(1218) * Sin(An(18)): Tn1(iii) = T: iii = 1218
1214: End If '

If iii = 1218 Then  '                               участок пути 18 от левого зеркала до экрана
If kod(121) = 0 Then  '                             если правый край 1-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(18) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(12), Y21(12), X(118), Y(118), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(18) * P0 < R0 Then GoTo 1218 '
Tn1(3218) = T: kod(121) = 1
End If
V12 = V(1218) * Cos(An(18) - pi / 2) '            это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '               это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = Y(6) - Y21(12)
If (V12 + V21) * P0 < R0 Then GoTo 1218 '         если за шаг решения луч НЕ перелетит за экран
Tn1(iii) = T: iii = 1219: Xk1(1) = X21(12): Yk1(1) = Y21(12)  '
1218: End If

'                          /////////////////      ПУТЬ 1-го ФРОНТА 2-го ЛУЧА                  /////////////////////

'                /////////////////             путь левого края 1-го ФРОНТА 2-го ЛУЧА            /////////////////////

If jj = 1120 Then  '                                     участок пути до правой грани призмы и отражение
If kod(112) = 0 Then '                                   если левый край 1-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(20) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(21), Y21(21), X(120), Y(120), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(20) * P0 < R0 Then GoTo 1120 '
Tn2(3120) = T: kod(112) = 1 ' теперь для левого края 1-го фронта 2-го луча будет определяться время прохождения им пути до правой грани призмы
End If
Alfa5 = (pi - Alfa3) / 2: An(30) = Alfa5 + pi / 2 '  угол наклона правой грани и угол нормали к покоящейся грани призмы по ходу движения луча
Call DX_DY_Dopler(X21(21), Y21(21), X(3), Y(3), Alfa5) ' находим расстояние от луча до правой грани призмы
V12 = V(10) * Cos(An(10) - An(30)) '                     это скорость луча в АСО вдоль нормали к плоскости правой грани призмы
V21 = VXiso3 * Cos(AlfaISO - Alfa5 - pi / 2) '           это скорость установки в АСО вдоль нормали к правой грани призмы навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1120 '
kod(112) = 0: V(1124) = Vs2(24): VX21(21) = V(1124) * Cos(An(24)): VY21(21) = V(1124) * Sin(An(24)): Tn2(jj) = T: jj = 1124 '
1120: End If

If jj = 1124 Then  '                                  участок пути от призмы до правого зеркала и отражение
If kod(112) = 0 Then '                                если левый край 1-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(24) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(21), Y21(21), X(124), Y(124), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(24) * P0 < R0 Then GoTo 1124 '
Tn2(3124) = T: kod(112) = 1 ' теперь для левого края 1-го фронта 2-го луча будет определятся время прохождения им пути до зеркала
End If
Call DX_DY_Dopler(X21(21), Y21(21), X(2), Y(2), Alfa2)
V12 = V(1124) * Cos(An(24) - Alfa2 + pi / 2) '        это скорость луча в АСО вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa2 - pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1124 '             если за шаг решения луч НЕ перелетит за зеркало
kod(112) = 0: V(1128) = Vs2(28): VX21(21) = V(1128) * Cos(An(28)): VY21(21) = V(1128) * Sin(An(28)): Tn2(jj) = T: jj = 1128
1124: End If

If jj = 1128 Then  '                               участок пути 28 от правого зеркала до экрана
If kod(112) = 0 Then '                             если левый край 1-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(28) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(21), Y21(21), X(128), Y(128), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(28) * P0 < R0 Then GoTo 1128 '
Tn2(3128) = T: kod(112) = 1 ' теперь для левого края 1-го фронта 2-го луча будет определятся время прохождения им пути до экрана
End If
V12 = V(1128) * Cos(An(28)) '                    это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '              это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = Y(6) - Y21(21)
If (V12 + V21) * P0 < R0 Then GoTo 1128 '        если за шаг решения луч НЕ перелетит за экран
Tn2(jj) = T: jj = 1129: Xn1(2) = X21(21): Yn1(2) = Y21(21)
1128: End If


'              /////////////////             путь правого края 1-го ФРОНТА 2-го ЛУЧА         /////////////////////

If jjj = 1220 Then  '                                     участок пути до правой грани призмы и отражение
If kod(122) = 0 Then '                                    если правый край 1-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(20) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(22), Y21(22), X(120), Y(120), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(20) * P0 < R0 Then GoTo 1220 '
Tn2(3220) = T: kod(122) = 1 ' теперь для правого края 1-го фронта 2-го луча будет определятся время прохождения им пути до правой грани призмы
End If
Alfa5 = (pi - Alfa3) / 2: An(30) = Alfa5 + pi / 2 '  угол наклона правой грани и угол нормали к покоящейся грани призмы по ходу движения луча
Call DX_DY_Dopler(X21(22), Y21(22), X(3), Y(3), Alfa5) ' находим расстояние от края фронта до правой грани призмы
V12 = V(10) * Cos(An(10) - An(30)) '                     это скорость луча в АСО вдоль нормали к плоскости правой грани призмы
V21 = VXiso3 * Cos(AlfaISO - Alfa5 - pi / 2) '           это скорость установки в АСО вдоль нормали к правой грани призмы навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1220 '
kod(122) = 0: V(1224) = Vs2(24): VX21(22) = V(1224) * Cos(An(24)): VY21(22) = V(1224) * Sin(An(24)): Tn2(jjj) = T: jjj = 1224 '
1220: End If

If jjj = 1224 Then  '                             участок пути 24 от призмы вправо до зеркала и отражение
If kod(122) = 0 Then '                            если правый край 1-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(24) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(22), Y21(22), X(124), Y(124), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(24) * P0 < R0 Then GoTo 1224 '
Tn2(3224) = T: kod(122) = 1 ' теперь для правого края 1-го фронта 2-го луча будет определятся время прохождения им пути до зеркала
End If
Call DX_DY_Dopler(X21(22), Y21(22), X(2), Y(2), Alfa2)
V12 = V(1224) * Cos(An(24) - Alfa2 + pi / 2) '        это скорость луча в АСО вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa2 - pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 1224 '             если за шаг решения луч НЕ перелетит за зеркало
kod(122) = 0: V(1228) = Vs2(28): VX21(22) = V(1228) * Cos(An(28)): VY21(22) = V(1228) * Sin(An(28)): Tn2(jjj) = T: jjj = 1228
1224: End If

If jjj = 1228 Then  '                             участок пути 28 от зеркала до экрана
If kod(122) = 0 Then '                            если правый край 1-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(28) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X21(22), Y21(22), X(128), Y(128), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(28) * P0 < R0 Then GoTo 1228 '
Tn2(3228) = T: kod(122) = 1 ' теперь для правого края 1-го фронта 2-го луча будет определятся время прохождения им пути до экрана
End If
V12 = V(1228) * Cos(An(28)) '                     это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '               это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = Y(6) - Y21(22)
If (V12 + V21) * P0 < R0 Then GoTo 1228  '        если за шаг решения луч НЕ перелетит за экран
Tn2(jjj) = T: jjj = 1229: Xk1(2) = X21(22): Yk1(2) = Y21(22)
1228: End If


'                          /////////////////                   2-ой фронт                /////////////////////

If kodVY(20) = 0 Then GoTo 70 '                    если не началось движение 2-го фронта волны

'              /////////////////                   ПУТЬ 2-го фронта 1-го ЛУЧА                /////////////////////

'              /////////////////                   ПУТЬ ЛЕВОГО КРАЯ 2-го фронта 1-го ЛУЧА                /////////////////////

If kk = 2110 Then  '                                       участок пути левого края фронта 1-го луча до левой грани призмы и отражение
If kod(211) = 0 Then '                                     если левый край 2-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(10) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X22(11), Y22(11), X(110), Y(110), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(10) * P0 < R0 Then GoTo 2110 '
Tk1(4110) = T: kod(211) = 1
End If
Alfa5 = (Alfa3 + pi) / 2 ' Alfa3 это угол при вершине переднего ребра призмы равный примерно 90 градусов, а Alfa5 угол наклона левой грани
An(30) = Alfa5 - pi / 2 '                                                   угол нормали к покоящейся грани призмы по ходу движения луча
'                                                        Alfa5 = (pi - Alfa3) / 2:An(30) = Alfa5 + pi / 2 ' а это будет для правой грани
Call DX_DY_Dopler(X22(11), Y22(11), X(3), Y(3), Alfa5) ' находим расстояние от края фронта до левой грани призмы
V12 = V(10) * Cos(An(10) - An(30)) '                     это скорость луча в АСО вдоль нормали к плоскости левой грани призмы
V21 = VXiso3 * Cos(AlfaISO - Alfa5 - pi / 2) '           это скорость установки в АСО вдоль нормали к левой грани призмы навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2110 '
kod(211) = 0: V(2114) = Vs1(14): VX22(11) = V(2114) * Cos(An(14)): VY22(11) = V(2114) * Sin(An(14)): Tk1(kk) = T: kk = 2114 '
2110: End If


If kk = 2111 Then  '                                  участок пути до зеркала, которое расположено за призмой по ходу движения луча
If kod(211) = 0 Then '                                если левый край 2-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(10) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X22(11), Y22(11), X(111), Y(111), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(10) * P0 < R0 Then GoTo 2111 '
Tk1(4111) = T: kod(211) = 1 ' теперь для левого края 2-го фронта 1-го луча будет определятся время прохождения им пути до зеркала 4
End If
Call DX_DY_Dopler(X22(11), Y22(11), X(4), Y(4), Alfa4)
V12 = V(10) * Cos(Alfa4 + pi / 2 - An(10)) '           это скорость луча вдоль нормали к зеркалу 4, которое расположили за призмой
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '         это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2111
kod(211) = 0: V(2114) = Vs1(14): VX22(11) = V(2114) * Cos(An(14)): VY22(11) = V(2114) * Sin(An(14)): Tk1(kk) = T: kk = 2114
2111: End If


If kk = 2114 Then  '                             участок пути 14 до левого зеркала (которое как вариант может быть и справа) и отражение
If kod(211) = 0 Then '                           если левый край 2-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(14) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X22(11), Y22(11), X(114), Y(114), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(14) * P0 < R0 Then GoTo 2114 '
Tk1(4114) = T: kod(211) = 1 ' теперь для левого края 2-го фронта 1-го луча будет определятся время прохождения им пути до зеркала 1
End If
Call DX_DY_Dopler(X22(11), Y22(11), X(1), Y(1), Alfa1)
V12 = V(1114) * Cos(An(14) - Alfa1 - pi / 2) '        это скорость луча в АСО вдоль нормали к левому зеркалу 1 при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - Alfa1 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If Check17.Value = 1 Then '            если луч летит до дополнительного зеркала 4, а далее до зеркала 1, которое будет расположено справа
V12 = V(2114) * Cos(An(14) - Alfa1 + pi / 2): V21 = VXiso3 * Cos(AlfaISO - Alfa1 - pi / 2)
End If
If (V12 + V21) * P0 < R0 Then GoTo 2114 '             если за шаг решения луч НЕ достигнет зеркала
kod(211) = 0: V(2118) = Vs1(18): VX22(11) = V(2118) * Cos(An(18)): VY22(11) = V(2118) * Sin(An(18)): Tk1(kk) = T: kk = 2118
2114: End If '


If kk = 2118 Then  '                                  участок пути 18 от зеркала 1 до экрана
If kod(211) = 0 Then '                                если левый край 2-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(18) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X22(11), Y22(11), X(118), Y(118), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(18) * P0 < R0 Then GoTo 2118 '
Tk1(4118) = T: kod(211) = 1 ' теперь для левого края 2-го фронта 1-го луча будет определятся время прохождения им пути до экрана
End If
V12 = V(1118) * Cos(An(18) - pi / 2) '                это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '                   это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = Y(6) - Y22(11)
If (V12 + V21) * P0 < R0 Then GoTo 2118 '             если за шаг решения луч НЕ перелетит за экран
kod(211) = 0: Tk1(kk) = T: kk = 2119: Xn2(1) = X22(11): Yn2(1) = Y22(11) '
2118: End If

'              /////////////////                  ПУТЬ ПРАВОГО КРАЯ 2-го фронта 1-го ЛУЧА                   /////////////////////

If kkk = 2210 Then  '                                 участок пути до левой грани призмы правого края 1-го фронта 1-го ЛУЧА
If kod(221) = 0 Then '                                если правый край 2-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(10) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X22(12), Y22(12), X(110), Y(110), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(10) * P0 < R0 Then GoTo 2210 '
Tk1(4210) = T: kod(221) = 1
End If
Alfa5 = (Alfa3 + pi) / 2 ' Alfa3 это угол при вершине переднего ребра призмы равный примерно 90 градусов, а Alfa5 угол наклона левой грани
An(30) = Alfa5 - pi / 2 '                                угол нормали к покоящейся грани призмы по ходу движения луча
Call DX_DY_Dopler(X22(12), Y22(12), X(3), Y(3), Alfa5) ' находим расстояние от края фронта до грани призмы
V12 = V(10) * Cos(An(10) - An(30)) '                     это скорость луча в АСО вдоль нормали к грани призмы по ходу движения луча
V21 = VXiso3 * Cos(AlfaISO - Alfa5 - pi / 2) '           это скорость установки в АСО вдоль нормали к грани призмы навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2210 '
kod(221) = 0: V(2214) = Vs1(14): VX22(12) = V(2214) * Cos(An(14)): VY22(12) = V(2214) * Sin(An(14)): Tk1(kkk) = T: kkk = 2214
2210: End If

If kkk = 2211 Then  '                                участок пути до дополнительного зеркала 4, если луч пролетает мимо призмы
If kod(221) = 0 Then '                               если правый край 2-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(10) + pi / 2
Call DX_DY_Dopler(X22(12), Y22(12), X(111), Y(111), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs1(10) * P0 < R0 Then GoTo 2211 '
Tk1(4211) = T: kod(221) = 1
End If
Call DX_DY_Dopler(X22(12), Y22(12), X(4), Y(4), Alfa4)
V12 = V(10) * Cos(Alfa4 + pi / 2 - An(10)) '           это скорость луча вдоль нормали к зеркалу, которое расположили за призмой
V21 = VXiso3 * Cos(AlfaISO - Alfa4 + pi / 2) '         это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2211  '
kod(221) = 0: V(2214) = Vs1(14): VX22(12) = V(2214) * Cos(An(14)): VY22(12) = V(2214) * Sin(An(14)): Tk1(kkk) = T: kkk = 2214
2211: End If

If kkk = 2214 Then  '                                 участок пути до левого зеркала и отражение
If kod(221) = 0 Then '                                если правый край 2-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(14) + pi / 2
Call DX_DY_Dopler(X22(12), Y22(12), X(114), Y(114), An(50))
If Vs1(14) * P0 < R0 Then GoTo 2214 '
Tk1(4214) = T: kod(221) = 1
End If
Call DX_DY_Dopler(X22(12), Y22(12), X(1), Y(1), Alfa1)
V12 = V(1214) * Cos(An(14) - Alfa1 - pi / 2) '        это скорость луча в АСО вдоль нормали к левому зеркалу при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - Alfa1 + pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If Check17.Value = 1 Then '            если луч летит до дополнительного зеркала 4, а далее до зеркала 1, которое будет расположено справа
V12 = V(2214) * Cos(An(14) - Alfa1 + pi / 2): V21 = VXiso3 * Cos(AlfaISO - Alfa1 - pi / 2)
End If
If (V12 + V21) * P0 < R0 Then GoTo 2214 '             если за шаг решения луч НЕ достигнет зеркала
kod(221) = 0: V(2218) = Vs1(18): VX22(12) = V(2218) * Cos(An(18)): VY22(12) = V(2218) * Sin(An(18)): Tk1(kkk) = T: kkk = 2218
2214: End If '

If kkk = 2218 Then  '                              участок пути 18 от зеркала до экрана
If kod(221) = 0 Then '                             если правый край 2-го фронта 1-го луча не прошел неподвижный в АСО приемник
An(50) = An(18) + pi / 2
Call DX_DY_Dopler(X22(12), Y22(12), X(118), Y(118), An(50))
If Vs1(18) * P0 < R0 Then GoTo 2218 '
Tk1(4218) = T: kod(221) = 1
End If
V12 = V(1218) * Cos(An(18) - pi / 2) '            это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '               это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = Y(6) - Y22(12)
If (V12 + V21) * P0 < R0 Then GoTo 2218 '         если за шаг решения луч НЕ перелетит за экран
kod(221) = 0: Tk1(kkk) = T: kkk = 2219: Xk2(1) = X22(12): Yk2(1) = Y22(12) '
2218: End If



'                          /////////////////      ПУТЬ 2-го ФРОНТА 2-го ЛУЧА                  /////////////////////

'                /////////////////             путь левого края 2-го ФРОНТА 2-го ЛУЧА            /////////////////////

If pp = 2120 Then  '                                     участок пути до правой грани призмы и отражение
If kod(212) = 0 Then '                                   если левый край 2-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(20) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X22(21), Y22(21), X(120), Y(120), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(20) * P0 < R0 Then GoTo 2120 '
Tk2(4120) = T: kod(212) = 1 ' теперь для левого края 2-го фронта 2-го луча будет определятся время прохождения им пути до правой грани призмы
End If
Alfa5 = (pi - Alfa3) / 2: An(30) = Alfa5 + pi / 2 '      угол наклона правой грани и угол нормали к покоящейся грани призмы по ходу движения луча
Call DX_DY_Dopler(X22(21), Y22(21), X(3), Y(3), Alfa5) ' находим расстояние от края фронта до правой грани призмы
V12 = V(10) * Cos(An(10) - An(30)) '                     это скорость луча в АСО вдоль нормали к плоскости правой грани призмы
V21 = VXiso3 * Cos(AlfaISO - Alfa5 - pi / 2) '           это скорость установки в АСО вдоль нормали к правой грани призмы навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2120  '
kod(212) = 0: V(2124) = Vs2(24): VX22(21) = V(2124) * Cos(An(24)): VY22(21) = V(2124) * Sin(An(24)): Tk2(pp) = T: pp = 2124 '
2120: End If

If pp = 2124 Then  '                                  участок пути от призмы до правого зеркала и отражение
If kod(212) = 0 Then '                                если левый край 2-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(24) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X22(21), Y22(21), X(124), Y(124), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(24) * P0 < R0 Then GoTo 2124 '
Tk2(4124) = T: kod(212) = 1 ' теперь для левого края 2-го фронта 2-го луча будет определяться время прохождения им пути до правого зеркала
End If
Call DX_DY_Dopler(X22(21), Y22(21), X(2), Y(2), Alfa2)
V12 = V(1124) * Cos(An(24) - Alfa2 + pi / 2) '        это скорость луча в АСО вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa2 - pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2124 '             если за шаг решения луч НЕ перелетит за зеркало
kod(212) = 0: V(2128) = Vs2(28): VX22(21) = V(2128) * Cos(An(28)): VY22(21) = V(2128) * Sin(An(28)): Tk2(pp) = T: pp = 2128
2124: End If

If pp = 2128 Then  '                              участок пути 28 от зеркала до экрана
If kod(212) = 0 Then '                            если левый край 2-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(28) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X22(21), Y22(21), X(128), Y(128), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(28) * P0 < R0 Then GoTo 2128 '
Tk2(4128) = T: kod(212) = 1 ' теперь для левого края 2-го фронта 2-го луча будет определятся время прохождения им пути до экрана
End If
V12 = V(1128) * Cos(An(28)) '                    это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '              это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = Y(6) - Y22(21)
If (V12 + V21) * P0 < R0 Then GoTo 2128 '        если за шаг решения луч НЕ перелетит за экран
Tk2(pp) = T: pp = 2129: Xn2(2) = X22(21): Yn2(2) = Y22(21)
2128: End If


'              /////////////////             путь правого края 2-го ФРОНТА 2-го ЛУЧА         /////////////////////

If ppp = 2220 Then  '                                     участок пути до правой грани призмы и отражение
If kod(222) = 0 Then '                                    если правый край 2-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(20) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X22(22), Y22(22), X(120), Y(120), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(20) * P0 < R0 Then GoTo 2220 '
Tk2(4220) = T: kod(222) = 1 ' теперь для правого края 2-го фронта 2-го луча будет определятся время прохождения им пути до правой грани призмы
End If
Alfa5 = (pi - Alfa3) / 2: An(30) = Alfa5 + pi / 2 '  угол наклона правой грани и угол нормали к покоящейся грани призмы по ходу движения луча
Call DX_DY_Dopler(X22(22), Y22(22), X(3), Y(3), Alfa5) ' находим расстояние от края фронта до правой грани призмы
V12 = V(10) * Cos(An(10) - An(30)) '                     это скорость луча в АСО вдоль нормали к плоскости правой грани призмы
V21 = VXiso3 * Cos(AlfaISO - Alfa5 - pi / 2) '           это скорость установки в АСО вдоль нормали к правой грани призмы навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2220 '
kod(222) = 0: V(2224) = Vs2(24): VX22(22) = V(2224) * Cos(An(24)): VY22(22) = V(2224) * Sin(An(24)): Tk2(ppp) = T: ppp = 2224 '
2220: End If

If ppp = 2224 Then  '                             участок пути 24 от призмы до правого зеркала и отражение
If kod(222) = 0 Then '                            если правый край 2-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(24) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X22(22), Y22(22), X(124), Y(124), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(24) * P0 < R0 Then GoTo 2224 '
Tk2(4224) = T: kod(222) = 1 ' теперь для правого края 2-го фронта 2-го луча будет определятся время прохождения им пути до правого зеркала
End If
Call DX_DY_Dopler(X22(22), Y22(22), X(2), Y(2), Alfa2)
V12 = V(1224) * Cos(An(24) - Alfa2 + pi / 2) '        это скорость луча в АСО вдоль нормали к зеркалу
V21 = VXiso3 * Cos(AlfaISO - Alfa2 - pi / 2) '        это скорость установки в АСО вдоль нормали к зеркалу навстречу лучу
If (V12 + V21) * P0 < R0 Then GoTo 2224 '             если за шаг решения луч НЕ перелетит за зеркало
kod(222) = 0: V(2228) = Vs2(28): VX22(22) = V(2228) * Cos(An(28)): VY22(22) = V(2228) * Sin(An(28)): Tk2(ppp) = T: ppp = 2228
2224: End If

If ppp = 2228 Then  '                             участок пути 28 от зеркала до экрана
If kod(222) = 0 Then '                            если правый край 2-го фронта 2-го луча не прошел неподвижный в АСО приемник
An(50) = An(28) + pi / 2 '                                    угол нормали к плоскости покоящегося приемника по ходу движения луча
Call DX_DY_Dopler(X22(22), Y22(22), X(128), Y(128), An(50)) ' находим расстояние от края фронта луча до неподвижного приемника
If Vs2(28) * P0 < R0 Then GoTo 2228 '
Tk2(4228) = T: kod(222) = 1 ' теперь для правого края 2-го фронта 2-го луча будет определятся время прохождения им пути до экрана
End If
V12 = V(1228) * Cos(An(28)) '                     это скорость луча в АСО вдоль нормали к экрану при приближении к нему
V21 = VXiso3 * Cos(AlfaISO - pi)  '               это скорость установки в АСО вдоль нормали к экрану навстречу лучу
R0 = Y(6) - Y22(22)
If (V12 + V21) * P0 < R0 Then GoTo 2228 '         если за шаг решения луч НЕ перелетит за экран
Tk2(ppp) = T: ppp = 2229: Xk2(2) = X22(22): Yk2(2) = Y22(22)
2228: End If



If ii = 1119 And jj = 1129 Then '        если левые края фронов двух лучей 1-го фронта (после его раздвоения) достигли экрана
If iii = 1219 And jjj = 1229 Then '     если правые края фронов двух лучей 1-го фронта (после его раздвоения) достигли экрана
If kk = 2119 And pp = 2129 Then '        если левые края фронов двух лучей 2-го фронта (после его раздвоения) достигли экрана
If kkk = 2219 And ppp = 2229 Then '     если правые края фронов двух лучей 2-го фронта (после его раздвоения) достигли экрана
'(Tn1(ii)+Tn1(iii))/2     - время в конце прохождения 1-м лучом 1-го фронта своих этапов пути 10... 18
'(Tn2(jj)+Tn2(jjj))/2     - время в конце прохождения 2-м лучом 1-го фронта своих этапов пути 20... 28
'(Tk1(kk)+Tk1(kkk))/2     - время в конце прохождения 1-м лучом 2-го фронта своих этапов пути 10... 18
'(Tk2(pp)+Tk2(ppp))/2     - время в конце прохождения 2-м лучом 2-го фронта своих этапов пути 20... 28
' примеры обозначений
'Tn1(1110) и Tn1(1210) - время в конце прохождения участка №10 левым и правым краями 1-го фронта волны 1-го луча
'Tn2(1120) и Tn2(1220) - время в конце прохождения участка №20 левым и правым краями 1-го фронта волны 2-го луча
'Tk1(2110) и Tk1(2210) - время в конце прохождения участка №10 левым и правым краями 2-го фронта волны 1-го луча
'Tk2(2120) и Tk2(2220) - время в конце прохождения участка №20 левым и правым краями 2-го фронта волны 2-го луча

For i = 10 To 28
Tk1(i) = 0: Tn1(i) = 0: Tk2(i) = 0: Tn2(i) = 0
Tk1(100 + i) = 0: Tn1(100 + i) = 0: Tk2(100 + i) = 0: Tn2(100 + i) = 0
Next i '

For i = 0 To 8
Tn1(i + 10) = (Tn1(i + 1110) + Tn1(i + 1210)) / 2: Tn2(i + 20) = (Tn2(i + 1120) + Tn2(i + 1220)) / 2
'                                                время после прохождения i-го участка пути центрами 1-го и 2-го лучей 1-го фронта волны
Tk1(i + 10) = (Tk1(i + 2110) + Tk1(i + 2210)) / 2: Tk2(i + 20) = (Tk2(i + 2120) + Tk2(i + 2220)) / 2
'                                                время после прохождения i-го участка пути центрами 1-го и 2-го лучей 2-го фронта волны

Tn1(i + 110) = (Tn1(i + 3110) + Tn1(i + 3210)) / 2: Tn2(i + 120) = (Tn2(i + 3120) + Tn2(i + 3220)) / 2
'                              время прохождения неподвижного приемника на i-м участке пути центрами 1-го и 2-го лучей 1-го фронта волны
Tk1(i + 110) = (Tk1(i + 4110) + Tk1(i + 4210)) / 2: Tk2(i + 120) = (Tk2(i + 4120) + Tk2(i + 4220)) / 2
'                              время прохождения неподвижного приемника на i-м участке пути центрами 1-го и 2-го лучей 2-го фронта волны
Next i

For i = 10 To 18
v1(i) = 0: v1(100 + i) = 0
If Tk1(i) <> 0 And Tn1(i) <> 0 Then v1(i) = N0 / (Tk1(i) - Tn1(i)) ' частота света в 1-м луче после прохождения i-го участка пути
'                                                                    т.е принятая поверхностью в конце этого пути
If Tk1(100 + i) <> 0 And Tn1(100 + i) <> 0 Then v1(100 + i) = N0 / (Tk1(100 + i) - Tn1(100 + i))
Next i '                                                             частота света в 1-м луче при прохождении i-го участка пути
For i = 20 To 28
v1(i) = 0: v1(100 + i) = 0
If Tk2(i) <> 0 And Tn2(i) <> 0 Then v1(i) = N0 / (Tk2(i) - Tn2(i)) ' частота света во 2-м луче после прохождения i-го участка пути
'                                                                    т.е принятая поверхностью в конце этого пути
If Tk2(100 + i) <> 0 And Tn2(100 + i) <> 0 Then v1(100 + i) = N0 / (Tk2(100 + i) - Tn2(100 + i))
Next i '                                                             частота света во 2-м луче при прохождении i-го участка пути

Y(8) = 4.5: Y(9) = 11.5 '                                            выводим отчет по времени движения фронтов волн
b = 1000: If Option7.Value = True Then b = MK
Info = "среднее время касания обоими концами фронта волны поверхностей в конце этих участков пути "
Picture1.CurrentX = -12.5: Picture1.CurrentY = 6.5: Picture1.Print Info
Info = "увеличенное в " & b & "  раз"
Picture1.CurrentX = -2.5: Picture1.CurrentY = 5.8: Picture1.Print Info
Info = "                 1-ый фронт волны                                                           2-ой фронт волны"
Picture1.CurrentX = -12: Picture1.CurrentY = 5.1: Picture1.Print Info
For i = 10 To 18
Info = "i=   " & i & "    Tn1=   " & Format(b * Tn1(i), "0.000000000") & "   Tn2=   " & Format(b * Tn2(i + 10), "0.000000000") _
& "              Tk1=   " & Format(b * Tk1(i), "0.000000000") & "   Tk2=   " & Format(b * Tk2(i + 10), "0.000000000")
Picture1.CurrentX = -12: Picture1.CurrentY = Y(9) - 4 * i / 5: Picture1.Print Info
Next i
Y(8) = 16: Y(9) = 23 '                    координаты для вывода результатов по частоте

Info = " частота луча на этом участке пути и принятая поверхностью в конце этого участка пути"
Picture1.CurrentX = -12: Picture1.CurrentY = Y(8): Picture1.Print Info
For i = 10 To 18
Info = "v(" & i & ")/v01=   " & Format(v1(i + 100) / v0, "0.000000000") & "    " & Format(v1(i) / v0, "0.000000000") _
& "                         v(" & i + 10 & ")/v02=   " & Format(v1(i + 110) / v00, "0.000000000") & "    " & Format(v1(i + 10) / v00, "0.000000000")
Picture1.CurrentX = -12: Picture1.CurrentY = Y(9) - 4 * i / 5: Picture1.Print Info
Next i

TT(1) = 0: TT(2) = 0
For i = 10 To 18
Nv(i) = v1(i + 100) * (TT(i + 100) - TT(i + 99)): TT(1) = TT(1) + Nv(i)
Next i
For i = 20 To 28
Nv(i) = v1(i + 100) * (TT(i + 100) - TT(i + 99)): TT(2) = TT(2) + Nv(i)
Next i
Nv(19) = TT(1): Nv(29) = TT(2)
If Check16.Value = 1 Then '     если заменить количество колебаний света в лучах на всем пути (N1 и N2), которые будут переданы на форму 3
Text51.Text = TT(1): Text52.Text = TT(2)
End If
 
If Check6.Value = 1 Then '                                     если показать координаты фронтов при их падение на экран в ИСО экрана
Xn1(1) = Xn1(1) - VXiso * Tn1(1118): Yn1(1) = Yn1(1) - VYiso * Tn1(1118)  '   левый край 1-го фронта 1-го луча
Xk1(1) = Xk1(1) - VXiso * Tn1(1218): Yk1(1) = Yk1(1) - VYiso * Tn1(1218) '   правый край 1-го фронта 1-го луча

Xn2(1) = Xn2(1) - VXiso * Tk1(2118): Yn2(1) = Yn2(1) - VYiso * Tk1(2118)  '   левый край 2-го фронта 1-го луча
Xk2(1) = Xk2(1) - VXiso * Tk1(2218): Yk2(1) = Yk2(1) - VYiso * Tk1(2218)  '  правый край 2-го фронта 1-го луча

Xn1(2) = Xn1(2) - VXiso * Tn2(1128): Yn1(2) = Yn1(2) - VYiso * Tn2(1128) '    левый край 1-го фронта 2-го луча
Xk1(2) = Xk1(2) - VXiso * Tn2(1228): Yk1(2) = Yk1(2) - VYiso * Tn2(1228) '   правый край 1-го фронта 2-го луча

Xn2(2) = Xn2(2) - VXiso * Tk2(2128): Yn2(2) = Yn2(2) - VYiso * Tk2(2128) '    левый край 2-го фронта 2-го луча
Xk2(2) = Xk2(2) - VXiso * Tk2(2228): Yk2(2) = Yk2(2) - VYiso * Tk2(2228) '   правый край 2-го фронта 2-го луча
End If

Text71.Text = v1(18) / v0: Text73.Text = (Xn1(1) + Xk1(1)) / 2: Text74.Text = (Xn2(1) + Xk2(1)) / 2 ' координаты центров 1-го луча
Text72.Text = v1(28) / v0: Text75.Text = (Xn1(2) + Xk1(2)) / 2: Text76.Text = (Xn2(2) + Xk2(2)) / 2 ' координаты центров 2-го луча

If Check5.Value = 1 Then Otcheot3 '                 выводим отчет
NC = NC0: kodEnd = 1
End If 'kkk = 2219 And ppp = 2229
End If
End If
End If 'ii = 1119 And jj = 1129

70:
If NC >= NC0 Then '                             если пора выводить текущие данные на экран
NC = 0: Text17.Text = T
If Check11.Value = 1 Then Shema3
'                                                               первый фронт волны
If Check14.Value = 1 Then
Picture1.Line (Xold(1, 11) / ML, Yold(1, 11) / ML)-(Xold(1, 12) / ML, Yold(1, 12) / ML), RGB(255, 255, 255)
Picture1.Line (X21(11) / ML, Y21(11) / ML)-(X21(12) / ML, Y21(12) / ML), RGB(255, 0, 0)
Xold(1, 11) = X21(11): Yold(1, 11) = Y21(11): Xold(1, 12) = X21(12): Yold(1, 12) = Y21(12)
End If
If Check15.Value = 1 Then
Picture1.Line (Xold(1, 21) / ML, Yold(1, 21) / ML)-(Xold(1, 22) / ML, Yold(1, 22) / ML), RGB(255, 255, 255)
Picture1.Line (X21(21) / ML, Y21(21) / ML)-(X21(22) / ML, Y21(22) / ML), RGB(0, 0, 255)
Xold(1, 21) = X21(21): Yold(1, 21) = Y21(21): Xold(1, 22) = X21(22): Yold(1, 22) = Y21(22)
End If
Picture1.Circle (X21(11) / ML, Y21(11) / ML), 0.05, RGB(255, 0, 0)
Picture1.Circle (X21(12) / ML, Y21(12) / ML), 0.05, RGB(255, 0, 0)
Picture1.Circle (X21(21) / ML, Y21(21) / ML), 0.05, RGB(0, 0, 255)
Picture1.Circle (X21(22) / ML, Y21(22) / ML), 0.05, RGB(0, 0, 255)
If kodVY(20) = 1 Then '                                             второй фронт волны
If Check14.Value = 1 Then
Picture1.Line (Xold(2, 11) / ML, Yold(2, 11) / ML)-(Xold(2, 12) / ML, Yold(2, 12) / ML), RGB(255, 255, 255)
Picture1.Line (X22(11) / ML, Y22(11) / ML)-(X22(12) / ML, Y22(12) / ML), RGB(255, 0, 0)
Xold(2, 11) = X22(11): Yold(2, 11) = Y22(11): Xold(2, 12) = X22(12): Yold(2, 12) = Y22(12)
End If
If Check15.Value = 1 Then
Picture1.Line (Xold(2, 21) / ML, Yold(2, 21) / ML)-(Xold(2, 22) / ML, Yold(2, 22) / ML), RGB(255, 255, 255)
Picture1.Line (X22(21) / ML, Y22(21) / ML)-(X22(22) / ML, Y22(22) / ML), RGB(0, 0, 255)
Xold(2, 21) = X22(21): Yold(2, 21) = Y22(21): Xold(2, 22) = X22(22): Yold(2, 22) = Y22(22)
End If
Picture1.Circle (X22(11) / ML, Y22(11) / ML), 0.05, RGB(255, 0, 0)
Picture1.Circle (X22(12) / ML, Y22(12) / ML), 0.05, RGB(255, 0, 0)
Picture1.Circle (X22(21) / ML, Y22(21) / ML), 0.05, RGB(0, 0, 255)
Picture1.Circle (X22(22) / ML, Y22(22) / ML), 0.05, RGB(0, 0, 255)
End If 'Check11.Value = 1
If kodEnd = 1 Then GoTo 90
End If ' NC = NC0

Do While DoEvents() ' идем на 1, после обработки сообщений в очереди
GoTo 1 '             операционной системы, а если будет сообщение от кнопки <Остановить>,
Loop '                то kodEnd будет равен 1 и на следующем шаге будет уже GoTo 90
80: MsgBox "Ошибка решения", , "Maikelson"
90: End Sub

