Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2013, 14:22   #1
helldz
 
Регистрация: 07.03.2013
Сообщений: 5
По умолчанию Модель молока (геометрическая оптика)

Помогите, пожалуйста зделать модель в delphi
Нужно смоделировать посудину с молоком (одинаковые шарики жира 3,2% не двигаются и раскиданы радномно в воде), перпендикулярно которой падают один за одним лучи света (где-то 100), на шариках жира они преломляются и луч выходит из шарика на стенку сосуда либо преломляется вторым шариком и т.д.,( часть луча отбивается от шарика), нужно посмотреть где выйдут лучи. И набить статистику. Также надо реализовать ход лучей.
Можна реализовать посудину цилиндрической формы.
также надо ввести интенсивность луча.
Теорию могу подробно расказать.
Вложения
Тип файла: rar задача.rar (231.1 Кб, 6 просмотров)
helldz вне форума Ответить с цитированием
Старый 07.03.2013, 14:29   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
также надо ввести интенсивность луча.
Вот это зачем? В линейной оптике свойства света не зависят от интенсивности.
Abstraction вне форума Ответить с цитированием
Старый 07.03.2013, 14:34   #3
helldz
 
Регистрация: 07.03.2013
Сообщений: 5
По умолчанию

Часть луча преломляется частицей, а часть отбивается от нее.
Отбитая асть луча путишествует далее, и так луч делится, если не вщитовать интенсивность, то луч будет делится всегда..
Так что интенсивность надо как то вводить.

Но можна попробовать зделать сначала и без отражения.
helldz вне форума Ответить с цитированием
Старый 07.03.2013, 15:39   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Пару уточнений:
1. Не "отбивается", а "отражается".
2. 3.2% - это не свойство шарика (каждый шарик имеет жирность 100%), а массовая концентрация шариков в жидкости. Из нее можно вычислить отношение радиуса шарика к расстоянию между шариками.
3. Строго говоря, для того, чтобы это можно было считать моделью, необходимо еще задать размер шариков, но, правда, оценки показывают, что при правдоподобном размере:
- модель окажется неподъемной из-за огромного количества шариков,
- если размеры шариков будут одного порядка с длиной волны, геометрическая оптика окажется неприменимой.

PS. Опишите, что собираетесь делать и в чем испытываете затруднения.
s-andriano вне форума Ответить с цитированием
Старый 07.03.2013, 16:26   #5
helldz
 
Регистрация: 07.03.2013
Сообщений: 5
По умолчанию

я рандомно раскидал шарики в посудине 2д случай, учел размеры и условие что они не пересекаются.
Выбрал рандомно на левой стороне квадрата точку,(Чарт, Делфи), перпендикулярно стороне через точку хочу пустить луч.

Потом хочу проверить пересечет ли он какой нибудь шарик на своем пути, или свободно пройдет мимо?
Использовать можна уравнение линии y=kx+b где k=tg(alfa), alfa- угол под каким падает луч на шарик. вначале он 0 градусов, потом есть уравнения шарика R^2=(x-x1)^2+(y-y1)^2 , x1,y1: выбранные рандомом кординаты шарика.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, BubbleCh,Math;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Chart1: TChart;
    Series1: TBubbleSeries;
    Series2: TPointSeries;
    Label1: TLabel;
    Label2: TLabel;
    Series3: TPointSeries;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  flag:boolean;
  n,m,i,j:integer;
  x,y:array [0..100] of Real;       xi,yi:array [0..100] of Real;
  xp,yp:array [0..100] of Real;
  r,r0,n1,n2:real;
  b,k,alfa:Real;
  l,t,dt,c,d,fi:Real;
implementation

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
 n:=50;
 r:=1e-6;       //radiys
 r0:=1e-6;
 l:=8e-5;          //posudina
 xp[1]:=0;
 n1:=1.3;
 n2:=1.453;
 c:=3e8;

 dt:=10e-15;
 yp[1]:=l*random;

    t:= l/c;
    dt:=t/1000;
    Label1.Caption:=FloatToStr(t);
    Label2.Caption:=FloatToStr(dt);

Chart1.LeftAxis.Minimum:=-r0;
Chart1.LeftAxis.Maximum:=l+r0;
Chart1.BottomAxis.Minimum:=-r0;
Chart1.BottomAxis.Maximum:=l+r0;
Series1.Clear;
Series2.Clear;
Series3.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;                           // yslovie 4to sharici ne peresekytsya

 alfa:=0;
  d:=r*sin(alfa);
 //fi:=2*(arcsin(d/r)-arcsin(d/r/1.176));
 k:=sin(alfa)/cos(alfa);
      // for b:=1 to 100 do
        //  y[i]:=k*x[i]+b;
   { while R*R<sqr(xi[i]-x[i])+sqr(yi[i]-y[i]) do
    begin
      // xp[i]:=dt*
    end;        }



 for i:=1  to N do
 Series1.AddBubble(x[i],y[i],r0);
 Series2.AddXY(xp[1]-r0,yp[1]);
 //Series3.AddXY(xp[i]-r0,yp[1]);

 end;




end.
А дальше как писать на знаю..

Последний раз редактировалось ACE Valery; 07.03.2013 в 18:38.
helldz вне форума Ответить с цитированием
Старый 07.03.2013, 16:37   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 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. Вот с дальнейшей траекторией луча всё немного интереснее...
Abstraction вне форума Ответить с цитированием
Старый 07.03.2013, 17:59   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Действительно, моделировать распространение света с шагом dt - занятие малоперспективное.

1. Создаем очередь лучей (первоначально пустую).
2. Возьмите луч. Он для нашей задачи характеризуется текущей точкой (Начальная точка - место его входа в сосуд) и направлением распространения.
3. Сначала находим ближайший к нему (в направлении распространения) шарик жира. Углы и падения и преломления - функции исключительно расстояния от луча до центра шарика. Если шарик не найден - фиксируем его выход, добавляя интенсивность к нужному направлению. Переходим на 6.
4. Если нашли, выпускаем два луча: один отраженный, другой преломленный - каждый со своей интенсивностью. Если интенсивность ниже некоторого порога - считаем, что луч полностью рассеялся (исчез). С точки зрения консервативности можно распределить его интенсивность равномерно во все стороны.
Достаточно интенсивные лучи помещаем в очередь.
5. Извлекаем луч из очереди и переходим на пункт 3.
6. Берем очередной луч и на 1.
7. Если лучи закончились - выводим сформированную индикатриссу рассеяния.

Как-то так.

Кстати, раз уж помещаете код на форум, оформляйте его должным образом: режим code, отступы, комментарии...
Собственно, комментарии нужно писать ДО написания кода. Может, потому и код написать не можете, что не описали алгоритм работы по-русски. Именно это описание потом и превращается в комментарии.
s-andriano вне форума Ответить с цитированием
Старый 11.03.2013, 10:34   #8
helldz
 
Регистрация: 07.03.2013
Сообщений: 5
По умолчанию

Можете помочь з написанием проги, пишите на hell_dz@rambler.ru , договоримся.
helldz вне форума Ответить с цитированием
Старый 11.03.2013, 14:31   #9
Uses_crt
Пользователь
 
Регистрация: 11.03.2013
Сообщений: 10
По умолчанию

Как на меня ето интересная задача било хоть бы больше свободного времени помог бы сделать а так некогда. Я так думаю что должны помочь етому человеку написать ету прогу. Если он здесь написал значит ему очень она нужна.
Uses_crt вне форума Ответить с цитированием
Старый 12.03.2013, 23:45   #10
Uses_crt
Пользователь
 
Регистрация: 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.
Uses_crt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Геометрическая задача (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