Vec2 ScallopedSector::sample(RNG &rng) { float angle = calcAngleForArea(area*rng.getFloatL(), rng); float d1 = distToCurve(angle, 0); float d2 = distToCurve(angle, 1); float d = sqrt(d1*d1 + (d2*d2 - d1*d1)*rng.getFloat()); return Vec2(P.x + cos(angle)*d, P.y + sin(angle)*d); }
Vec2 ScallopedRegion::sample(RNG &rng) { if (!regions->size()) { printf("Fatal error, sampled from empty region."); exit(1); return Vec2(0,0); } else { float a = area*rng.getFloatL(); ScallopedSector &ss = (*regions)[0]; for (unsigned int i=0; i<regions->size(); i++) { ss = (*regions)[i]; if (a<ss.area) break; a -= ss.area; } return ss.sample(rng); } }