Co se týče výseče, tak jsem si to zkusil trošku rozkreslit a něco dohledat a tohle by mělo fungovat:
Nejdřív nákres ať máme lepší představu:
https://ctrlv.cz/149iPak trochu vektorové matematiky, operace Cross product (jak je to v češtině nevím):
https://en.wikipedia.org/wiki/Cross_product- Kód: Vybrat vše
float Cross(float Ax, float Ay, float Bx, float By, float Cx, float Cy)
{
return ((Bx - Ax) * (Cy - Ay) - (By - Ay) * (Cx - Ax));
}
Funkce má jako vstup 3 body A,B,C a jejich pozice x a y. Bod A je střed kružnice, bod B je krajní bod té výseče a bod C je testovaný bod.
Funkce Cross vrátí hodnotu, která může být kladná a nebo záporná. To zda bude kladná/záporná je dáno tím zda bod C je od vektoru AB "vlevo" nebo "vpravo". Vzhledem k tomu že je to vektorový výpočet tak to funguje pro různé otočení stále stejně. Tj když si papír otočíš tak aby šipka vektoru ukazovala nahoru, tak vždy podle toho zda je výsledek + nebo - poznáš zda je bod C vlevo nebo vpravo. Nemusíš se tedy starat o to v jakém kvadrantu jseš. "Vždy" musí platit že bod C musí být od vektoru AB1 napravo
a současně od vektoru AB2 musí být nalevo. To vždy mám v uvozovkách protože to není vždy, ale platí to jen v případě že úhel té výseče je menší než 180°.
Pokud je úhel větší než 180° tak to neplatí, protože bod C se může dostat do místa kde by měl být od obou vektorů směrem vlevo/vpravo. viz nákres č.2:
https://ctrlv.cz/y897Ale to se dá vyřešit jednoduchou změnou podmínky. tj: "Vždy" musí platit že bod C musí být od vektoru AB1 napravo
NEBO od vektoru AB2 musí být nalevo.
Takže to taky není úplně bezproblémové i zde se musí hlídat zda je úhel výseče menší/větší než 180° (tj polovina kruhu) Ale to zas není až takový problém tam mít ten jeden IF navíc, kde zjišťuješ úhel výseče a v jednom případě použiješ logický AND a ve druhém případě logický OR mezi testami levé/pravé strany vektoru výseče.
Samozřejmě vždy musí platit i to co jsem psal dříve. Bod C musí být uvnitř křužnice viz pythagorova věta.
Body B1 a B2 nemusí ležet na kružnici, slouží jen pro určení směru vektoru, takže mohou mít libovolnou pozici na daném vektoru (pokud ho tedy neotočí na opačnou stranu.
Ale co z toho bude lepší na implementaci nevím. Každé řešení má něco do sebe. A co z toho je lepší by asi záleželo na tom jak budeš mít uloženou/zadanou tu výseč kruhu. Což není vůbec jasné protože to jsi nenapsal takže dost pochybuji že jsi psal o "výseči" ale měl jsi na mysli jen ten jednoduchý kruh.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)