Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/csg/curve2d.cpp
3206 views
1
#include <mystdlib.h>
2
3
#include <myadt.hpp>
4
#include <csg.hpp>
5
6
namespace netgen
7
{
8
CircleCurve2d :: CircleCurve2d (const Point<2> & acenter, double arad)
9
{
10
center = acenter;
11
rad = arad;
12
}
13
14
void CircleCurve2d :: Project (Point<2> & p) const
15
{
16
Vec<2> v = p - center;
17
v *= rad/v.Length();
18
p = center + v;
19
}
20
21
void CircleCurve2d :: NormalVector (const Point<2> & p, Vec<2> & n) const
22
{
23
n = p - center;
24
n /= n.Length();
25
}
26
27
28
29
30
31
32
QuadraticCurve2d :: QuadraticCurve2d ()
33
{
34
cxx = cyy = cxy = cx = cy = c = 0;
35
}
36
37
void QuadraticCurve2d :: Read (istream & ist)
38
{
39
ist >> cxx >> cyy >> cxy >> cx >> cy >> c;
40
}
41
42
43
void QuadraticCurve2d :: Project (Point<2> & p) const
44
{
45
double f, x, y, gradx, grady, grad2;
46
int its = 0;
47
48
x = p(0);
49
y = p(1);
50
51
do
52
{
53
f = cxx * x * x + cyy * y * y + cxy * x * y + cx * x + cy * y + c;
54
gradx = 2 * cxx * x + cxy * y + cx;
55
grady = 2 * cyy * y + cxy * x + cy;
56
grad2 = gradx * gradx + grady * grady;
57
58
x -= f * gradx / grad2;
59
y -= f * grady / grad2;
60
61
// (*mycout) << "x = " << x << " y = " << y << " f = " << f << endl;
62
its++;
63
}
64
while (fabs (f) > 1e-8 && its < 20);
65
if (its >= 20)
66
cerr << "QuadraticCurve2d::Project: many iterations, f = " << f << endl;
67
p(0) = x;
68
p(1) = y;
69
}
70
71
72
void QuadraticCurve2d :: NormalVector (const Point<2> & p, Vec<2> & n) const
73
{
74
n(0) = 2 * cxx * p(0) + cxy * p(1) + cx;
75
n(1) = 2 * cyy * p(1) + cxy * p(0) + cy;
76
n.Normalize();
77
}
78
}
79
80