Autor Zpráva
Darker
Profil
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
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
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 *
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
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
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
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
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
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
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
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
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
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: