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 :/
Fórum › Pascal
Pascal - Výpočet elipsy
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.
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.
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
Pozor na to, že ne každými čtyřmi body se dá proložit elipsa => zkontroluj, co dosazuješ.
Program jsem nezkoušel.
Moje stránka.
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
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Nakloněné elipsy — založil Laaca
Obsah elipsy — založil JakubN
Priesecnik usecky a elipsy — založil Milos
Dev Pascal, Free pascal - oba mi spustí program 2x po sobě — založil Gooo
Pomoc:pascal:kurz turbo pascal II — založil Systém
Moderátoři diskuze