Програма задачі та її опис
NewP = TVector: Reflect (ps, p,*sides); NewP = TVector: Reflect (ps, p,*sides); Sides→draw (Form→PaintBox1→Canvas); Form→PaintBox1→Canvas→Pen→Width=2; Form→PaintBox1→Canvas→Pen→Width=1; RMirror* apriori = (RMirror*)sides; RMirror* apriori = (RMirror*)sides; RMirror* apriori = (RMirror*)sides; RMirror* apriori = (RMirror*)sides; Found = pointOnSegment (sides, p… Читати ще >
Програма задачі та її опис (реферат, курсова, диплом, контрольна)
У класі Experiment описаний метод Do який розраховує точки відбивання, код якого наведений нижче.
void Do (TPoint s1, TPoint s2, int _reflections).
{.
reflections = _reflections;
start = Line (s1,s2);
ps.clear ();
ps.push_back (s1);
int q = reflections;
Line last = start;
int j=-1;
bool found = false, logic;
TPoint p, newP;
int i;
for (i=0;i.
{.
logic=false;
if (i==j) continue;
p = cross (sides[i],&last);
found = pointOnSegment (sides[i], p) && (Direction (s1,s2)==Direction (s1,p));
if (found && typeid (*sides[i])≠typeid (FlatMirror)).
{RMirror* apriori = (RMirror*)sides[i];
p = ArcPoint (last, apriori, p);
logic=true;}}.
if (logic == false).
newP = TVector: Reflect (ps[ps.size ()-1], p,*sides[i-1]);
else.
{.
RMirror* apriori = (RMirror*)sides[i-1];
TVector nn = TVector: normal (apriori->center, p);
newP = TVector: Reflect (ps[ps.size () — 1], p, FlatMirror (Point (p.x+nn.x, p. y+nn.y), Point (p.x-nn.x, p. y-nn.y)));
}.
ps.push_back (p);
last = Line (p, newP);
j=i-1;
while (q>0){.
found = false;
for (i=0;i.
{.
logic = false;
if (i==j) continue;
p = cross (sides[i],&last);
found = pointOnSegment (sides[i], p);
if (found && typeid (*sides[i])≠typeid (FlatMirror)).
{.
RMirror* apriori = (RMirror*)sides[i];
p = ArcPoint (last, apriori, p);
logic=true;
}.
}.
if (logic == 0).
newP = TVector: Reflect (ps[ps.size ()-1], p,*sides[i-1]);
else.
{.
RMirror* apriori = (RMirror*)sides[i-1];
TVector nn = TVector: normal (apriori->center, p);
newP = TVector: Reflect (ps[ps.size ()-1], p, FlatMirror (Point (p.x+nn.x, p. y+nn.y), Point (p.x-nn.x, p. y-nn.y)));
}.
ps.push_back (p);
last = Line (p, newP);
j=i-1;
q—;
}.
}.
Також в класі Experiment описаний метод draw, код якого наведений нижче.
void draw (TForm1* Form).
{.
Form->PaintBox1->Canvas->Pen->Width=1;
Form->PaintBox1->Canvas->Pen->Color=clBlack;
Form->PaintBox1->Canvas->Brush->Color=clWhite;
for (int i = 0;i.
{.
sides[i]->draw (Form->PaintBox1->Canvas);
}.
if (reflections==0) return;
Form->PaintBox1->Canvas->Pen->Width=2;
Form->PaintBox1->Canvas->Pen->Color=clYellow;
Form->PaintBox1->Canvas->Brush->Color=clYellow;
Form->Lock ();
for (int i = 0;i.
{.
AnimateLine (ps[i], ps[i+1], Form->PaintBox1->Canvas);
Application->ProcessMessages ();}.
Form->Unlock ();}.
Даний програмний продукт створений для моделювання моделювання оптичних експериментів в дзеркальній кімнаті. Дана програма реалізована на мові C++, в компіляторі Borland C++ Builder 6.
Інтерфейс програми складається з двох вікон. Перше вікно відповідає за параметри дзеркал (Рис. 7.1.1), друге за візуалізацію експермента (Рис. 7.1.2).
Рис. 3.2.1 Параметри дзеркал
Рис. 3.2.2 Проведення експермента
Меню програми включає в себе наступні пункти:
- · Файл
- · Експермент
Файл Даний пункт дозволяє користувачу відкрити раніше збережений файл чи зберегти експеримент в новий файл.
Експермент Даний пункт меню складається з декількох підпунктів, які допоможуть користувачу в:
- · побудові нового многокутника (кімнати), за це відповідає пункт — Побудувати заново многокутник;
- · проведенні нового експерименту, пункт — Повторити експеримент;
- · змінах розмірів сторін, пункт — Змінити розміри сторін;
- · завершенні змін розмірів сторін — Завершити зміни ;
- · змінах параметрів сторін (кількість дзеркал, тип дзеркала, радіус кривизни) — Змінити параметри дзеркал.
На вікні Відбивання променів від дзеркал також знаходиться текстове поле, в якому користувач вказує кількість відбивань. Справа в інформаційному полі можете спостерігати за ходом експерименту де вказана початкова точка та точки відбивань.