Added support for GraphML input format
[hypercube:hypercube.git] / IO / io.cpp
1 #include <cmath>
2 #include "CORE/config.h"
3 #include "io.h"
4
5 using namespace std;
6
7 static const float Pi = 3.141592f;
8 static const float C1 = 0.866025f; /* sqrt(3)/2 */
9
10 ostringstream IO::ioerr;
11
12 CoordinatesF OutputProvider::edgeTextPosition(const LineF &line, float size,
13   const CoordinatesF &textBox)
14 {
15         float angle = atan2(abs(line.dy()), abs(line.dx()));
16         float h = textBox.y() / 2;
17         float w = textBox.x() / 2;
18         float hyp = sqrt(h*h + w*w);
19         float dist = hyp * sin(angle + asin(h / hyp));
20
21         LineF l(line);
22         l.setP1(l.pointAt(0.5));
23         l = l.normalVector();
24         l.setLength((size / 2) + dist);
25
26         return l.p2() - CoordinatesF(w, -h);
27 }
28
29 CoordinatesF OutputProvider::vertexTextPosition(const CoordinatesF &point,
30   float size)
31 {
32         return point + CoordinatesF(size / 2, size);
33 }
34
35 OutputProvider::Arrow OutputProvider::arrow(LineF &line, float size)
36 {
37         Arrow arrow;
38         float angle;
39
40         angle = atan2(-line.dy(), line.dx());
41         if (angle < 0)
42                 angle = 2 * Pi + angle;
43
44         arrow.p[0] = line.pointAt(1 - ((size / 2) / line.length()));
45         arrow.p[1] = CoordinatesF(sin(angle - Pi / 3) * size,
46           cos(angle - Pi / 3) * size) + arrow.p[0];
47         arrow.p[2] = CoordinatesF(sin(angle - Pi + Pi / 3) * size,
48           cos(angle - Pi + Pi / 3) * size) + arrow.p[0];
49
50         line.setP2(
51           line.pointAt(1 - ((size * C1 * 1.5f) / line.length())));
52
53         return arrow;
54 }
55
56 void OutputProvider::stringReplace(wstring &source, const wstring &find,
57   const wstring &replace)
58 {
59         size_t j = 0;
60
61         while ((j = source.find(find, j)) != wstring::npos) {
62                 source.replace(j, find.length(), replace);
63                 j += replace.length();
64         }
65 }
66
67 bool InputProvider::stringCaseCmp(const wstring &s1, const wstring &s2)
68 {
69         if (s1.length() != s2.length())
70                 return false;
71
72         for (size_t i = 0; i < s1.length(); i++)
73                 if (tolower(s1[i]) != tolower(s2[i]))
74                         return false;
75
76         return true;
77 }