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; }
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; } } }