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).
  1. header ('HTTP/1.1 200 OK');  
  2. header ("Content-type: image/png");  
  3.   
  4. // rajz szélessége  
  5. $w = 640;  
  6.   
  7. // rajz magassága  
  8. $h = 480;  
  9.   
  10. $im = imagecreatetruecolor ($w$h);  
  11. $white = imagecolorallocate ($im, 255, 255, 255);  
  12. $red = imagecolorallocate ($im, 255, 0, 0);  
  13. $green = imagecolorallocate ($im, 0, 255, 0);  
  14. $blue = imagecolorallocate ($im, 0, 0, 255);  
  15. $pink = imagecolorallocate ($im, 255, 0, 255);  
  16.   
  17. // origo  
  18. imageellipse ($im$w / 2, $h / 2, 4, 4, $green);  
  19.   
  20. // az ellipszis nagy tengely FELE  
  21. $a = 200;  
  22.   
  23. // az ellipszis kis tengely FELE  
  24. $b = 100;  
  25.   
  26. // ív első szöge  
  27. $alpha = 0;  
  28.   
  29. // ív második szöge  
  30. $beta = 90;  
  31.   
  32. // az egész ellipszis  
  33. imageellipse ($im$w / 2, $h / 2, $a * 2, $b * 2, $blue);  
  34.   
  35. // a cikk kiemelve  
  36. imagearc ($im$w / 2, $h / 2, $a * 2, $b * 2, $alpha$beta$white);  
  37.   
  38. // a cikk szögének felezője  
  39. $gamma = ($alpha + $beta) / 2;  
  40.   
  41. // az egyik metszésont  
  42. $x1 = sqrt (1 / ((1 / pow ($a, 2)) + (pow (tan (M_PI / 180 * $gamma), 2)  / pow ($b, 2))));  
  43. $y1 = $x1 * tan (M_PI / 180 * $gamma);  
  44. imageellipse ($im$x1 + $w / 2, $y1 + $h / 2, 4, 4, $red);  
  45.   
  46. // a másik metszéspont  
  47. $x2 = -$x1;  
  48. $y2 = $x2 * tan (M_PI / 180 * $gamma);  
  49. imageellipse ($im$x2 + $w / 2, $y2 + $h / 2, 4, 4, $red);  
  50.   
  51.   
  52. // melyik síknegyedbe esik a jó metszéspont  
  53. $sx = cos (M_PI / 180 * $gamma) >= 0;  
  54. $sy = sin (M_PI / 180 * $gamma) >= 0;  
  55.       
  56. // az egyes koordináták előjeleiből kiválasztjuk a jó metszéspontot  
  57. if (($x1 >= 0) != $sx) {  
  58.     $x = $x2;  
  59.     $y = $y2;  
  60. else if (($x2 >= 0) != $sx) {  
  61.     $x = $x1;  
  62.     $y = $y1;  
  63. else if (($y1 >= 0) != $sy) {  
  64.     $x = $x2;  
  65.     $y = $y2;  
  66. else {  
  67.     $x = $x1;  
  68.     $y = $y1;  
  69. }  
  70. imageellipse ($im$x + $w / 2, $y + $h / 2, 8, 8, $pink);  
  71.   
  72. imagepng ($im);  
  73. imagedestroy ($im);  
11

Isten vagy!

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