![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 | |
Пользователь
Регистрация: 01.04.2011
Сообщений: 13
|
![]()
Добрый день уважаемые участники форума.
Пытаюсь написать программу на делфи чтобы была хоть чуток видна дисперсия. Хочу сделать по простому из одной точки пустить по очереди 7 лучей разных цветов, и чтобы на выходе из призмы получилось что-то типо радуги. Примерно вот так: ![]() Проблема у меня состоит в том, что я никак не могу понять как вычисляется коэффициент преломления от длины волны. Нашел формулу: Цитата:
|
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,378
|
![]()
Думаю, что можно так:
Найти таблицу зависимости показателя преломления от длинны волны, например тут: http://www.dpva.info/Guide/GuidePhys...eOfwaveLength/ Затем, выбрав степень приближения, составить и решить систему уравнений, для нахождения коэффициентов a, b, c, ... Материал и угол призмы так же должны быть определены. Думаю, что так можно ...
Как-то так, ...
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 01.04.2011
Сообщений: 13
|
![]()
Коэффициенты A и B нашел:
A=1.504 B=4.568*10^3 Теперь если подставлять в эту формулу Коши ![]() длины волн, то находятся нужные нам преломления, но теперь у меня другая проблема, как это нарисовать в делфи, делал по тупому для каждого из 7 лучей указывал своё преломление и свою процедуру рисования, но преподаватель сказал, а что если мы захотим сделать спектр из 200 лучей, то для каждого луча тоже будем высчитывать преломление? У меня в мыслях было пару идей, но реализовать их что-то не получается... Первая мысль - это масив, но с ними я не дружу. Вторая мысль - цикл с переменной, за значения цикла взять длину волны скажем Код:
Вот код, который умеет рисовать линию через призму по закону преломления Код:
Последний раз редактировалось OPEJI; 26.05.2012 в 23:09. |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Что-то не понял, где в Вашей программе задается коэффициент преломления.
И еще: на основе чего ShowLines что-то рисует? Обычно все необходимые параметры передаются в процедуру через параметры. У Вас параметры отсутствуют, а глобальные переменные не описаны. |
![]() |
![]() |
![]() |
#5 | |
Пользователь
Регистрация: 01.04.2011
Сообщений: 13
|
![]() Цитата:
Код:
На основании этой функции рисуется сама призма процедурой(эта процедура просто визуальное оформление) Код:
|
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
А что за параметры у функции fn1?
И еще я спросил насчет ShowLines - что она рисует и на основе каких данных? |
![]() |
![]() |
![]() |
#7 | |
Пользователь
Регистрация: 01.04.2011
Сообщений: 13
|
![]() Код:
(y>400)or(y<-300+1.71*x)or(y<600-1.71*x) вот этими условиями на координатной плоскости создается невидимая призма fn1:=1 fn1:=1.5 это коэффициенты преломления, 1 это вне призмы, то есть "воздух", 1.5 это внутри призмы, то есть "стекло" Цитата:
Код:
Далее в цикле: Высчитываются радиусы сферических волн(с - скорость света в вакууме, fn1(x1,y1) - коэффициент преломления в данных точках, пока луч летит в "воздухе" он равен 1, когда луч влетает в призму он стает равным 1.5, вылетает из призмы и стает опять равным 1, dt-квант времени для точности модели Далее вычисляются углы, пока мы летим в воздухе угол равен 0, как только луч сталкивается с призмой коэффициент преломления изменяется и угол луча соответственно изменяется Далее вычисляются координаты движения луча, т.е. он высчитывает по какой траектории должен лететь луч... |
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Алгоритм вычисления так до конца и не понял. Но попытаюсь предложить, куда внести изменение коэффициента преломления.
Если не пытаться изменить стиль Вашей программы, то коэффициент преломления целесообразно хранить в глобальной переменной и в функции fn1 вместо константы 1.5 подставлять значение этой переменной. Т.е. в TForm1.Button1Click задаете длину волны и по ней вычисляете коэффициент преломления. Если нужно - задаете разные значения длины волны в цикле. Только правильно согласуйте величину B с размерностью длины волны. Потому как задана она явно не в СИ. |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 01.04.2011
Сообщений: 13
|
![]()
Спасибо, попробую...
|
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Дисперсия | tema654 | Microsoft Office Excel | 3 | 15.12.2011 14:28 |
В прямой четырехугольной призме провести сечение, проходящее через сторону нижнего основания под углом 30 | ramp1 | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 04.06.2011 10:39 |
Дисперсия | CesaR_JC | Помощь студентам | 15 | 23.05.2010 01:48 |
Дисперсия. Гистограмма | p4serhiy | Помощь студентам | 2 | 15.04.2010 08:34 |
дисперсия массивов | And_DaviD | Общие вопросы C/C++ | 3 | 16.02.2010 19:45 |