Witam :)
Otóż mój problem wygląda następująco:
Napisałem program, który oblicza powiększenie obrazu przechodzącego przez 5 soczewek.
Wartości pierwszych 2 soczewek są obliczane dobrze, natomiast problem pojawia się przy parametrze "Y" soczewki 3 (w programie zmienna "p3". Później jak wiadomo część rzeczy sypie się tylko i wyłącznie przez złe obliczenie "p3".
Poniżej zdjęcie problemu, a jeszcze niżej kod.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, ComCtrls, Buttons;
var wielkosc,y,z,zs1,zs2,zs3,zs4,zs5,f,f2,f3,f4,f5,d,g,opos,o,o2,o3,o4,o5,l,l2,l3,l4,l5: real;
t: real;
type
{ TForm1 }
TForm1 = class(TForm)
answer: TButton;
Image1: TImage;
inf: TButton;
inst: TButton;
clear: TButton;
exxit: TButton;
Label1: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label2: TLabel;
Label20: TLabel;
Label4: TLabel;
Label6: TLabel;
Labelf1: TLabel;
Labelf2: TLabel;
Labelf3: TLabel;
Labelf4: TLabel;
Labelf5: TLabel;
Labelp1: TLabel;
Labelp2: TLabel;
Labelp3: TLabel;
Labelp4: TLabel;
Labelp5: TLabel;
Labelx1: TLabel;
Labelx2: TLabel;
Labelx3: TLabel;
Labelx4: TLabel;
Labelx5: TLabel;
Labely1: TLabel;
Labely2: TLabel;
Labely3: TLabel;
Labely4: TLabel;
Labely5: TLabel;
line10: TLabel;
line11: TLabel;
line12: TLabel;
line13: TLabel;
line14: TLabel;
line15: TLabel;
line5: TLabel;
line6: TLabel;
line7: TLabel;
line8: TLabel;
line9: TLabel;
wynik: TLabel;
LabelPow5: TLabel;
LabelPow4: TLabel;
LabelPow3: TLabel;
LabelPow2: TLabel;
LabelPow1: TLabel;
line4: TLabel;
p: TLabel;
line: TLabel;
Label3: TLabel;
Label5: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
line1: TLabel;
line2: TLabel;
line3: TLabel;
opos: TEdit;
wielkosc: TEdit;
zs1: TEdit;
zs2: TEdit;
zs3: TEdit;
zs4: TEdit;
zs5: TEdit;
zzzz: TLabel;
procedure answerClick(Sender: TObject);
procedure Image1Click(Sender: TObject);
procedure infClick(Sender: TObject);
procedure instClick(Sender: TObject);
procedure clearClick(Sender: TObject);
procedure exxitClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Label6Click(Sender: TObject);
procedure LabelPow1Click(Sender: TObject);
procedure line1Click(Sender: TObject);
procedure oposChange(Sender: TObject);
procedure oposKeyPress(Sender: TObject; var Key: char);
procedure wielkoscChange(Sender: TObject);
procedure wielkoscKeyPress(Sender: TObject; var Key: char);
procedure zs1KeyPress(Sender: TObject; var Key: char);
procedure zs2KeyPress(Sender: TObject; var Key: char);
procedure zs3KeyPress(Sender: TObject; var Key: char);
procedure zs4KeyPress(Sender: TObject; var Key: char);
procedure zs5KeyPress(Sender: TObject; var Key: char);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.answerClick(Sender: TObject);
var
z, z2, z3, z4, z5, f, f2, f3, f4, f5, w, q, q2, q3, q4, q5, p1, p2, p3, p4, p5, odl, odl2, odl3, odl4 ,odl5 : single;
MaxFF: Integer;
begin
z:=StrToFloat (zs1.Text);
z2:=StrToFloat (zs2.Text);
z3:=StrToFloat (zs3.Text);
z4:=StrToFloat (zs4.Text);
z5:=StrToFloat (zs5.Text);
odl:=StrToFloat (opos.Text);
w:=StrToFloat (wielkosc.Text);
f:=100*(1/z);
f2:=100*(1/z2);
f3:=100*(1/z3);
f4:=100*(1/z4);
f5:=100*(1/z5);
p1:= (f*odl) / (odl-f);
odl2:=p1;
p2:= (f2*odl2) / (odl2-f2);
odl3:=p2;
p3:= (f3*odl3) / (odl3-f3);
odl4:=p3;
p4:= (f4*odl4) / (odl4-f4);
odl5:=p4;
p5:= (f5*odl5) / (odl5-f5);
q:=(Abs(p1) / odl)*w;
q2:=(Abs(p2) / odl2)*w;
q3:=(Abs(p3) / odl3)*w;
q4:=(Abs(p4) / odl4)*w;
q5:=(Abs(p5) / odl5)*w;
if
odl < f = true then
ShowMessage('Odleglosc przedmiotu od soczewki mniejsza od ogniskowej SOCZEWKI 1. Obraz nie powstanie! ! !')
else
if w<=0 = true then
ShowMessage('Wielkosc przedmiotu musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')
else
if z<=0 = true then
ShowMessage('Zdolnosc skupiajaca "SOCZEWKI 1" musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')
else
if odl<=0 = true then
ShowMessage('Odleglosc przedmiotu od soczewki musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')
else
if z2<=0 = true then
ShowMessage('Zdolnosc skupiajaca "SOCZEWKI 2" musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')
else
if z3<=0 = true then
ShowMessage('Zdolnosc skupiajaca musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')
else
if z4<=0 = true then
ShowMessage('Zdolnosc skupiajaca musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')
else
if z5<=0 = true then
ShowMessage('Zdolnosc skupiajaca musi byc wieksza niz 0. Popraw dane i wcisnij "Oblicz" w lewym dolnym rogu programu.')
else
Labelx1.Caption := FloatToStrF(odl,ffFixed,10,2);
Labelx2.Caption := FloatToStrF(odl2,ffFixed,10,2);
Labelx3.Caption := FloatToStrF(odl3,ffFixed,10,2);
Labelx4.Caption := FloatToStrF(odl4,ffFixed,10,2);
Labelx5.Caption := FloatToStrF(odl5,ffFixed,10,2);
Labelf1.Caption := FloatToStrF(f,ffFixed,10,2);
Labelf2.Caption := FloatToStrF(f2,ffFixed,10,2);
Labelf3.Caption := FloatToStrF(f3,ffFixed,10,2);
Labelf4.Caption := FloatToStrF(f4,ffFixed,10,2);
Labelf5.Caption := FloatToStrF(f5,ffFixed,10,2);
Labely1.Caption := FloatToStrF(p1,ffFixed,10,2);
Labely2.Caption := FloatToStrF(p2,ffFixed,10,2);
Labely3.Caption := FloatToStrF(p3,ffFixed,10,2);
Labely4.Caption := FloatToStrF(p4,ffFixed,10,2);
Labely5.Caption := FloatToStrF(p5,ffFixed,10,2);
Labelp1.Caption := FloatToStrF(q,ffFixed,10,2);
Labelp2.Caption := FloatToStrF(q2,ffFixed,10,2);
Labelp3.Caption := FloatToStrF(q3,ffFixed,10,2);
Labelp4.Caption := FloatToStrF(q4,ffFixed,10,2);
Labelp5.Caption := FloatToStrF(q5,ffFixed,10,2);
LabelPow1.Caption := FloatToStrF(q,ffFixed,10,2);
LabelPow2.Caption := FloatToStrF(q2,ffFixed,10,2);
LabelPow3.Caption := FloatToStrF(q3,ffFixed,10,2);
LabelPow4.Caption := FloatToStrF(q4,ffFixed,10,2);
LabelPow5.Caption := FloatToStrF(q5,ffFixed,10,2);
wynik.Caption := FloatToStrF(q*(Abs(p2) / odl2)*(Abs(p3) / odl3)*(Abs(p4) / odl4)*(Abs(p5) / odl5),ffFixed,10,2);
end;
procedure TForm1.Image1Click(Sender: TObject);
begin
end;
procedure TForm1.infClick(Sender: TObject);
begin
ShowMessage('Program obliczajacy wartosc powiekszenia obrazu przez 5 soczewek skupiajacych. Produced By Oskar Dolowy ®2016');
end;
procedure TForm1.instClick(Sender: TObject);
begin
ShowMessage('INSTRUKCJE: '#10'1. Do liczb dziesietnych uzywaj PRZECINKA.'#10'2. Po obliczeniu mozesz wyczyscic okienka do wprowadzania danych przyciskiem "Wyczysc" w lewym dolnym rogu aplikacji.'#10'3. Informacje na temat programu znajdziesz w prawym gornym rogu aplikacji.'#10'4. Po zakonczeniu obliczen mozesz wyjsc z programu za pomoca przycisku "Wyjdz" w prawym dolnym rogu aplikacji.');
end;
procedure TForm1.clearClick(Sender: TObject);
begin
wielkosc.clear;
zs1.clear;
zs2.clear;
zs3.clear;
zs4.clear;
zs5.clear;
opos.clear;
wielkosc.SetFocus;
end;
procedure TForm1.exxitClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
procedure TForm1.Label6Click(Sender: TObject);
begin
end;
procedure TForm1.LabelPow1Click(Sender: TObject);
begin
end;
procedure TForm1.line1Click(Sender: TObject);
begin
end;
procedure TForm1.oposChange(Sender: TObject);
begin
end;
procedure TForm1.oposKeyPress(Sender: TObject; var Key: char);
begin
if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
Key := #0;
ShowMessage('Sprawdz czy poprawnie wprowadziles odleglosc przedmiotu od soczewki lub zajrzyj do Instrukcji.');
end;
end;
procedure TForm1.wielkoscChange(Sender: TObject);
begin
end;
procedure TForm1.wielkoscKeyPress(Sender: TObject; var Key: char);
begin
if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
Key := #0;
ShowMessage('Sprawdz czy poprawnie wprowadziles Wielkosc Obiektu lub zajrzyj do Instrukcji.');
end;
end;
procedure TForm1.zs1KeyPress(Sender: TObject; var Key: char);
begin
if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
Key := #0;
ShowMessage('Sprawdz czy poprawnie wprowadziles wartosc Zdolnosci Skupiajacej SOCZEWKI1 lub zajrzyj do Instrukcji.');
end;
end;
procedure TForm1.zs2KeyPress(Sender: TObject; var Key: char);
begin
if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
Key := #0;
ShowMessage('Sprawdz czy poprawnie wprowadziles wartosc Zdolnosci Skupiajacej SOCZEWKI2 lub zajrzyj do Instrukcji.');
end;
end;
procedure TForm1.zs3KeyPress(Sender: TObject; var Key: char);
begin
if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
Key := #0;
ShowMessage('Sprawdz czy poprawnie wprowadziles wartosc Zdolnosci Skupiajacej SOCZEWKI3 lub zajrzyj do Instrukcji.');
end;
end;
procedure TForm1.zs4KeyPress(Sender: TObject; var Key: char);
begin
if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
Key := #0;
ShowMessage('Sprawdz czy poprawnie wprowadziles wartosc Zdolnosci Skupiajacej SOCZEWKI4 lub zajrzyj do Instrukcji.');
end;
end;
procedure TForm1.zs5KeyPress(Sender: TObject; var Key: char);
begin
if not (key in ['0'..'9',#8{backspace},#9{tab},',']) then
begin
Key := #0;
ShowMessage('Sprawdz czy poprawnie wprowadziles wartosc Zdolnosci Skupiajacej SOCZEWKI5 lub zajrzyj do Instrukcji.');
end;
end;
end.