Здравствуйте, Programador, Вы писали:
P>Этот код не эквивалентен исходному. Вы лихо перенесли автоматические объекты в приватную часть класса. А время жизни?
Я постарался его учесть. Если ты про TGL::Circle< ValueType > c; то я сделал допущение, что на функцию c.Estimate( points[i], points[j], points[k] ); не влияет предыдущее состояние объекта с.
Остальное вроде правильно, с поправкой на то, что состояние аргументов функции не изменится между вызовами конструктора и EstimateContour. Кстати, на таком подходе иногда удаётся ускорить функции в разы. Допустим, если есть проверка пересечения луча с большим количеством боксов — замена функции на функтор — даёт приличное ускорение.
P>Если даже на это не смотреть, то область видимости расширилась на другие методы. И потом исходный код на экран помещался а этот 2 раза перелистывать нужно В общем ф топку
Отдельные функции стали меньше. То что код был в виде кирпича — не означало его лучшей читабельности. Вот тебе другой пример
Даже чуть короче исходного, видимо — чуть читабельнее?
template< class ValueType >
struct ContourEstimator {
typedef TGL::Point< ValueType, 2 >TPt;
typedef TGL::Polygon< ValueType, 2 >TPn;
ContourEstimator(const TPt* p,size_t cp,const TPn& pn,const CirclesCondition& cc,const PointsCondition& pc)
: points(p), cpoint(cp), polygon(pn), circlesCond(cc), pointsCond(pc), inv1(p[0]), inv2(p[0]) {}
void EstimateContour(){
for(size_t i=0; i<cpoint; ++i){
// отбрасываем точки вне оболочки
if( !polygon.IsPointIn( points[i] ) )continue;
if( !EstimateContourDim2( i ) )break;
}
EstimateHull( circles, points, cpoint );
}
std::vector<TGL::Circle< ValueType >> circles;
TPt inv1, inv2;
const TPt* points;
size_t cpoint;
const TPn& polygon;
const CirclesCondition& circlesCond;
const PointsCondition& pointsCond;
bool EstimateContourDim2(size_t i){
for(size_t j=i+1; j<cpoint; ++j){
// первое условие двойственности
if(!circlesCond.CheckFirst(points[i],points[j],pointsCond)||!EstimateContourDim3(i,j))return false;
}
return true;
}
bool EstimateContourDim3(size_t i, size_t j){
pointsCond.Invert( inv1, points[j] );
for(size_t k=j + 1; k<cpoint; ++k){
// второе условие двойственности
if( !circlesCond.CheckSecond( points[j], points[k], pointsCond ) )return false;
pointsCond.Invert( inv2, points[k] );
TGL::Circle< ValueType > c;
c.Estimate( points[i], points[j], points[k] );
c.Refine( inv1, inv2 );
// сохраняем если центр окружности принадлежит оболочке
// и найденные параметры входят в заданный диапазон
if( polygon.IsPointIn( c.Center() ) && circlesCond.Check( c ) )circles.push_back( c );
}
return true;
}
};