Example #1
0
int lem::Math::FindLeftPoint( const RArray& xi, REAL X )
{
 const int i0 = xi.GetFrom();
 const int in = xi.GetTo();

 // »щем две точки, лежащие слева и справа от заказанной
 // абсциссы.
 const REAL xa=xi(i0), xb=xi(in);

 int LeftNode = i0 + int((X-xa)/(xb-xa));
 int irange   = (in-i0)/2+(in-i0)%2;

 if( X<=xa || X>=xb )
  {
   // “очка уже вне пределов заданных абсцисс.
   if( X<=xa )
    LeftNode=i0;
   else
    LeftNode=in-1;
  }
 else
  FOREVER
   {
    if( xi(LeftNode)<=X && xi(LeftNode+1)>=X )
     break;

    if( xi.get(LeftNode)>=X )
     {
      // »щем в левом поддиапазоне.
      if( (irange/=2) < 1 )
       irange=1;

      LeftNode -= irange;

      if( LeftNode<i0 )
       LeftNode=i0;
     }
    else
     {
      // »щем в правом поддиапазоне.
      if( (irange/=2) < 1 )
       irange=1;

      LeftNode += irange;

      if( LeftNode>in-1 )
       LeftNode=in-1;
     }
   }

 return LeftNode;
}