Pascal - Výpočet elipsy – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pascal - Výpočet elipsy – Pascal – Fórum – Programujte.comPascal - Výpočet elipsy – Pascal – Fórum – Programujte.com

 

Embrace
~ Anonymní uživatel
4 příspěvky
2. 2. 2009   #1
-
0
-

Zdravim, potřeboval bych pomoc s programem v Pascalu...Ze souřadnic [x;y] 4 bodů vypočítat rozměry elipsy...souřadnice středu, vrcholů, délku hlavní a vedlejší poloosy...
Je to potřeba udělat přes soustavu 4 rovnic o 4 neznámých, ale to vůbec nevim jak zapsat do Pascalu...kdyby někdo věděl, jak na to, budu opravdu vděčnej :/

Nahlásit jako SPAM
IP: 77.48.12.–
KIIV
~ Moderátor
+43
God of flame
2. 2. 2009   #2
-
0
-

a mas aspon ty rovnice?

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Quiark0
Věrný člen
2. 2. 2009   #3
-
0
-

Tak rovnici elipsy máme třeba tady http://en.wikipedia.org/wiki/Ellipse Potřebujeme znát parametry a,b, dostaneme body x1,y1 atd. No jelikož v Pascalu není žádná funkce na řešení rovnic a jelikož to bude vždycky vypadat stejně, vyřešíme tu rovnici sami předem na papíře. To znamená, upravujeme tu soustavu tak dlouho, dokud nedostanem a = nějaký výraz, b = nějaký výraz. No a tento pak můžeme jednoduše přepsat do Pascalu, dosazovat se budou x1, x2, x3, x4, y1, y2, y3, y4.

Nahlásit jako SPAM
IP: 193.86.140.–
Honzc0
Stálý člen
3. 2. 2009   #4
-
0
-

Zde je řešení v Delphi,
pro Pascal (konzolová aplikace) výpočty zůstanou pouze se změní zadávání

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Label4: TLabel;
Edit2: TEdit;
Label5: TLabel;
Edit3: TEdit;
Edit4: TEdit;
Label6: TLabel;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Edit9: TEdit;
Edit10: TEdit;
Label12: TLabel;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Label13: TLabel;
Edit15: TEdit;
Edit16: TEdit;
Label14: TLabel;
Label15: TLabel;
Edit17: TEdit;
Label16: TLabel;
Label17: TLabel;
Edit18: TEdit;
Label18: TLabel;
Edit19: TEdit;
Label19: TLabel;
Edit20: TEdit;
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var x1,y1,x2,y2,x3,y3,x4,y4: Extended;
x112,x113,x124,x134,x212,x213,x224,x234: Extended;
y112,y113,y124,y134,y212,y213,y224,y234: Extended;
a0,a1,a2,a3,a,b,sx,sy,ax,ay,bx,by,cx,cy,dx,dy: Extended;
begin
//zadání bodů 1-4
//jsou-li zadány pouze 4 body, potom musí jít o elipsu,
//která má osy rovnoběžné s osami x a y
//zadávání bodů v Pascalu by bylo možné přes výzvy na obrazovce
//zde je využito grafického prostředí
x1 := StrToFloat(Edit1.Text);
y1 := StrToFloat(Edit2.Text);
x2 := StrToFloat(Edit3.Text);
y2 := StrToFloat(Edit4.Text);
x3 := StrToFloat(Edit5.Text);
y3 := StrToFloat(Edit6.Text);
x4 := StrToFloat(Edit7.Text);
y4 := StrToFloat(Edit8.Text);

//pomocné proměnné
x112 := x2-x1; x113 := x3-x1; x124 := x4-x2; x134 := x4-x3;
x212 := x2*x2-x1*x1; x213 := x3*x3-x1*x1;
x224 := x4*x4-x2*x2; x234 := x4*x4-x3*x3;
y112 := y2-y1; y113 := y3-y1; y124 := y4-y2; y134 := y4-y3;
y212 := y2*y2-y1*y1; y213 := y3*y3-y1*y1;
y224 := y4*y4-y2*y2; y234 := y4*y4-y3*y3;

//rovnice elipsy: x^2+2*a3*x+a2*y^2+2*a1*y+a0=0
//není člen x*y - "e.není natočená"

//výpočet koeficientů a0-a3, to je ten výpočet
a3 := ((y112*x134-y134*x212)*(y113*y224-y124*y213)+(y113*x124-y124*x213)*(y134*y212-y112*y234))/
(((y112*x134-y134*x112)*(y124*y213-y113*y224)+(y113*x124-y124*x113)*(y112*y234-y134*y212))*2);
if y134*y212-y112*y234<>0 then
a2 := (y112*x234-y134*x212+2*a3*(y112*x134-y134*x112))/(y134*y212-y112*y234)
else
a2 := (y113*x224-y124*x213+2*a3*(y113*x124-y124*x113))/(y124*y213-y113*y224);
a1 := -(x212+2*a3*x112+a2*y212)/(2*y112);
a0 := -(x1*x1+2*a3*x1+a2*y1*y1+2*a1*y1);

