Hola,
nejsem si jistý, jestli je tohle středoškolská (tam jsme to možná brali?), vysokoškolská (tam jsem to, pokud vím, nikdy neřešil) nebo základoškolská matematika (a to už si nějak nepamatuju), tak se snad nikdo nebude zlobit, že jsem to dal zrovna sem.. Každopádně k problému:
Mám výsečový graf a v něm výseč. Do té výseče potřebuju na střed mezi vnějším a vnitřním okrajem grafu umístit popisek, jehož velikost (obdelník, do kterého se vejde) znám. Znám radius vnitřní i vnější kružnice i počáteční a koncovej úhel výseče. Potřebuju spočítat souřadnice středu popisku (jeho střed je na středu mezi vnější a vnitřní kružnicí) a to, jestli se vejde do výseče. Znázorňuje to přiloženej obrázek - co je černě, to znám a co je červeně, to potřebuju zjistit (+ to, zda se obdelník znázorňující popisek vejde do výseče). Předpokládám, že to půjde spočítat goniometrickými funkcemi, ale momentálně nejsem schopný přijít na to, jak je s tím, co znám, můžu použít :)
Potřebuju z toho udělat algoritmus v Javě. Momentálně počítám souřadnice středu label obdelníku takhle, ale nevím, jestli je to dobře:
Kód:
float labelX = rect.centerX() + ((dimen/2+dimen*innerRadius)/2) * (float)Math.cos((startAngle+endAngle)/2);
float labelY = rect.centerY() + ((dimen/2+dimen*innerRadius)/2) * (float)Math.sin((startAngle+endAngle)/2);rect je čtverec kolem kružnice, dimen je průměr kružnice, innerRadius je konstanta vyjadřující poměr POLOMĚRU vnitřní kružnice vzhledem k průměru vnější, startAngle je počáteční úhel, od kterého se výseč kreslí, endAngle je procento, které daná výseč zabírá * 360°.
Nějaké nápady, prosím? :)
Obrázek:
http://i.imgur.com/aGP8nxZ.png
Offline
Tak už jsem to vyřešil svépomocí :)
Střed obdélníku:
float labelX = rect.centerX() + (innerCircleRadius * (float)Math.cos(Math.toRadians(startAngle+sweepAngle/2))); float labelY = rect.centerY() + (innerCircleRadius * (float)Math.sin(Math.toRadians(startAngle+sweepAngle/2)));
V podstatě jen střed grafu + poloměr středu mezi vnitřní a vnější kružnicí (jejich součet / 2) vynásobený pro X cosinem a pro Y sinem počátečního úhlu a polovinou vzdálenosti ke koncovému úhlu (tedy střed mezi nimi).
Kontrolu, zda obdelník leží ve výseči jsem provedl tak, že pro každý z jeho vrcholů jsem provedl kontrolu, zda úhel mezi ním a 0° kružnice leží mezi počátečním a koncovým úhlem výseče (zde je jen třeba ošetřit přechod přes 0°, pokud se graf nevykresluje od 0°, ale například od 270° jako v mém případě).
Také se hodí zkontrolovat, zda jsou tyto body vzdáleny od středu kružnice tak, aby ležely mezi poloměry vnější a vnitřní kružnice.
Označuji jako vyřešené :)
Offline