aboutsummaryrefslogtreecommitdiff
path: root/include/fml/curve.h
blob: 8a705cd71a8de62585caa4dfdf02c6c9d2cf56a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#ifndef CURVE_H
#define CURVE_H

#include <cmath>
#include <iostream>

#include "fml.h"

#include "manifold.h"

namespace fml {

/* All curves inherit this class (which is empty because Manifold has
 * everything we need). */
    class Curve : public Manifold {
    public:
        const int dimension() const { return 1; }
    };

    class LineSegment : public Curve {
    private:
        vec3 a, b;
    public:
        LineSegment(vec3 a_, vec3 b_) : a(a_), b(b_) {};

        vec3 integrate(vec3 (*integrand)(vec3 s, vec3 ds), scalar delta) const;

        const char *name() const { return "LineSegment"; }

        friend std::istream operator>>(std::istream &is, LineSegment &ls);
    };

    std::istream operator>>(std::istream &is, LineSegment &ls);

    class Arc : public Curve {
    private:
        vec3 center;

        /* these are relative to the center (direction will be determined
         * by RHR of normal), and should be orthonormal */
        vec3 radius, normal;

        /* how many radians the arc extends for (can be greater than 2pi) */
        scalar angle;
    public:
        Arc(vec3 c_, vec3 r_, vec3 n_, scalar th) : center(c_), radius(r_), normal(n_), angle(th) {};

        vec3 integrate(vec3 (*integrand)(vec3 s, vec3 ds), scalar delta) const;

        const char *name() const { return "Arc"; }

        friend std::istream operator>>(std::istream &is, LineSegment &ls);
    };

    std::istream operator>>(std::istream &is, LineSegment &ls);

    class Spiral : public Curve {
    private:
        vec3 origin;

        /* these are relative to the center (direction will be determined
         * by RHR of normal), and should be orthonormal */
        vec3 radius, normal;

        /* how many radians the arc extends for (can be greater than 2pi) */
        scalar angle;

        /* linear distance between turns (2pi) */
        scalar pitch;
    public:
        Spiral(vec3 c_, vec3 r_, vec3 n_, scalar th, scalar p) : origin(c_), radius(r_), normal(n_), angle(th), pitch(p) {};

        vec3 integrate(vec3 (*integrand)(vec3 s, vec3 ds), scalar delta) const;

        const char *name() const { return "Solenoid"; }

        friend std::istream operator>>(std::istream &is, LineSegment &ls);
    };

    std::istream operator>>(std::istream &is, LineSegment &ls);

    class Toroid : public Curve {
    private:
        vec3 origin;

        /* these are relative to the center (direction will be determined
         * by RHR of normal), and should be orthonormal */
        vec3 major_radius, major_normal;

        /* "thickness" of toroid */
        scalar minor_r;

        /* how many radians (about the center) the toroid extends for
         * (can be greater than 2pi) */
        scalar major_angle;

        /* central angle between successive turns (2pi rotation of small
         * radius vector) */
        scalar pitch;
    public:
        Toroid() {};
        Toroid(vec3 o, vec3 maj_r, vec3 maj_n, scalar ang, scalar min_r, scalar p) : origin(o), major_radius(maj_r), major_normal(maj_n), major_angle(ang), minor_r(min_r), pitch(p) {};

        vec3 integrate(vec3 (*integrand)(vec3 s, vec3 ds), scalar delta) const;

        const char *name() const { return "Toroid"; };

        friend std::istream operator>>(std::istream &is, LineSegment &ls);
    };

    std::istream operator>>(std::istream &is, LineSegment &ls);
}
#endif