проблем со скорость конеш нет, но все же мне интересно как можно "оптимизировать" что б уменьшить количество операций:
в приветном методе recurs класса seakgBizie
может кто укажет на не корректное написание кода... или предложит как более грамотно переписать...
просто надоел подход: "Главное что б работало"... хочет чего то нового...
Код: Выделить всё
#include <math.h>
#include <vcl.h>
#include <vector.h>
//вспомогательный класс
class coordPoint
{
public:
coordPoint() : x(0), y(0) {};
coordPoint(double X, double Y) : x(X), y(Y) {};
void setXY(double X, double Y) { x = X; y = Y; };
void setX(double X) { x = X; };
void setY(double Y) { y = Y; };
double getX() { return x; };
double getY() { return y; };
//--------------------------------------------------------------------
double lengthTo(double X, double Y)
{
double dX = X - x, dY = Y - y;
if( ( dX == 0 ) && ( dY == 0 ) ) return 0;
return sqrt(dX*dX + dY*dY);
};
//--------------------------------------------------------------------
double lengthTo(coordPoint p)
{
return lengthTo(p.getX(), p.getY());
};
//--------------------------------------------------------------------
coordPoint midpointLine(coordPoint toPoint)
{
coordPoint point;
point.setX( (toPoint.getX() - x) / 2.0 + x);
point.setY( (toPoint.getY() - y) / 2.0 + y);
return point;
};
private:
double x,y;
};
//собственно класс кривой Безье:
class seakgBizie
{
public:
void draw(TCanvas *canvas)
{
canvas->MoveTo( dest[0].getX(), dest[0].getY());
for(unsigned int i = 1; i < dest.size(); i++)
{
canvas->LineTo( dest[i].getX(), dest[i].getY() );
};
};
vector<coordPoint> &getVectorBizie()
{
return dest;
};
bool calculate(vector<coordPoint> &points, int max)
{
if(points.size() < 2) return false;
dest.clear();
recurs(points, 0, max);
return true;
};
private:
vector<coordPoint> dest;
void recurs(vector<coordPoint> points, int sch, int max)
{
if(sch <= max)
{
vector<coordPoint> left, right, buf1, buf2;
//записываем крайние точки изначального вектора
left.push_back( points[0] );
right.push_back( points[points.size() - 1] );
//рассчитываем половинные значения
unsigned int pointsSize = points.size();
for(unsigned int i = 1; i < pointsSize; i++)
{
buf2.clear();
for(unsigned int b1 = 0; b1 < points.size() - 1; b1++)
buf2.push_back(points[b1].midpointLine( points[b1 + 1] ));
//записываем крайние точки
left.push_back( buf2[0] );
right.push_back( buf2[ buf2.size() - 1 ] );
//копируем из buf2 в points
points.clear();
for(unsigned int i = 0; i < buf2.size(); i++)
points.push_back( buf2[i] );
};
//инвертируем вектор right
buf2.clear();
for(unsigned int i = 0; i < right.size() ; i++)
buf2.push_back( right[right.size() - i - 1] );
//вызываем следующие функцию
sch++;
recurs( left, sch, max);
recurs( buf2, sch, max);
}
else
{
//записываем результат
for(unsigned int i = 0; i < points.size(); i++)
dest.push_back(points[i]);
};
};
};
//пример использования:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
vector<coordPoint> random_points;
//заполняем массив случайными значениями
int max_x = Image1->Width - 40;
int max_y = Image1->Height - 40;
randomize();
int count_point = random(12) + 3;
for(int i = 0; i < count_point; i++)
{
int x = random(random(max_x)) + 20;
int y = random(random(max_y)) + 20;
coordPoint p( x, y );
drawTop(Image1, p, 3, "p" + IntToStr(i) );
random_points.push_back(p);
};
seakgBizie bizie;
bizie.calculate(random_points,4);
bizie.draw(Image1->Canvas);
}