sx := -a3; sy :=-a1/a2; //střed elipsy S[sx,sy]
a := sqrt(a3*a3+a1*a1/a2-a0); b := a/sqrt(a2); //velikost poloos a,b
ax := -a3-a; ay := -a1/a2; bx := -a3; by := -a1/a2-b;//vrcholy A[ax,ay], B[bx,by]
cx := -a3+a; cy := -a1/a2; dx := -a3; dy := -a1/a2+b;//vrcholy C[cx,cy], D[dx,dy]

//zobrazení výsledků
Edit17.Text := FloatToStr(sx); Edit18.Text := FloatToStr(sy);
Edit19.Text := FloatToStr(a); Edit20.Text := FloatToStr(b);

Edit9.Text := FloatToStr(ax); Edit10.Text := FloatToStr(ay);
Edit11.Text := FloatToStr(bx); Edit12.Text := FloatToStr(by);
Edit13.Text := FloatToStr(cx); Edit14.Text := FloatToStr(cy);
Edit15.Text := FloatToStr(dx); Edit16.Text := FloatToStr(dy);
end;

end.

Nahlásit jako SPAM
IP: 85.207.57.–
Embrace
~ Anonymní uživatel
4 příspěvky
6. 2. 2009   #5
-
0
-

Díky moc za pomoc, ale mam problém...když si zkoušim ten program nejdřív vypočíst na papíře - dosazuju nějaký souřadnice 4 bodů elipsy za x1,y1,x2,y2,x3,y3,x4,y4 a pak dopočítávam ty zbylý pomocný proměnný a a0,a1,a2,a3...ale nemůžu se dopracovat k žádnýmu rozumnýmu výsledku. Už hodnoty těch a0,a1,a2,a3 vychází nesmysly... Takže bych tě chtěl poprosit, jestli jsi zkoušel ten program, jestli funguje, jak má, protože já jsem se nedostal ke správnym výsledkům. Díky

Nahlásit jako SPAM
IP: 77.48.12.–
Mircosoft+1
Věrný člen
10. 2. 2009   #6
-
0
-

Pozor na to, že ne každými čtyřmi body se dá proložit elipsa => zkontroluj, co dosazuješ.
Program jsem nezkoušel.

Nahlásit jako SPAM
IP: 147.32.161.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Honzc0
Stálý člen
11. 2. 2009   #7
-
0
-

Máš pravdu, pro některé hodnoty program blbne (někde je tam nějaká chybička)
Proto jsem to celé předělal a nyní to počítá soustavu pomocí Cramerova pravidla
(funkce zde použité je možné využít pro jakoukoliv soustavu lineárních rovnic)
Navíc jsem to přepsal jako konzolovou aplikaci (Pascal)

Teď už by to mělo šlapat

Nahlásit jako SPAM
IP: 85.207.57.–
Honzc0
Stálý člen
11. 2. 2009   #8
-
0
-

Jenom malá oprava k předešlému příspěvku:
V ošetření špatných vstupů místo EConvertError (ten je pro grafické prostředí) dát EInOutError

Nahlásit jako SPAM
IP: 85.207.57.–
Embrace
~ Anonymní uživatel
4 příspěvky
15. 2. 2009   #9
-
0
-

Vypadá to, že todle funguje. Tak ještě jednou děkuju. Akorát ten program je na mě až moc :) Asi bych žádal moc, kdybych ho chtěl podrobnějc vysvětlit. Ale i tak jsem vděčnej

Nahlásit jako SPAM
IP: 77.48.12.–
Honzc0
Stálý člen
19. 2. 2009   #10
-
0
-

Tak jsem to ještě jednou předělal na výpočet soustavy pouze pro 4 neznámé, v souboru Elipsa.dpr
jsou i komentáře, takže by to mělo být asi jasné.

Nahlásit jako SPAM
IP: 85.207.57.–
Embrace
~ Anonymní uživatel
4 příspěvky
22. 2. 2009   #11
-
0
-

Tomuhle už jakž takž porozumim snad :) Tak se omlouvam za ten promarněnej čas s tim

Nahlásit jako SPAM
IP: 77.48.12.–
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, 13 hostů

Podobná vlákna

Nakloněné elipsy — založil Laaca

Obsah elipsy — založil JakubN

Moderátoři diskuze

 

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