Программирование
Веб программирование

Ловушка для луча (Black body)

 
 

Привет всем дружащим с математикой и физикой. 

В классической физике известна модель абсолютно черного тела(Black body). Это сферический сосуд с узким отверстием. Луч света, попадая через отверстие в сосуд испытывает многократные отражения от внутренних стенок и покинуть сосуд практически не может (ловушка для луча). Предлагаю проект на Vb Net, моделирующий этот процесс.

  1. Создайте новый проект
  2. На форме разместите  1 кнопку button1
  3. Поместите в проект таймер Timer1и задайте его интервал 1000 (1 sec.)

Теперь код, я его по возможности подробно закоментировал. 

Public Class Form1

Dim GraphicsFun As System.Drawing.Graphics
Dim q, i, j As Integer
Dim x1, y1, x2, y2, a, b, xc, yc, rc, ak, bk, ck, x01, x02, xe, ye As Decimal
Dim k1, k3, p1, p3, f, d As Decimal

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Вспомогательные переменные
q = 0
j = 0

'Координаты центра и радиус сосуда
xc = 250
yc = 250
rc = 150

'Начальная точка входа луча
x1 = 250
y1 = 100

'Угол входа луча в градусах

f = 35
f = f * 3.141592 / 180
x2 = x1 + 10 * Math.Sin(f)
y2 = y1 + 10 * Math.Cos(f)

'Задание границ формы и размещения кнопки

Me.Width = 900
Me.Height = 600
Button1.Text = "Stop"
Button1.Left = Me.Width - Button1.Width - 20
Button1.Top = Me.Height - Button1.Height - 50
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
'Timer1 - задает интервал прорисовки отраженных лучей

Dim s2 As System.Drawing.Graphics
s2 = Me.CreateGraphics

If q = 0 Then
q = 1
Dim g As Rectangle
g.Width = 300
g.Height = 300
g.X = 100
g.Y = 100

'Прорисовка границ сосуда с отверстием

s2.DrawArc(Pens.Black, g, 274, 356)

End If

'Уравнение прямой луча
a = (y2 - y1) / (x2 - x1)
b = y1 - a * x1

'Нахождение координат xe,ye точки отражения луча, 'сводится к решению квадратного уравнения
ak = 1 + a ^ 2
bk = -2 * xc + 2 * a * (b - yc)
ck = (b - yc) ^ 2 - rc ^ 2 + xc ^ 2
d = Math.Sqrt(bk ^ 2 - 4 * ak * ck)
x01 = (-bk + d) / (2 * ak)
x02 = (-bk - d) / (2 * ak)

'Выбор корня
ak = Math.Sqrt((x01 - x1) ^ 2 + (a * x01 + b - y1) ^ 2)
bk = Math.Sqrt((x02 - x1) ^ 2 + (a * x02 + b - y1) ^ 2)

If ak > bk Then
xe = x01
Else
xe = x02
End If

ye = a * xe + b
s2.DrawLine(Pens.Blue, x1, y1, xe, ye)

'Уравнение радиуса в точку падения луча
k1 = (ye - yc) / (xe - xc)
p1 = yc - k1 * xc

'Угол между радиусом и падающим лучом
f = (a - k1) / (1 + k1 * a)

'Уравнение отраженного луча
k3 = (k1 - f) / (1 + k1 * f)
p3 = ye - k3 * xe
x1 = xe
y1 = ye
x2 = x1 - 10
y2 = k3 * x2 + p3

If (x2 - xc) ^ 2 + (y2 - yc) ^ 2 < rc ^ 2 Then
GoTo m1
End If

x2 = x1 + 10
y2 = k3 * x2 + p3

If (x2 - xc) ^ 2 + (y2 - yc) ^ 2 < rc ^ 2 Then
GoTo m1
End If

m1:
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Stop()

End Sub

End Class

Меняя угол входа луча f в процедуре  Sub Form1_Load, можно наблюдать различные картины отражений луча. Кнопкой Stopможно остановить процесс. 


Есть вопросы? Спроси на нашем форуме!!
alex13sh300 [23.07.2013 10:13]

Автор, пожалуйста выложи Откомпилированный вариань.
Хочу посмотреть на это, ну vb.Net у меня нет

pjp07190 [23.07.2013 11:01]

Извините, не знаю как это здесь сделать? Могу прислать по почте.

alex13sh300 [23.07.2013 16:45]

ты в ФайлОбменик выложи и впиши в сатью эту сылку
ФайлОбменик норм rghost.ru

pjp07190 [24.07.2013 09:58]

http://rghost.ru/47628825 Пароль 777

alex13sh300 [25.07.2013 01:42]

тебе надо сделать, настройки (управление) : углом вхождением и интервалом таймером)

pjp07190 [25.07.2013 08:29]

Да это не помешало бы... Но это технические вещи, довольно элементарные. Я то хотел этим примером показать, что без математики такую программу не сделаешь.

alex13sh300 [25.07.2013 11:03]

Ха) да без матана в программирование делать не чего)
хотя есть такие кто без матеши норм программируют) вродь Веб программирование не требует знание матеши

EverybodyLies280 [25.07.2013 22:03]

алекс...
1) математику не называй матаном/матешем/как-там-еще. матан - вообще сокращение от "математический анализ"
2) математика в программировании нужна лишь для решения МАТЕМАТИЧЕСКИХ проблем и алгоритмов

pjp07190 [26.07.2013 08:31]

В данной задаче не мат. анализ, а аналитическая геометрия + основы оптики. Есть такая область, как численное моделирование, позволяющая решить физические проблемы, которые точными (аналитическими) методами не решаются.Это продуктивная и полезная область, для людей занимающихся ДЕЛОМ, а не игрушками хакеров. Например, можно вычислить изменения орбиты Земли, если рядом с ней пролетит крупный астероид. Сейчас пишу такую прогу.

EverybodyLies280 [26.07.2013 11:59]

to pjp07:
Ан. гем рулит) удачи)

pjp07190 [26.07.2013 12:51]

"Матеамитка - это вид искусства" Р. Винер (основатель киберентики)

Stertor370 [24.06.2014 15:50]

Еще один быдлокодер, странно,что раньше я не видел его пёрлы.

Dim GraphicsFun As System.Drawing.Graphics
Dim q, i, j As Integer
Dim x1, y1, x2, y2, a, b, xc, yc, rc, ak, bk, ck, x01, x02, xe, ye As Decimal
Dim k1, k3, p1, p3, f, d As Decimal

Ты в курсе, что инициализируется как Decimal только две последние переменные, а остальные будут Variant?

HAROIII [23.09.2014 10:14]

Почему ты так решил?

pjp07190 [25.09.2014 09:41]

Ну так приведите ваш код для этой задачки. Мы все заодно поучимся не быдлокодированию. Ждем.



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.