Avatar billede tijap Nybegynder
24. marts 2004 - 14:55 Der er 8 kommentarer og
1 løsning

Trekants beregning i delphi

Hej jeg er i gang med at lave et mini program, hvor man kan taste længder og vinkler ind på en trekant, hvorefter programmet skal kunne udskrive resultatet i de manglende felter. Det der er mit problem er at få programmet til at tage de kendte tal ind og bruge en af cosinus eller sinus relationerne til at regne vinklerne ud med.
Hvis der er nogle der har en løsning til hvorledes man kan få programmet til at skrive løsningen ud på en smart måde ville jeg blive enorm glad, har siddet med det i noget tid efter hånden og jeg kan ikke rigtig finde fejlen.
Avatar billede falster Ekspert
24. marts 2004 - 15:59 #1
Du er ikke så konkret, men sagt lidt firkantet: Dine indtastede værdier skal nok underkastes en "strToFloat" inden der beregnes. Og dine resultater omvendt en "FloatToStr" eller "FloatToStrF" før de udlæses. Se evt. nærmere her:

http://www.delphibasics.co.uk/RTL.asp?Name=Cos
Avatar billede tijap Nybegynder
24. marts 2004 - 17:02 #2
Hey dem der koder er lige hvad jeg sidder og skal bruge :) du har ikke flere omkring noget med cos, sin og deres inverse ?? ked af indtastningen men jeg lidt newbie både med hensyn til delphi og til denne side ;P
Avatar billede tijap Nybegynder
24. marts 2004 - 17:07 #3
Hvordan giver jeg point?
Avatar billede tijap Nybegynder
24. marts 2004 - 17:15 #4
Jeg har dog et andet problem nu, for jeg vil gerne have at når jeg kender trekantens længder, så skal den skrive vinklerne ud, koden er her:
if a2>0 then
begin
  if b2>0 then
  begin
    if c2>0 then
    begin
      Resa1:=(radtodeg(arccos(((b2*b2)+(c2*c2)-(a2*a2))/(2*b2*c2))));
      Sa.Text:=floattostr(resa1);
      Resb1:=(radtodeg(arccos(((a2*a2)+(c2*c2)-(b2*b2))/(2*a2*c2))));
      Sb.Text:=floattostr(resb1);
      Resc1:=(radtodeg(arccos(((a2*a2)+(b2*b2)-(c2*c2))/(2*a2*b2))));
      Sc.Text:=floattostr(resc1);
    end;
  end;
her er Sa, Sb og Sc vinklerne jeg vil have skrevet ud, mens a2,b2 og c2 er længderne på siderne. Når jeg skriver kanternes længder ind, giver den mig kun et resultat, men jeg vil gerne have alle 3..... det er det store problem.
Avatar billede hrc Mester
24. marts 2004 - 23:05 #5
Jeg har prøvet nedenstående og har ingen fejl. Jeg bruger Power i stedet for n*n - måske har det noget at sige. I øvrigt kan jeg anbefale at bruge StrToFloatDef som returnerer en default værdi ved konverteringsfejl. God når man henter værdier fra en TEdit der kan være tom;

procedure TfrmeTriangle.Button1Click(Sender: TObject);

  function RadToDegStr(aRad : extended) : string;
  begin
    result := format('%3.2f',[RadToDeg(aRad)]);
  end;

begin
  if (ALgd = 0) or (BLgd = 0) or (CLgd = 0) then
    exit;

  eAAng.Text := RadToDegStr(ArcCos(
                (Power(BLgd,2)+Power(CLgd,2)-Power(ALgd,2)) / (2*BLgd*CLgd) ));
  eBAng.Text := RadToDegStr(ArcCos(
                (Power(ALgd,2)+Power(CLgd,2)-Power(BLgd,2)) / (2*ALgd*CLgd) ));
  eCAng.Text := RadToDegStr(ArcCos(
                (Power(ALgd,2)+Power(BLgd,2)-Power(CLgd,2)) / (2*ALgd*BLgd) ));
end;

Din arbejdsplan må se nogenlunde sådan her ud:
1. Alle tre siders længde opgivet (den er klaret her)
2. Vinkel og to hosliggende sider
3. Vinkel, en hosliggende og modstående side
4. En side og 2 vinkler

Hvis du vil begrænse de tegn som brugeren må skrive, kan du lege lidt med følgende kodestump:

procedure TfrmeTriangle.OnlyFloats(aSender : TObject; var aChar: char);
var
  p : integer;
begin
  with (aSender as TEdit) do
    if aChar > #32 then begin // e.g. backspace is below

      if not (aChar in ['0'..'9',DecimalSeparator]) then
        aChar := #0;

      p := pos(DecimalSeparator,Text);
      if p > 0 then
        if aChar = DecimalSeparator then // Do not add more dots than the one present
          aChar := #0
        else if length(Text) - p > 3 then // It's a digit. Allow no more than 4 digits
          aChar := #0;
    end; // if
end;

Hvis du hægter den på en TEdit's OnKeyPressed event, så vil den kun acceptere tal, eet komma (eller hvad DecimalSeparator nu er sat til) og 4 decimaler.

God arbejdslyst.
Avatar billede hrc Mester
25. marts 2004 - 10:08 #6
Skal lige tilføje, at jeg har lavet en property til hver af de seks parametre som man kan angive ved trekanten:

type
  TfrmeTriangle = class(TFrame) // Kunne ligeså godt bruge en TForm
  private
    function GetBLgd: extended;
  public
    property BLgd : extended read GetBLgd;
    .. osv
  end;

implementation

function TfrmeTriangle.GetBLgd: extended;
begin
  result := StrToFloatDef(eBLgd.Text,0);
end;
Avatar billede tijap Nybegynder
25. marts 2004 - 15:32 #7
Det må jeg nok sige det er nogle super råd du har der :D jeg takker utrolig mange gange :)
Avatar billede tijap Nybegynder
25. marts 2004 - 15:36 #8
Her har du point for din hjælp :)
Avatar billede monie Nybegynder
26. marts 2004 - 07:50 #9
Hej tijap
Jeg har fulgt dit indlæg.
Og vil gerne som indlæring, afprøve din trekanberegning.
Vil du indsæt helde dit Unit eller sende den til mig.

Med venlig hilsen
Monie Jacobsen
E-mail: mjs at nypost dot dk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester