ugrás a tartalomhoz

Megoldhatatlan feladat: PHP dinamikus kép - körív

Reactor · 2008. Jún. 23. (H), 17.40
Sziasztok!
Az elmult 1 napban a fejemet a falba vertem, de nem tudtam megoldani egy problémámat.
Adott a kör(elipszis) középpontja (pl. 500, 500)
Adott a kör(elipszis) szélessége és magassága >> Aránya (2:1)
És a körív szöge (pl. 0,60)
Szal imagearc($kep,500,500,200,100,0,60,$szin);-nek szeretném megkeresni azt a pontját, amin végmeny a körívfelező, és a körön kívül van valamennyivel.
Igen, grafikon lesz, és a kövekező, nem, nemjó google-s vagy bármilyen grafikon, nekem saját kell...
 
1

Hogy?

vbence · 2008. Jún. 23. (H), 18.17
Vegyél egy mély lélekzetet, és írd le úgy, amiből te is megértenéd... (esetleg mellékelj egy paintban készített grafikát).

Ha jól értem: van egy ellipszis-szeleted, és kíváncsi vagy az ellipszis középpontjából indított szögfelező egyenes és az ellipszis-vonal metszéspontjának koordinátáira?

(ja, és máskor próbálj olyan témacmet adni, hogy mások, hasonló problémával megtalálhassák.)
2

:))

Reactor · 2008. Jún. 23. (H), 18.28
Igen, a szögfelező és a körív metszéspontjának megállapítása tökéletes megoldás lenne. Bocsi a hülye címezésért, csak gyorsan írtam mert el kellett mennem.
Vázlat:
http://linework.atw.hu/geom2.PNG
3

ez nem php...

gex · 2008. Jún. 23. (H), 18.34
...ez színtiszta geometria. keresd meg az elméletet hozzá, aztán azt írd át php-ra.
4

Az elmúlt 24 óra

Reactor · 2008. Jún. 23. (H), 18.38
1 napja mást se csinálok, még a matektanáromat is megkérdeztem. :)
No, akkor folytatom a hajszát, ha szépen kérlek titeket, akkor még Google barátunkal körüljárjátok a webet? Hátha én csináltam/fogalmaztam valamit rosszul.
5

Koordináta-geo

vbence · 2008. Jún. 23. (H), 19.09
Nem vesszük el a megoldás örömét.. :) Ezeket nézd meg:

http://hu.wikipedia.org/wiki/Ellipszis_(görbe)#Az_ellipszis_egyenletei
http://hu.wikipedia.org/wiki/Egyenes

Az ellipszis egyenleteiből az első lesz neked a hasznos, az egyenes egyenleteiből pedig az iránytangenses. Egy paraméteres egyenletet fogsz kapni, amiből kifejezeted az x-et és y-t, ezzel máris megvan a képleted.
(Arra figyej, hogy itt egy egyenessel dolgozol, tehát két metszéspontja lesz az ellipszissel. Ezekből a végén még ki kell választanod a jót, de erről majd később ;)
6

És mit mondott a matektanár?

s_volenszki · 2008. Jún. 23. (H), 19.18
Aki a matekhez ért annak pedig ez nem bonyolult feladat!

Tekintsd az elipszised középpontját egy lokális koordináta rendszer középpontjának. Az elipszis egyenletével (wiki) számold ki az elipszis összes koordinátáját (koordináta pártokat), amik a koordináta rendszered 4. negyedébe esnek és töltsd bele egy tömbbe.

Számold ki a 45 fokban csökkenő egyenes összes koordinátáját (wiki) és töltsd tömbbe.

Mivel a számítógép roppant gyors, simán be is iterálhatod, de lehet hogy célravezetőbb az azonosokat keresni a két tömbben.

s_volenszki

Szerk:

A francba! A kolega gyorsabb volt, de úgy látom, Ő sokkal racionálisabb választ adott, míg én maradtam a józan paraszti észnél! :)
8

hogy?

Szekeres Gergő · 2008. Jún. 24. (K), 09.28
nem kötözködésképpen, de "Az elipszis egyenletével (wiki) számold ki az elipszis összes koordinátáját (koordináta pártokat), amik a koordináta rendszered 4. negyedébe esnek és töltsd bele egy tömbbe." hogy valósítod meg? végtelen számú ilyen pont van, hisz nem csak egészeket vehetnek fel.. :)
10

Igen, valóban...

s_volenszki · 2008. Jún. 24. (K), 10.14
...bocsánat, azt kifelejtettem, hogy képpont a raszter, azaz csak egész számok játszanak.
7

Ááá!

Reactor · 2008. Jún. 23. (H), 21.32
Azt kifelejtettem a mondókámból hogy most megyek tizedikbe, szal, ennek a 75%-a setét. Kicsit bővebben? :S
Bocsi hogy buta vagyok, de ez majd a jövő zenéje. Most egy kiselőadásban segítenél nekem?:) Légyszi o_O!
9

Még megengedhető

vbence · 2008. Jún. 24. (K), 09.53
Az ellipszis egyenlete a wikiről (a hatványozást az olvashatóság kevéért a kalapkával írom, a php-ben viszont ez egész mást jelent, ott a pow függvény való erre):
x ^ 2 / a ^ 2 + y ^ 2 / b ^ 2 = 1

Az egyenesed egyenlete (a szöget gammának hívom, mert az alfa és béta az ív két szöge):
tan(gamma) = y / x
ebből:
y = x * tan(gamma)

Ezt visszahelyettesítve az első képletbe:
x ^ 2 / a ^ 2 + (x * tan(gamma)) ^ 2 / b ^ 2 = 1
ezt rendezve:
x1 = sqrt(1 / (1 / a^2 + tan(gamma)^2 / b^2))
és a gyökvonás miatt van még egy gyök:
x2 = -x1

Ezt a két x-et visszahelyettesítve az y-os képletbe azt is megkapod, és ott vana két pontod. Még meg kell vizsgálnod, melyik esik abba a síknegyedbe, ahova a gammád, erre jobb megoldás nem jutott eszembe a forrásban láthatónál (előjelek vizsgálata).

	header ('HTTP/1.1 200 OK');
	header ("Content-type: image/png");
	
	// rajz szélessége
	$w = 640;
	
	// rajz magassága
	$h = 480;
	
	$im = imagecreatetruecolor ($w, $h);
	$white = imagecolorallocate ($im, 255, 255, 255);
	$red = imagecolorallocate ($im, 255, 0, 0);
	$green = imagecolorallocate ($im, 0, 255, 0);
	$blue = imagecolorallocate ($im, 0, 0, 255);
	$pink = imagecolorallocate ($im, 255, 0, 255);
	
	// origo
	imageellipse ($im, $w / 2, $h / 2, 4, 4, $green);

	// az ellipszis nagy tengely FELE
	$a = 200;
	
	// az ellipszis kis tengely FELE
	$b = 100;
	
	// ív első szöge
	$alpha = 0;
	
	// ív második szöge
	$beta = 90;
	
	// az egész ellipszis
	imageellipse ($im, $w / 2, $h / 2, $a * 2, $b * 2, $blue);
	
	// a cikk kiemelve
	imagearc ($im, $w / 2, $h / 2, $a * 2, $b * 2, $alpha, $beta, $white);
	
	// a cikk szögének felezője
	$gamma = ($alpha + $beta) / 2;
	
	// az egyik metszésont
	$x1 = sqrt (1 / ((1 / pow ($a, 2)) + (pow (tan (M_PI / 180 * $gamma), 2)  / pow ($b, 2))));
	$y1 = $x1 * tan (M_PI / 180 * $gamma);
	imageellipse ($im, $x1 + $w / 2, $y1 + $h / 2, 4, 4, $red);
	
	// a másik metszéspont
	$x2 = -$x1;
	$y2 = $x2 * tan (M_PI / 180 * $gamma);
	imageellipse ($im, $x2 + $w / 2, $y2 + $h / 2, 4, 4, $red);
	
	
	// melyik síknegyedbe esik a jó metszéspont
	$sx = cos (M_PI / 180 * $gamma) >= 0;
	$sy = sin (M_PI / 180 * $gamma) >= 0;
		
	// az egyes koordináták előjeleiből kiválasztjuk a jó metszéspontot
	if (($x1 >= 0) != $sx) {
		$x = $x2;
		$y = $y2;
	} else if (($x2 >= 0) != $sx) {
		$x = $x1;
		$y = $y1;
	} else if (($y1 >= 0) != $sy) {
		$x = $x2;
		$y = $y2;
	} else {
		$x = $x1;
		$y = $y1;
	}
	imageellipse ($im, $x + $w / 2, $y + $h / 2, 8, 8, $pink);
	
	imagepng ($im);
	imagedestroy ($im);
11

Isten vagy!

Reactor · 2008. Jún. 24. (K), 20.35
Köszi!! ááá, na suhanok kipróbálom.