コード例 #1
0
ファイル: main.c プロジェクト: JakubJakobczyk/Learning
int main()
{
        /*
        zmienne przechowujace dane wprowadzane przez uzytkownika:
        dokladnosc_k - dokladnosc k dla pi
        dokladnosc_n - dokladnosc n dla funkcji y = erf(x)
        x- argument dla funkcji x

        pozostale zmienne:
        index - licznik dla petli
        pi_k - wartosc pi od zadanej dokladnosci k
        */
    int dokladnosc_k = 1, dokladnosc_n = 0, index = 0;
    double x = 0.0, wynik = 0.0, pi_k = 0.0;

        /*pobieranie danych*/
    printf("Podaj naturalna dokladnosc k dla liczby pi:\n");
    scanf("%d", &dokladnosc_k);
    printf("Podaj naturalna dokladnosc n dla funkcji erf(x):\n");
    scanf("%d", &dokladnosc_n);
    printf("Podaj argument x z przedzialu (-2, 2):\n");
    scanf("%lf", &x);

        /*obliczanie sumy:*/
    wynik += sumy(dokladnosc_n, x);
        /*obliczanie pi*/
    pi_k = pi(dokladnosc_k);

        /*mnozenie sumy przez 2/pierwiastek z pi*/
    wynik*=(2/sqrt(pi_k));

        /*wyswietlanie wyniku obu szeregow (pi oraz erf)*/
    printf("\n");
    printf("Pi dla dokladnosci k=%d wynosi %lf\n", dokladnosc_k, pi_k);
    printf("erf(%lf)=%lf\n", x, wynik);

    return 0;
}
コード例 #2
0
  template<class K> typename K::FT intersection_area(const Rectangle_2<K>& a, const Rectangle_2<K> &b) {
    typedef typename K::Vector_2 Vector_2;
    typedef typename K::FT FT;

    if(a.is_degenerate() || b.is_degenerate()) return 0;
        Vector_2 v(b.center()-a.center());
        Vector_2 m(-a.normal().y(),a.normal().x());
        FT n2  = a.normal().squared_length();
        FT m2  = abs(a.ratio())*n2;
    FT br(abs(b.ratio()));
        FT cx = a.normal()*v;
        FT cy = m*v;
        FT nx = a.normal()*b.normal();
        FT ny = m*b.normal();
    switch(sign(nx)) {
    case ZERO : { // m and b.normal() are collinear
        ny = abs(ny);
        FT mx = br*ny;
        FT lx = cx-mx;
        FT rx = cx+mx;
        FT by = cy-ny;
        FT ty = cy+ny;
            if(rx<=-n2 || n2<=lx || ty<=-m2 || m2<=by) return 0;
        return (min(n2,rx)-max(-n2,lx))*(min(m2,ty)-max(-m2,by))/n2;
        }
    case NEGATIVE : // b.normal() =rotate180(b.normal())
        { nx = -nx; ny = -ny; }
    default : ;
    }
        FT mx =-br*ny;
        FT my = br*nx;
    switch(sign(ny)) {
    case ZERO : { // n and b.normal() are collinear
        FT lx = cx-nx;
        FT rx = cx+nx;
        FT by = cy-my;
        FT ty = cy+my;
            if(rx<=-n2 || n2<=lx || ty<=-m2 || m2<=by) return 0;
        return (min(n2,rx)-max(-n2,lx))*(min(m2,ty)-max(-m2,by))/n2;
        }
    case NEGATIVE : // b.normal() =rotate90(b.normal())
        nx = -nx; std::swap(nx,mx);
        ny = -ny; std::swap(ny,my);
    default : { // nx>0, ny>0, mx<0 and my>0 case
        FT sumx(nx+mx), sumy(ny+my);
        FT difx(nx-mx), dify(ny-my);
        FT x[] = { cx-sumx, cx+difx, cx+sumx, cx-difx }; // bottom, right, top, left
        FT y[] = { cy-sumy, cy+dify, cy+sumy, cy-dify };
            if(y[0]>=m2 || y[2]<=-m2 || x[3]>=n2 || x[1]<=-n2) return 0; // one edge of "this" separates the 2 rectangles
        FT area =  Impl::triangle_area(n2, m2, x[2], y[2], x[1], y[1])
            +  Impl::triangle_area(m2, n2, y[3],-x[3], y[2],-x[2])
            +  Impl::triangle_area(n2, m2,-x[0],-y[0],-x[3],-y[3])
            +  Impl::triangle_area(m2, n2,-y[1], x[1],-y[0], x[0]);
        // iso-rectangle area
        FT lx = x[0], by = y[1];
        FT rx = x[2], ty = y[3];
        FT s  = 1;
        if(lx>rx) { std::swap(lx,rx); s=-s; }
        if(by>ty) { std::swap(by,ty); s=-s; }
        if(by>=m2 || ty<=-m2 || lx>=n2 || rx<=-n2) return area/n2;
        return (area + s*(min(n2,rx)-max(-n2,lx))*(min(m2,ty)-max(-m2,by)))/n2;
    }
    }

}