Autor | Zpráva | ||
---|---|---|---|
Darker Profil |
#1 · Zasláno: 12. 3. 2011, 22:16:56
Před chvílí jsem se na hřišti pochlubil svým grafem, ale veskutečnosti toho moc na chlubení není.
Sice se pěkně generuje a otáčí v prostoru podle osy X když měním proměnné ale jednu věc nedokážu vymyslet. Pokud by to totiž měl být graf, měl by mít dvě části, oddělené čarami a já nevím, jak spočítat kde přesně se nachází krajový bod elipsy, abych k němu mohl od středu věst úsečku. Jedině svisle a vodorovně, tam se hodnota rovná šířce/2. Ilustrace. O elipse vím: - šířku - výšku - pozici středu - barvu |
||
YoSarin Profil |
#2 · Zasláno: 12. 3. 2011, 22:33:24
Skoro jako nejjednodušší se mi jeví postupovat daným směrem po kouscích - začít úsečkou o délce h/2 (kde h je výška elipsy) a pak postupovat po menších kouscích a koukat jestli už nepřekresluješ okraj (tzn. zkoumat jestli pixel na který chceš kreslit nemá barvu elipsy). A pokud ano, tak jsi hotový... Případně nejdřív půlením intervalu <h/2; w/2> v daném směru najít souřadnice prvního červeného bodu a k němu pak nakreslit úsečku...
Teď se jdu zadumat nad čistě matematickým řešením problému :) |
||
Darker Profil |
#3 · Zasláno: 13. 3. 2011, 10:40:08
Určitě nemám v plánu hledat okraj elipsy pixel po pixelu. Ani se nemyslím, že je to jednoduché řešení, veskutečnosti v sobě skrývá náročný a zdlouhavý cyklus. Přitom stačí vypočítat rovnici.
|
||
Alphard_ Profil * |
#4 · Zasláno: 13. 3. 2011, 10:58:53
Darker:
Jak definuješ tu úsečku, se kterou hledáš průsečík? Jestli správně chápu, že tvoříš koláčový 3D graf, možná bych to zkusil transformovat z kruhu. Protože tam mnohem lépe určíš výseč např 72 °, tj. 20 % obsahu. |
||
Darker Profil |
#5 · Zasláno: 13. 3. 2011, 16:10:51
Alphard:
„transformovat z kruhu“ Stačí transformovat nějakým způsobem čísla, nebo je zapotřebí transformovat to fyzicky (vemu kruh a smáčknu ho přes imagecopyresized)? |
||
TomášK Profil |
#6 · Zasláno: 13. 3. 2011, 16:33:25
Darker:
Elipsa má rovnici, už si na ni pravděpodobně narazil, pokud ne, tak ji najdeš třeba na wikipedii. Totéž platí pro přímku. 1, Zkonstruuješ rovnici elipsy 2, Zkonstruuješ rovnici přímky, která jde přes střed elipsy a má požadovaný směr. 3, Obě rovnice dáš do soustavy a jejich společné řešení dá dva průsečíky. Z nich si vybereš ten, která potřebuješ. Uděláš-li to obecně, dostaneš obecný vzorec pro ten bod. Zdá se mi to poměrně přímočaré, ale počítat se mi to nechce :-) |
||
Alphard Profil |
#7 · Zasláno: 13. 3. 2011, 16:42:48
Darker:
Pořád není uvedeno, co vlastně chcete, a jak to máte teď, aby s tím bylo co nejméně práce. Mnou navrhovaná transformace z kruhu řeší problém určení směru požadovaých úseček. Pokud tento problém nemáte, stačí triviální [#6], to se učí na střední škole. |
||
Darker Profil |
#8 · Zasláno: 14. 3. 2011, 12:29:18
Alphard:
„Pořád není uvedeno, co vlastně chcete“ Tak tykáš mi, nebo vykáš? ([#4]) „to se učí na střední škole.“ Ještě jsem neukončil střední školu, a zatím jsme se o elipsách neučili zhola nic. Jsme u logaritmů. (sexta) „problém určení směru požadovaých úseček.“ A jak přesně to mám z kruhu tranformovat? Snažil jsem se, abys mi to přiblížil v [#5]. „a jak to máte teď“ Zdroj. TomášK: „Elipsa má rovnici, už si na ni pravděpodobně narazil“ Ano, ale moc mi nepomohla. Na wikipedii jsem se nedíval, snad to tam bude líp vysvětlené. |
||
petr 6 Profil |
#9 · Zasláno: 14. 3. 2011, 15:49:58 · Upravil/a: petr 6
Darker:
Použij parametrické vyjádření rovnice elipsy. x=a*cos(t) y=b*sin(t) za t dosaď α/360, kde α bude velikost úhlu ve stupních. Tak získáš bod* na elipse, kde bude jeden koncový bod tvojí úsečky. Druhý koncový bod bude ve středu elipsy, ten snad zvládneš spočítat. *takto získáš polohu bodu vůči středu elipsy, takže nezapoměň obě souřadnice posunout o souřadnice středu elipsy. Jinak a a b jsou poloosy elipsy, tj. polovina výšky a polovina šířky. |
||
Darker Profil |
#10 · Zasláno: 15. 3. 2011, 02:47:15 · Upravil/a: Darker
petr 6:
Dík moc, tvoje řešení je mnohem hezčí než moje rovnice, kterou jsem dnes večer s dopomocí vyplodil. Teď ještě ta transformace z kružnice. Přemýšlel jsem nad tím a představil jsem si to (nesmějte se mi) jako když vemete gumové kolo od vozu a stlačíte ho. Úhly mezi paprsky kola se splácnou taky. Ale bohužel, ani tohle nedokážu pojmout matematicky, asi to nebude lineární funkce. Předpokládám že míra "zplacatění" se bude počítat z poměru poloos. |
||
petr 6 Profil |
#11 · Zasláno: 15. 3. 2011, 09:29:58
Darker:
Pokud použiješ moje řešení, tak to už tu transformaci má v sobě, a sice použitím dvou poloos a,b místo jednoho poloměru. |
||
Darker Profil |
#12 · Zasláno: 16. 3. 2011, 15:42:06 · Upravil/a: Darker
Funguje to výborně, výsledná funkce:
function prusecik($a,$b,$α,$stred=array(0,0)){ $t=$α; $t=$t* pi() / 180; $x=$a*cos($t); $y=$b*sin($t); //return array($x+$stred[0],$y+$stred[1]); return array($x+$stred[0],$y+$stred[1]); } Vrátí souřadnice průsečíku polopřímky a elipsy. http://jmareda.tk/grafy/?p[0][value]=10&p[1][value]=10&v=1 Tuší ale někdo, jak spočítat kde udělat imagefil v např. tomto případě? http://jmareda.tk/grafy/?p[0][value]=55&v=1 Počítám to několik PX od prostředku druhé svislé čáry. $pozice=pozice($POLOMER_X,$POLOMER_Y,$START,$STRED); //stred je pole, co obsahuje X a Y souradnice stredu elipsy imageline($im,$STRED[0],$STRED[1], //Sikma cara od stredu k okraji $pozice[0],$pozice[1],$colors[$LINE_COLOR]); if($pozice[1]>$STRED[1]) imageline($im,$pozice[0],$pozice[1], //svisla cara ktera vede pres spodni elipsu (tmavě žlutá) $pozice[0],$pozice[1]+$rozdil_stredu,$colors[$LINE_COLOR]); if(($pozice[1]+$rozdil_stredu/2)>$STRED[1]) imagefill ($im,$pozice[0]+2,$pozice[1]+$rozdil_stredu/2,$colors["dark".$barva]); //vybarvení tmavou barvou PS: Url formátoveč má problémy s adresou ve které je [ či ]. |
||
petr 6 Profil |
#13 · Zasláno: 16. 3. 2011, 16:14:55
Symbolicky pro danou výseč:
if( pravý průsečík je níž než střed ){ "vezmi pixel vlevo od pravého průsečíku (resp. pravé svislé čáry)" }elseif( levý průsečík je níž než střed ){ "vezmi pixel vpravo od levého průsečíku (resp. levé svislé čáry)" }// else už není potřeba, protože začínáš od pomyslné 3 na hodinovém ciferníku |
||
Darker Profil |
#14 · Zasláno: 16. 3. 2011, 16:19:23 · Upravil/a: Darker
petr 6:
Na tohle jsem tak nějak přišel, ale jak bys to udělal, kdybys netušil, od kolika se začíná? Nicméně už se mi to podařilo udělat aspoň tak, jak jsi navrhnul a funguje to. Jen ta třetí možnost mě vrtá hlavou. Napadlo mě spočítat průsečík úsečky, vedoucí od středu té spodní elipsy, to by mohlo jít. |
||
petr 6 Profil |
#15 · Zasláno: 16. 3. 2011, 20:17:48
Darker:
„Na tohle jsem tak nějak přišel, ale jak bys to udělal, kdybys netušil, od kolika se začíná?“ Podle úhlu. Například kdybys měl úhel 0 svisle nahoru, tak dole máš interval 90 až 270, takže tou předchozí metodou bys nepodbarvil výseč, která by začínala na 89 a končila na 271. Ale vždycky budeš vědět interval úhlů, které máš "pod" elipsou, tj. jsou vidět. A vždycky taky budeš mít zadané jednotlivé výseče pomocí dvou úhlů, takže stačí porovnat. |
||
Časová prodleva: 13 let
|
0