Witam, postanowiłem założyć nowy temat, ponieważ będę miał trochę pytań do programu który chcę napisać. To będzie prosty program realizujący liniowe wcięcie przestrzenne na 6 punktów. Wszystko rozpisałem na kartce. Chodzi o to, aby na podstawie wprowadzonych danych oraz odpowiednich rachunków macierzowych dojść do macierzy (wektora) dx (3x1), a następnie wykonać dwie kontrole obliczeń oraz wyświetlić wyniki. Fajnie by było jak by wynikiem były (mogą być wygenerowane do pliku txt): macierze A (6x3), L (6x1), P (6x6), dx (3x1) oraz w okienku MessageBox po kliknięciu oblicz wartości: XAw, YAw, ZAw (wyrównane współrzędne).
W załączniku rozpisane wszystkie obliczenia, ale jak ktoś nie chce w to wnikać to nie trzeba, bo mam pare gotowych pytań na tym etapie na którym jestem.
To co napisałem do tej pory:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
TX1: TEdit;
Label4: TLabel;
Label5: TLabel;
TY1: TEdit;
Label6: TLabel;
TZ1: TEdit;
Label7: TLabel;
TX2: TEdit;
Label8: TLabel;
Label9: TLabel;
TY2: TEdit;
Label10: TLabel;
TZ2: TEdit;
Label11: TLabel;
TX3: TEdit;
Label12: TLabel;
Label13: TLabel;
TY3: TEdit;
Label14: TLabel;
TZ3: TEdit;
Label15: TLabel;
TX4: TEdit;
Label16: TLabel;
Label17: TLabel;
TY4: TEdit;
Label18: TLabel;
TZ4: TEdit;
Label19: TLabel;
TX5: TEdit;
Label20: TLabel;
Label21: TLabel;
TY5: TEdit;
Label22: TLabel;
TZ5: TEdit;
Label23: TLabel;
TX6: TEdit;
Label24: TLabel;
Label25: TLabel;
TY6: TEdit;
Label26: TLabel;
TZ6: TEdit;
Label27: TLabel;
Label28: TLabel;
Label29: TLabel;
Label30: TLabel;
Label31: TLabel;
Label32: TLabel;
TXAp: TEdit;
TYAp: TEdit;
TZAp: TEdit;
Label33: TLabel;
Label35: TLabel;
Label37: TLabel;
Label39: TLabel;
Label41: TLabel;
Label43: TLabel;
Label45: TLabel;
TdA1: TEdit;
TdA2: TEdit;
TdA3: TEdit;
TdA4: TEdit;
TdA5: TEdit;
TdA6: TEdit;
Label46: TLabel;
Label47: TLabel;
Label48: TLabel;
Tmd: TEdit;
Oblicz: TButton;
procedure ObliczClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
// deklaracja zmiennych użytych w obliczeniach
Form1: TForm1;
X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, X4, Y4, Z4, X5, Y5, Z5, X6, Y6, Z6, XAp, YAp, ZAp, dA1, dA2, dA3, dA4, dA5, dA6, dA1p, dA2p, dA3p, dA4p, dA5p, dA6p: Double;
L: array [1..6] of Real;
P: array [1..6,1..6] of Real;
implementation
{$R *.dfm}
procedure TForm1.ObliczClick(Sender: TObject);
begin
// sprawdzenie czy współrzędne są liczbami
if TryStrToFloat(TX1.Text, X1) = True
and TryStrToFloat(TY1.Text, Y1) = True
and TryStrToFloat(TZ1.Text, Z1) = True
and TryStrToFloat(TX2.Text, X2) = True
and TryStrToFloat(TY2.Text, Y2) = True
and TryStrToFloat(TZ2.Text, Z2) = True
and TryStrToFloat(TX3.Text, X3) = True
and TryStrToFloat(TY3.Text, Y3) = True
and TryStrToFloat(TZ3.Text, Z3) = True
and TryStrToFloat(TX4.Text, X4) = True
and TryStrToFloat(TY4.Text, Y4) = True
and TryStrToFloat(TZ4.Text, Z4) = True
and TryStrToFloat(TX5.Text, X5) = True
and TryStrToFloat(TY5.Text, Y5) = True
and TryStrToFloat(TZ5.Text, Z5) = True
and TryStrToFloat(TX6.Text, X6) = True
and TryStrToFloat(TY6.Text, Y6) = True
and TryStrToFloat(TZ6.Text, Z6) = True
// sprawdzenie czy współrzędne są liczbami
and TryStrToFloat(TXAp.Text, XAp) = True
and TryStrToFloat(TYAp.Text, YAp) = True
and TryStrToFloat(TZAp.Text, ZAp) = True
// sprawdzenie czy pseudoodległości są liczbami
and TryStrToFloat(TdA1.Text, dA1) = True
and TryStrToFloat(TdA2.Text, dA2) = True
and TryStrToFloat(TdA3.Text, dA3) = True
and TryStrToFloat(TdA4.Text, dA4) = True
and TryStrToFloat(TdA5.Text, dA5) = True
and TryStrToFloat(TdA6.Text, dA6) = True
// sprawdzenie czy błąd pomiaru jest liczbą
then
//obliczenie przybliżonych pseudoodległości
dA1p:=SQRT(SQR(XAp-X1)+SQR(YAp-Y1)+SQR(ZAp-Z1));
dA2p:=SQRT(SQR(XAp-X2)+SQR(YAp-Y2)+SQR(ZAp-Z2));
dA3p:=SQRT(SQR(XAp-X3)+SQR(YAp-Y3)+SQR(ZAp-Z3));
dA4p:=SQRT(SQR(XAp-X4)+SQR(YAp-Y4)+SQR(ZAp-Z4));
dA5p:=SQRT(SQR(XAp-X5)+SQR(YAp-Y5)+SQR(ZAp-Z5));
dA6p:=SQRT(SQR(XAp-X6)+SQR(YAp-Y6)+SQR(ZAp-Z6));
//wyznaczenie macierzy L
L[1]:=dA1-dA1p;
L[2]:=dA2-dA2p;
L[3]:=dA3-dA3p;
L[4]:=dA4-dA4p;
L[5]:=dA5-dA5p;
L[6]:=dA6-dA6p;
//wyznaczenie macierzy P
end;
end.
Teraz pierwszy problem na tym etapie: Jak zadeklarować macierz P (diagonalna), aby nie wypisywać wszystkich 36 elementów? Tylko na przekątnej są wartości 1/podany wcześniej błąd pomiaru do kwadratu.
I drugie pytanie: Czy aby wykonać transpozycję macierzy A (AT), muszę pisać dla każdego elementu:
AT[1,1]:=A[1,1];
AT[1,2]:=A[2,1];
AT[1,3]:=A[3,1];
AT[1,4]:=A[4,1];
itp.
Czy da się to zrobić jakoś inaczej (szybciej)?
Z góry dzięki za zainteresowanie i podpowiedzi ;)