naravno da bi to bilo najsporije rešenje. to kako si ti počeo sa crvenim granicama je dobra ideja, ali nije potpuna.
elem, da bi našao sve zelene površine na slici, treba da odbaciš sve druge.
počni recimo od donjeg kamena na tvojoj slici. nađeš njegovu "najleviju" i njegovu "najdesniju" tačku, gledano iz ugla posmatrača. to su njegova gornja-leva i donja-desna tačka u ovom primeru.
zatim, izračunaš uglove pod kojim posmatrač vidi te tačke (ako posmatrača translacijom staviš u centar koordinatnog sistema, onda ugao tačke (x,y) računaš kao arctan(x/y)) i sve između tog najmanjeg i najvećeg ugla (tj između "najlevije" i "najdesnije" tačke za taj kamen) je nevidljivo.
ovaj postupak ponoviš za svo kamenje, i dobiješ da su neviljivi uglovi npr od 13-24, 150-191 i 230-299 stepeni. zatim lepo prođeš kroz sve stubove, i za svaki izračunaš ugao pod kojim ga vidi posmatrač (opet ista formula) i odbaciš sve koji upadaju u jedan od ovih intervala.
(alternativno, ova provera možda može i brže ako jednostavno ispituješ da li je tačka ispot/iznad ovih graničnih pravi, ali tu ima malo više spec slučajeva, a i nisam sugran koliko brže bi to stvarno i bilo, jer svi moderni procesori u FPU imaju tablice za sinusne/kosinusne i sve izvedene funkcije, pa je i to računanje arctan() prilično brzo)
e to je bilo prosto i elegantno rešenje. ali kao što rekoh, nije kompletno. vidi dopunjenu sliku. zaboravio si da računaš i ove plave delove kao vidljive.
nažalost, ne mogu baš da vidim elegantan način za određivanje koji su tačno stubići u toj plavoj oblasti. naravno, prost metod je da računaš udaljenost stubića od posmatrača (koren iz x
2+y
2), i da ispituješ da li je štap bliži od kamena, ali se to komplikuje u okolini samog kamenja (baš primetno oko trouglastog kamena)
no, ovo bi trebalo da ti bude dosta domaćeg za danas.. možda u međuvremenu neko nešto i smisli ;)
// inače: ovo je više za forum Art of Programming, pa se moli moderator...