示例#1
0
double metodoPotencia(Matriz& A, vector<double>& x) {
  int length = x.size();
  vector<double> y(length, 0.0);
  int k = 0;
  double c2;

  A.multiplicarVectorDer(x, y);

  double c1 = maxAbs(y);
  double aux = c1;

  do {
    c1 = aux; // La primera vez esto no surte efecto

    for (size_t i = 0; i < length; ++i) // Normalizo vector
      x[i] = y[i] / c1; 

    Matriz::cerearVector(y); // Reseteo el vector y

    A.multiplicarVectorDer(x, y);

    c2 = maxAbs(y);
    aux = c2;

    ++k;
  
  } while(!igualdadConTolerancia(c1, c2) && k < 15000); // Experimentar con metodo de corte Y Epsilon para la tolerancia

  if (k >= 15000)
    std::cout << "estoy devolviendo fruta" << std::endl;

  return c2;

}
Foam::tmp<Foam::volScalarField>
Foam::populationBalanceSubModels::growthModels::constantGrowth::Kg
(
    const volScalarField& abscissa
) const
{   
    dimensionedScalar minAbs
    (
        "minAbs", 
        abscissa.dimensions(), 
        minAbscissa_.value()
    );

    dimensionedScalar maxAbs
    (
        "maxAbs", 
        abscissa.dimensions(), 
        maxAbscissa_.value()
    );

    dimensionedScalar CgND
    (
        "CgND", 
        inv(abscissa.dimensions())*inv(abscissa.dimensions())*Cg_.dimensions(), 
        Cg_.value()
    );

    return CgND*pos(-abscissa+maxAbs)*pos(abscissa-minAbs);
}
示例#3
0
文件: widget.cpp 项目: 4b4b/CG
void Widget::paintEvent(QPaintEvent *)
{
    int i, nSteps, count;
    double t, tt, scale = ( width()/4 + height()/4 )/6, sum, k;
    double x, y, z, delta = 0.005, dxdt = 1, dydt = 1, tempDelta;

    my_vector4 xyz(0.0, 0.0, 0.0), xyz0(width()/2, height()/2, scale*5.0), xxyyzz(0.0, 0.0, 0.0),
            light_point(0.0, 0.0, scale*13.0), xyz_s(0.0,0.0,0.0), xxyyzz_s(0.0, 0.0, 0.0);

    QPainter p(this);

    if (!dF){
        delta = inpDelta;
        nSteps =  (2*pi) / delta  + 1;
    }
    else{
        delta = 0.05;
        count = 0;
        sum = 0;
        t = 0;
        tt = 0;
        k = 1;
        while (sum < 2*pi){
            dxdt = -inpA * sin( t ) + inpB * inpC * sin ( inpC * t );
            dydt = inpA * cos( t ) - inpB * inpC * cos ( inpC * t );
            tempDelta = delta/maxAbs(dxdt, dydt);
            t += tempDelta;
            sum+=tempDelta;
            count++;
        }
        nSteps = count + 1;
    }

    k = 1;
    t = 0;
    tt = 0;
    dxdt = 1;
    dydt = 1;

    for (i = 0; i < nSteps; i++){

        if(dF){
            dxdt = -inpA * sin( t ) + inpB * inpC * sin ( inpC * t );
            dydt = inpA * cos( t ) - inpB * inpC * cos ( inpC * t );
            k = 1/maxAbs(dxdt, dydt);
        }

        tempDelta = delta * k;
        tt = t + tempDelta;

        x = inpA * cos( t ) - inpB * cos ( inpC * t );
        y = inpA * sin( t ) - inpB * sin ( inpC * t );
        z = cos ( sqrt( x * x + y * y ) );
        t = t + tempDelta;

        xyz.setElem(0, x );
        xyz.setElem(1, y );
        xyz.setElem(2, z );

        x = inpA * cos( tt ) - inpB * cos ( inpC * tt );
        y = inpA * sin( tt ) - inpB * sin ( inpC * tt );
        z = cos ( sqrt( x * x + y * y ) );

        xxyyzz.setElem(0, x );
        xxyyzz.setElem(1, y );
        xxyyzz.setElem(2, z );


        if (flag) {
            rotateX ( xyz , beta);
            rotateX ( xxyyzz, beta );

            rotateY ( xyz, alpha );
            rotateY ( xxyyzz, alpha );
        }

        if (!flag){
            rotateY ( xyz , alpha);
            rotateY ( xxyyzz, alpha );

            rotateX ( xyz, beta );
            rotateX ( xxyyzz, beta );
        }

        xyz.numMul(scale);
        xxyyzz.numMul(scale);

        vecSum(xyz, xyz0);
        vecSum(xxyyzz, xyz0);

        getShadowXY(light_point, xyz, xyz_s);
        getShadowXY(light_point, xxyyzz, xxyyzz_s);

        p.setPen(Qt::darkMagenta);
        p.drawLine( xyz.getElem(0), xyz.getElem(1), xxyyzz.getElem(0), xxyyzz.getElem(1) );

        p.setPen(Qt::darkGray);
        p.drawLine( xyz_s.getElem(0), xyz_s.getElem(1), xxyyzz_s.getElem(0), xxyyzz_s.getElem(1) );

    }
}