|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.03.2013, 14:22 | #1 |
Регистрация: 07.03.2013
Сообщений: 5
|
Модель молока (геометрическая оптика)
Помогите, пожалуйста зделать модель в delphi
Нужно смоделировать посудину с молоком (одинаковые шарики жира 3,2% не двигаются и раскиданы радномно в воде), перпендикулярно которой падают один за одним лучи света (где-то 100), на шариках жира они преломляются и луч выходит из шарика на стенку сосуда либо преломляется вторым шариком и т.д.,( часть луча отбивается от шарика), нужно посмотреть где выйдут лучи. И набить статистику. Также надо реализовать ход лучей. Можна реализовать посудину цилиндрической формы. также надо ввести интенсивность луча. Теорию могу подробно расказать. |
07.03.2013, 14:29 | #2 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
|
|
07.03.2013, 14:34 | #3 |
Регистрация: 07.03.2013
Сообщений: 5
|
Часть луча преломляется частицей, а часть отбивается от нее.
Отбитая асть луча путишествует далее, и так луч делится, если не вщитовать интенсивность, то луч будет делится всегда.. Так что интенсивность надо как то вводить. Но можна попробовать зделать сначала и без отражения. |
07.03.2013, 15:39 | #4 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Пару уточнений:
1. Не "отбивается", а "отражается". 2. 3.2% - это не свойство шарика (каждый шарик имеет жирность 100%), а массовая концентрация шариков в жидкости. Из нее можно вычислить отношение радиуса шарика к расстоянию между шариками. 3. Строго говоря, для того, чтобы это можно было считать моделью, необходимо еще задать размер шариков, но, правда, оценки показывают, что при правдоподобном размере: - модель окажется неподъемной из-за огромного количества шариков, - если размеры шариков будут одного порядка с длиной волны, геометрическая оптика окажется неприменимой. PS. Опишите, что собираетесь делать и в чем испытываете затруднения. |
07.03.2013, 16:26 | #5 |
Регистрация: 07.03.2013
Сообщений: 5
|
я рандомно раскидал шарики в посудине 2д случай, учел размеры и условие что они не пересекаются.
Выбрал рандомно на левой стороне квадрата точку,(Чарт, Делфи), перпендикулярно стороне через точку хочу пустить луч. Потом хочу проверить пересечет ли он какой нибудь шарик на своем пути, или свободно пройдет мимо? Использовать можна уравнение линии y=kx+b где k=tg(alfa), alfa- угол под каким падает луч на шарик. вначале он 0 градусов, потом есть уравнения шарика R^2=(x-x1)^2+(y-y1)^2 , x1,y1: выбранные рандомом кординаты шарика. Код:
Последний раз редактировалось ACE Valery; 07.03.2013 в 18:38. |
07.03.2013, 16:37 | #6 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Если уравнение прямой ax+by+c=0, и a^2+b^2=1 (нормальная форма), то для точки (x0,y0) расстояние от неё до этой прямой равно |ax0+by0+c|. Прямая пересекает окружность с центром в точке (x0, y0) и радиусом R если и только если |ax0+by0+c|<R. Вот с дальнейшей траекторией луча всё немного интереснее...
|
07.03.2013, 17:59 | #7 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Действительно, моделировать распространение света с шагом dt - занятие малоперспективное.
1. Создаем очередь лучей (первоначально пустую). 2. Возьмите луч. Он для нашей задачи характеризуется текущей точкой (Начальная точка - место его входа в сосуд) и направлением распространения. 3. Сначала находим ближайший к нему (в направлении распространения) шарик жира. Углы и падения и преломления - функции исключительно расстояния от луча до центра шарика. Если шарик не найден - фиксируем его выход, добавляя интенсивность к нужному направлению. Переходим на 6. 4. Если нашли, выпускаем два луча: один отраженный, другой преломленный - каждый со своей интенсивностью. Если интенсивность ниже некоторого порога - считаем, что луч полностью рассеялся (исчез). С точки зрения консервативности можно распределить его интенсивность равномерно во все стороны. Достаточно интенсивные лучи помещаем в очередь. 5. Извлекаем луч из очереди и переходим на пункт 3. 6. Берем очередной луч и на 1. 7. Если лучи закончились - выводим сформированную индикатриссу рассеяния. Как-то так. Кстати, раз уж помещаете код на форум, оформляйте его должным образом: режим code, отступы, комментарии... Собственно, комментарии нужно писать ДО написания кода. Может, потому и код написать не можете, что не описали алгоритм работы по-русски. Именно это описание потом и превращается в комментарии. |
11.03.2013, 10:34 | #8 |
Регистрация: 07.03.2013
Сообщений: 5
|
Можете помочь з написанием проги, пишите на hell_dz@rambler.ru , договоримся.
|
11.03.2013, 14:31 | #9 |
Пользователь
Регистрация: 11.03.2013
Сообщений: 10
|
Как на меня ето интересная задача било хоть бы больше свободного времени помог бы сделать а так некогда. Я так думаю что должны помочь етому человеку написать ету прогу. Если он здесь написал значит ему очень она нужна.
|
12.03.2013, 23:45 | #10 |
Пользователь
Регистрация: 11.03.2013
Сообщений: 10
|
Вот что у меня получилось.... правда до конца неработает
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, BubbleCh; type TForm1 = class(TForm) Button1: TButton; Chart1: TChart; Series1: TBubbleSeries; Series2: TPointSeries; Button2: TButton; Label1: TLabel; Label2: TLabel; Series3: TLineSeries; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Series4: TLineSeries; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; flag:boolean; n,m,i,j,alfa:integer; x,y,D,rr1,rr2:array [0..1000] of Real; //xx1,xx2,yy1,yy2:array [0..1000] of Real; xp,yp:array [0..1000] of Real; z:array [0..1000] of integer; r,r0,b,k,x0,schotcuk,xx1,xx2,rr,yy1 ,yy2,min,inext,vidstanD,vidstanR:re al; l:Real; xmin,ymin:real; implementation {$R *.dfm} function fun(x,y,k,b,r0:real):real; //Функція відповідає за знаходження нашого дискримынанту begin fun:=Sqr(x+k*y-k*b)-(k*k+1)*(sqr(x)+sqr(b-y)-r0*r0); end; procedure TForm1.Button1Click(Sender: TObject); begin n:=50; r:=1e-2; r0:=1e-2; l:=8e-1; xp[1]:=0; yp[1]:=l*random; Chart1.LeftAxis.Minimum:=-r0; Chart1.LeftAxis.Maximum:=l+r0; Chart1.BottomAxis.Minimum:=-r0; Chart1.BottomAxis.Maximum:=l+r0; Series1.Clear; Series2.Clear; for i:=1 to N do // Розкидаєм кульки repeat x[i]:=L*random; y[i]:=L*random; j:=0; repeat j:=j+1; r:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j])); until (r<r0*2) or (j=i) until j=i; for i:=1 to N do // Виводим кульки на екран Series1.AddBubble(x[i],y[i],r0); // Series2.AddXY(xp[1]-r0,yp[1],'',clTeeColor); end; procedure TForm1.Button2Click(Sender: TObject); begin Series2.Clear; Series3.Clear; Series4.Clear; { b:=random*L; x0:=0; k:=0; alfa:=0; schotcuk:=0;} //j:=0; r0:=1e-2; //min:=1000; //Series2.AddXY(x0,b,'',clTeeColor); for j:=1 to 2 do // Кількість наших променів в початковий момент begin b:=random*L; x0:=0; k:=0; alfa:=0; schotcuk:=0; min:=1000; Series2.AddXY(x0,b,'',clTeeColor); for i:=1 to n do // Перебираєм всі кульки і шукаєм для них дискримінант begin // r:=sqrt(sqr(x[i]-x0)+sqr(y[i]-b)); // D[i]:=4*k*k*sqr(x[i])+8*x[i]*k*y[i]-8*x[i]*k*b+4*k*k*r*r-4*b*b-4*sqr(y[i])+8*b*y[i]+4*sqr(r); // D[i]:=4*sqr(x[i])+8*k*k*b*y[i]+8*k*b*x[i]-8*k*x[i]*y[i]-4*b*b-4*sqr(y[i])-4*sqr(x[i])+4*r0*r0-4*k*k*sqr(x[i])+4*k*k*r0*r0+8*b*y[i]+8*b*k*k*y[i]; //D[i]:=-4*x[i]*k*(b+x[i]*k)+4*y[i]*(x[i]*k+b*k*k+2*b-y[i])+4*r*(k*k+1); //D[i]:=Sqr(x[i]+k*y[i]-k*b)-(k*k+1)*(sqr(x[i])+sqr(b-y[i])-r0*r0); if fun(x[i],y[i],k,b,r0)>0 then // Якщо дискримінант більший за 0 тобто 2 точки перетину шукаемо найблищу точку перетину begin alfa:=alfa+1; z[alfa]:=i; schotcuk:=alfa; xx1:=(x[i]-k*b+k*y[i]+sqrt(d[i]))/(k*k+1); yy1:=k*xx1+b; rr1[i]:=sqrt(sqr(0-xx1)+sqr(yy1-b)); if min>rr1[i] then begin min:=rr1[i]; xmin:=xx1; ymin:=yy1; inext:=i;end; xx2:=(x[i]-k*b+k*y[i]-sqrt(d[i]))/(k*k+1); yy2:=k*xx2+b; rr2[i]:=sqrt(sqr(0-xx2)+sqr(yy2-b)); if min>rr2[i] then begin min:=rr2[i]; xmin:=xx2; ymin:=yy2;inext:=i; end //label1.Caption:=floattostr(schotcuk ); end; label1.Caption:=floattostr(schotcuk ); label2.Caption:=floattostr(min); label3.Caption:=floattostr(xmin); label6.Caption:=floattostr(ymin); Series3.AddXY(0,b,'',clTeeColor); Series3.AddXY(xmin,b,'',clblack); Series4.AddXY(min,b); Series4.AddXY(xmin,ymin); end; if schotcuk=0 then begin Series3.AddXY(0,b,'',clTeeColor); Series3.AddXY(L,b,'',clblack); end; {if schotcuk>0 then begin min:=1000; } {for j:=1 to alfa do begin i:=z[j]; xx1:=(x[i]-k*b+k*y[i]+sqrt(d[i]))/(k*k+1); yy1:=k*xx1+b; rr1[i]:=sqrt(sqr(0-xx1)+sqr(yy1-b)); if min>rr1[i] then begin min:=rr1[i]; xmin:=xx1; ymin:=yy1; inext:=i;end; xx2:=(x[i]-k*b+k*y[i]-sqrt(d[i]))/(k*k+1); yy2:=k*xx2+b; rr2[i]:=sqrt(sqr(0-xx2)+sqr(yy2-b)); if min>rr2[i] then begin min:=rr2[i]; xmin:=xx2; ymin:=yy2;inext:=i; end end; } {i:-inext; vidstanR:=sqrt(sqr)} {label2.Caption:=floattostr(min); label3.Caption:=floattostr(xmin); label6.Caption:=floattostr(ymin); Series3.AddXY(0,b,'',clTeeColor); Series3.AddXY(xmin,b,'',clblack); Series4.AddXY(min,b); Series4.AddXY(xmin,ymin); } end; end; //end; end. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Геометрическая задача (C++) | Day Stiff | Фриланс | 4 | 12.07.2012 12:50 |
геометрическая задача | Nurik1 | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 05.12.2011 11:34 |
геометрическая задача | Nurik1 | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 20.11.2011 12:07 |
Геометрическая задача | Liza Dalbek | Помощь студентам | 2 | 22.12.2010 19:48 |
Геометрическая задача | Liza Dalbek | Общие вопросы C/C++ | 0 | 22.12.2010 14:18 |