Radiány-Stupně – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Radiány-Stupně – Delphi – Fórum – Programujte.comRadiány-Stupně – Delphi – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Venca
~ Anonymní uživatel
15 příspěvků
31. 5. 2012   #1
-
0
-

Zdravím, mám problém, dělám úlohu na dopočet stran a uhlu v trojúhelniku..na form. je 6 poli(a,b,c,alfa,beta,gama). Uživ. zadá 3 údaje...přikládám moje "řešení", pro případ, že uživatel zadá stranu a.b a úhel alfa. Problém je že mě to vypíše dopočítané úhly v radiánech, né ve stupních. Děkuji za rady, nebo návrhy.

// ZP 1,2,4

if (edit1.text<>'') and (edit2.text<>'') and (edit4.text<>'') then  begin
a:=strtofloat(edit1.text);
b:=strtofloat(edit2.text);
alfa:=strtofloat(edit4.text);

/////////////////////////////////////
sinalfa:=Sin(DegToRad(alfa));
sinbeta:=(b*sinalfa)/a;
beta:=RadtoDeg(sinbeta);
edit5.text:=floattostr(beta);

/////
gama:=180-(alfa+beta);
edit6.text:=floattostr(gama);

/////
singama:=Sin(DegToRad(gama));
c:=(singama*a)/sinalfa;
edit3.Text:=floattostr(c);
end

Nahlásit jako SPAM
IP: 93.99.142.–
Reklama
Reklama
liborb
~ Redaktor
+18
Guru
31. 5. 2012   #2
-
0
-
Nahlásit jako SPAM
IP: 78.80.52.–
Venca
~ Anonymní uživatel
15 příspěvků
31. 5. 2012   #3
-
0
-

#2 liborb
Jde mě spíš o ten kód jak dostat do výsledku ten znak "stupeň" a "minuty"..

Nahlásit jako SPAM
IP: 93.99.142.–
liborb
~ Redaktor
+18
Guru
31. 5. 2012   #4
-
0
-

Pokud chceš výsledek ve stupních a máš ho v radiánech, tak si to musíš přepočítat. No přidat znak je operace s řetězcem - něco jako: 

edit5.text:=floattostr(beta) + "°";
Nahlásit jako SPAM
IP: 78.80.52.–
Venca
~ Anonymní uživatel
15 příspěvků
31. 5. 2012   #5
-
0
-

#4 liborb
tak z radianu na stupne to přepočítávám tak..beta:=RadtoDeg(sinbeta);, doufam že je to správně.

No potřeboval bych jen ve výsledku nahradit čárku za znak stupně, jestli to jde nějak jednoduše.

Ještě bych asi potřeboval omezit na 2 desetiná místa, jestli máš nějakou dobrou radu  

Nahlásit jako SPAM
IP: 93.99.142.–
Honzc0
Stálý člen
1. 6. 2012   #6
-
0
-

#5 Venca
Tak si napiš jednoduchou funkci (možná nějaká existuje přímo v Delphi-nechce se mi hledat)

Třeba:

function dms(u: Extended): String;
var s,m,v: Integer;
    pom: Extended;
begin
  s := Trunc(u);
  pom := Frac(u)*60;
  m := Trunc(pom);
  pom := Frac(pom)*60;
  v := Round(pom);
  Result := IntToStr(s)+'°'+IntToStr(m)+'´'+IntToStr(v)+'´´';
end;

Tato funkce ovšem při vstupu celých stupňů vypíše i těch 0' a 0''

Tak si ji zkus upravit tak, aby pokud minuty nebo vteřiny jsou nulové je to tam nevypisovalo.

Nahlásit jako SPAM
IP: 93.181.78.–
Venca
~ Anonymní uživatel
15 příspěvků
2. 6. 2012   #7
-
0
-

#6 Honzc
Diky, funguje to    ..hele nevis jeste jak prevest sinus bety(mam ulozeno v sinbeta) na stupne? Zkousel jsem to pomocí  radtodeg(sinbeta) i (sinbeta*180)/PI ..ale vypisuje mi to výsledek vždy s malou neřesností v řádech minut. Nevíš náhodou kde je chyba?

Nahlásit jako SPAM
IP: 93.99.142.–
Honzc0
Stálý člen
4. 6. 2012   #8
-
0
-

#7 Venca
Protože,

sinbeta:=(b*sinalfa)/a; - spočítá sinus úhlu beta v radiánech. (podle sinové věty)
beta:=RadtoDeg(sinbeta); převede tento sinus úhlu, !!! tzn. ne úhel !!! na stupně, což je špatně.

Musíš použít funkci inverzní, tedy     function ArcSin(const X: Extended): Extended;

Protože funkce ArcSin je v jednotce Math, tak ji nezapomeň přidat do sekce uses, tedy

........,Dialogs, Math;

Pro tvůj případ: beta := RadToDeg(ArcSin(sinbeta);

a potom použít funkce dms. (té co jsme vytvořili)

Ještě poznámka: ...ale vypisuje mi to výsledek vždy s malou neřesností v řádech minut, je zřejmě způsobeno tím, že máš v tomto případě úhel beta docela malý. Pro malé úhly (tak do 6-ti stupňů) platí přibližně úhel = sin(úhel) v radiánech.

Ještě ti posílám upravenou funkci dms, aby to při 0 min nebo 0 vteřin tyto nevypisovalo

function dms(u: Extended): String;
var s,m,v: Integer;
    pom: Extended;
    ps: String;
begin
  s := Trunc(u);
  pom := Frac(u)*60;
  m := Trunc(pom);
  pom := Frac(pom)*60;
  v := Round(pom);
  if (v=0) then
    if (m=0) then
      ps := IntToStr(s)+'°'
    else
      ps := IntToStr(s)+'°'+IntToStr(m)+'´'
  else
    ps := IntToStr(s)+'°'+IntToStr(m)+'´'+IntToStr(v)+'´´';
  Result := ps;
end;

Nahlásit jako SPAM
IP: 93.181.78.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 18 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý