Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdravím.
Hledám vhodný algoritmus do programu, který by mi spočítal body na elipse.
O elipse vím, že má střed S[0.5; 0.5] a její šířku a výšku.
Dál vím, že chci body mít umístěné v nějakém rovnoměrném rozložení nejprve na její horní polovině a pak i na její dolní polovině. Hranice jsou dány. Když si představím jednotkovou kružnici tak pro horní polovinu jsou hranice PI/4 až 3/4 * PI a v dolní polovině 5/4 * PI až 2PI. Zároveň vím počet bodů pro nalezení (např.: 5).
Dá s z těchto údajů složit nějaká obecná funkce pro nalezení bodu B[x, y]?
1)
Zkoušel jsem to přes rovnici elipsy
(x-m)^2 / aa + (y-n)^2 / bb = 1
kde za m a n jsem dosadil souradnice stredu a za "a" a "b" sirku/2 a vysku/2
a o y jsem prohlásil, že má tvar y = kx + q a že tato přímka prochází středem S a počátkem [0,0] tak mi vyšlo že y=x
a to mi přijde jako blbost
2)
taky jsem zkoušel najít bod B takto:
x = S[x] + a * cos u
y = S[y] + b * sin u
kde
a = sirka / 2
b = vyska / 2
u je uhel, který asi svírá přímka procházející středem S a s přímkou rovnoběžnou s osou x a také procházející středem S
Body mi pak i nějak vyšli, ale jsou nepřesné...
Kdyby měl někdo nějaký nápad moc by mi to pomohlo. Je to příklad z reálného života, potažmo ze zaměstnání programátora :)
Díky
Petr
Offline
↑ Jj:
To znamená, že body v dané výseči by měli mít mezi sebou stejné rozestupy. Takže když naleznu jeden bod na elipse tak další bude posunut o nějakou konstantu. Třeba se zvetsi/zmensi uhel oproti ose x o konstantu c.
Jestli vám to tedy pomohlo...
Offline
↑ pfranz: Pomohlo by, ak by islo o kruznicu. Pri nej totiz rovnakemu stredovemu uhlu zodpoveda aj rovnaka vzdialenost medzi bodmi na kruznici. Pri elipse nie, tu sa slovo "rovnomerne" da chapat minimalne dvomi roznymi sposobmi - rovnake uhly alebo rovnake vzdialenosti. Tak si vyber.
Offline
↑ vlado_bb:
Nevim co je lepší. Záleží, jak to pak bude vypadat a líbit... :D
Tak třeba pro úhly.
Offline

↑ pfranz:
Rovnice elipsy bude:
kde
je polovina "délky" elipsy
je polovina "šířky" elipsy
druhá rovnice bude mít tvar:
kde
bude tangens úhlu (pi/4,pi/3.....) a bude procházet středem S=(1/2,1/2) tj.
dopočítáš q
a pak jen vypočítáš souřadnice bodu z výše uvedených rovnic.
Např. pro úhel
budeš řešit rovnice:
poloosy a,b znáš
Offline
Offline
↑ pfranz:
Ještě jsem se nad tím zamyslel a pochopil jsem tu nepřesnost o které mluvíš. Ty nemyslíš nepřesné v tom smyslu, že by bod nebyl na elipse, ale vadí ti ta nerovnoměrnost, tedy že parametr
není polární úhel toho bodu. Pak je ještě možnost vypočítat pro daný úhel radiální vzdálenost od středu ze vztahu
a z toho už snadno dostaneš xy souřadnice toho bodu.
Pak skutečně půjde vykreslit bod elipsy pod daným úhlem od středu. Jestli to je to co potřebuješ je ovšem jiná věc. Hezčí rozdělení, kdy by se krokovalo podle délky té elipsy bude o poznání složitější a bude asi vyžadovat vyjít z nějaké aproximace eliptických integrálů - to už ale spíš hádám.
Co myslíš povídáním o trojčlence mi jasné není, ale to asi nevadí.
Offline
↑ LukasM:
Wow. Tak já tou nepřesneostí myslel, že bod není na obvodu elipsy. Ted uz jen vymyslim jak udelat aby pri lichem poctu mel stredovy bod uhel 90° vuci ose x :D
Tenhle vzorec mi sice neco rika a o polarnich souradnicich jsem neco slysel na vysoke, ale uspesne jsem to zapomnel... Takze tomu moc nerozumim. Ja dopředu vzdálenost bodu od středu neznám.
Jo a tou trojčlenkou jsem myslel to, že mi souřadnice vycházeli v rozmezi x od 0 do sirky/2 a y od 0 do vysky/2. Musel jsem si je prepocitat do intervalu <0,1> kdy 1 je vzdy bud sirka nebo vyska (podle souradnice). ;) A to jsem delal blbe...
Edit
Vlastne sjem to mel takhle:
var radian = (Math.PI / 180.0) * uhel;
var x = 0.5 + (((this.Width / 2) * (Math.Cos(radian))) / 100);
var y = 0.5 + (((this.Height / 2) * (Math.Sin(radian))) / 100);
Point p = new Point(x, y);
Coz bylo spatne a nevychazelo to. Pritom to stacilo opravit na:
var radian = (Math.PI / 180.0) * uhel;
var x_pom = ((this.Width / 2) * (Math.Cos(radian))) / this.Width;
var y_pom = ((this.Height / 2) * (Math.Sin(radian))) / this.Height;
var x = 0.5 + x_pom;
var y = 0.5 + y_pom;
Point p = new Point(x, y);
Offline
↑ pfranz:
No, vzdálenost od středu znát nemusíš, ta právě vyjde z toho vzorce co píšu. Zkrátka a dobře, body elipsy jsou:
.
Stačí dosadit úhel
a vypadne ti bod na elipse, který leží ve směru
. Je to stejný bod, který by ti vyšel z postupu od Cheopa, akorát teď nemusíš řešit tu soustavu. Jestli je to to co potřebuješ, to je jiná otázka.
Offline
↑ pfranz:
A ještě k tomu editu. Není mi jasné, proč by body
var x_pom = ((this.Width / 2) * (Math.Cos(radian))) / this.Width;
var y_pom = ((this.Height / 2) * (Math.Sin(radian))) / this.Height;
měly ležet na něčem jiném než na kružnici o poloměru 0,5. Jak výška, tak šířka v tom výpočtu vypadnou....
Offline
↑ LukasM:
No, body jsou umisteny na tzv. relativnim panelu, který má do sebe vepsenou elipsu(potazmo kruznici). Ten relativni panel ma takovou krasnou vlastnost ze ikdyz ma ruzne dlouhe strany "a" a "b" tak v jeho souradnem systemu je to jedno a jeho body se pohybuji v intervalu <0;1>.
Asi proto jsem to chtel pro elipsu a ne pro kruznici :D Na obrazovce proste vidim elipsu :D
Offline
↑ LukasM:
Ja kreslim elipsu, ale neuvedomil jsem si ze pro ten panel je to kruznice :D A tek jsem hledal body pro elipsu... Kdyz jsem to ted zjednodusil tak to hledani bodu na kruznici funguje krasne :D
tedy
x = Sx + cos(alpfa) / 2
y = Sy + sin(alpfa) / 2
Offline