Path: blob/devel/ElmerGUI/netgen/libsrc/csg/curve2d.cpp
3206 views
#include <mystdlib.h>12#include <myadt.hpp>3#include <csg.hpp>45namespace netgen6{7CircleCurve2d :: CircleCurve2d (const Point<2> & acenter, double arad)8{9center = acenter;10rad = arad;11}1213void CircleCurve2d :: Project (Point<2> & p) const14{15Vec<2> v = p - center;16v *= rad/v.Length();17p = center + v;18}1920void CircleCurve2d :: NormalVector (const Point<2> & p, Vec<2> & n) const21{22n = p - center;23n /= n.Length();24}25262728293031QuadraticCurve2d :: QuadraticCurve2d ()32{33cxx = cyy = cxy = cx = cy = c = 0;34}3536void QuadraticCurve2d :: Read (istream & ist)37{38ist >> cxx >> cyy >> cxy >> cx >> cy >> c;39}404142void QuadraticCurve2d :: Project (Point<2> & p) const43{44double f, x, y, gradx, grady, grad2;45int its = 0;4647x = p(0);48y = p(1);4950do51{52f = cxx * x * x + cyy * y * y + cxy * x * y + cx * x + cy * y + c;53gradx = 2 * cxx * x + cxy * y + cx;54grady = 2 * cyy * y + cxy * x + cy;55grad2 = gradx * gradx + grady * grady;5657x -= f * gradx / grad2;58y -= f * grady / grad2;5960// (*mycout) << "x = " << x << " y = " << y << " f = " << f << endl;61its++;62}63while (fabs (f) > 1e-8 && its < 20);64if (its >= 20)65cerr << "QuadraticCurve2d::Project: many iterations, f = " << f << endl;66p(0) = x;67p(1) = y;68}697071void QuadraticCurve2d :: NormalVector (const Point<2> & p, Vec<2> & n) const72{73n(0) = 2 * cxx * p(0) + cxy * p(1) + cx;74n(1) = 2 * cyy * p(1) + cxy * p(0) + cy;75n.Normalize();76}77}787980