Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
conic-4.cpp
Go to the documentation of this file.
1
8#include <2geom/d2.h>
9#include <2geom/sbasis.h>
10#include <2geom/sbasis-math.h>
12
13#include <toys/path-cairo.h>
15
16using std::vector;
17using namespace Geom;
18
19const double w = 1./3;
20const double cwp = cos(w*M_PI);
21const double swp = sin(w*M_PI);
22/*double phi(double t, double w) { return sin(w*t) - w*sin(t); }
23double phih(double t, double w) { return sin(w*t) + w*sin(t); }
24double b4(double t, double w) {return phi(t/2,w)*phih(t/2,w)/(swp*swp);}
25double b3(double t, double w) {return cwp*phi(t,w)/(2*swp) - cwp*cwp*b4(t,w); }
26double b2(double t, double w) {return 2*w*w*sin(t/2)*sin(t/2);}
27double b1(double t, double w) {return b3(2*M_PI - t, w);}
28double b0(double t, double w) {return b4(2*M_PI - t, w);}*/
29
30class arc_basis{
31public:
32 Piecewise<SBasis> basis[5];
33 double w;
34
35 Piecewise<SBasis> phi(Piecewise<SBasis> const &d, double w) {
36 return sin(d*w) - sin(d)*w;
37 }
38 Piecewise<SBasis> phih(Piecewise<SBasis> const &d, double w) {
39 return sin(d*w) + sin(d)*w;
40 }
41 Piecewise<SBasis> b4(Piecewise<SBasis> const &d, double w) {
42 return phi(d*.5,w)/(swp*swp)*phih(d*.5,w);
43 }
44 Piecewise<SBasis> b3(Piecewise<SBasis> const &d, double w) {
45 return phi(d,w)*(cwp/(2*swp)) - b4(d,w)*(cwp*cwp);
46 }
47
48 Piecewise<SBasis> b2(Piecewise<SBasis> const &d, double w) {
49 return sin(d*.5)*(2*w*w)*sin(d*.5);
50 }
51 Piecewise<SBasis> b1(Piecewise<SBasis> const &d, double w) {
52 return b3(reverse(d), w);
53 }
54 Piecewise<SBasis> b0(Piecewise<SBasis> const &d, double w) {
55 return b4(reverse(d), w);
56 }
57
58
59 arc_basis(double w) {
60 Piecewise<SBasis> dom(Linear(0, 2*M_PI));
61 basis[0] = b4(dom, w);
62 basis[1] = b3(dom, w);
63 basis[2] = b2(dom, w);
64 basis[3] = b1(dom, w);
65 basis[4] = b0(dom, w);
66 }
67
68};
69
70class Conic4: public Toy {
72 public:
73 Conic4 () {
74 double sc = 30;
75 Geom::Point c(6*sc, 6*sc);
76 psh.push_back(sc*Geom::Point(0,0)+c);
77 psh.push_back(sc*Geom::Point(tan(w*M_PI)/w, 0)+c);
78 psh.push_back(sc*Geom::Point(0, 1/(w*w))+c);
79 psh.push_back(sc*Geom::Point(-tan(w*M_PI)/w, 0)+c);
80 psh.push_back(sc*Geom::Point(0,0)+c);
81 handles.push_back(&psh);
82 }
83
84 void draw(cairo_t *cr, std::ostringstream *notify, int width, int height, bool save, std::ostringstream *timer_stream) override {
85 std::vector<Geom::Point> e_h = psh.pts;
86 for(int i = 0; i < 5; i++) {
87 Geom::Point p = e_h[i];
88
89 if(i)
90 cairo_line_to(cr, p);
91 else
92 cairo_move_to(cr, p);
93 }
94 cairo_set_source_rgba (cr, 0., 0., 0, 1);
95 cairo_set_line_width (cr, 1);
96 cairo_stroke(cr);
97
98 arc_basis ab(1./3);
100
101 for(unsigned dim = 0; dim < 2; dim++)
102 for(unsigned i = 0; i < 5; i++)
103 B[dim] += ab.basis[i]*e_h[i][dim];
104
105 cairo_d2_pw_sb(cr, B);
106 cairo_set_source_rgba (cr, 1., 0.5, 0, 1);
107 cairo_set_line_width (cr, 1);
108 cairo_stroke(cr);
109
110 Toy::draw(cr, notify, width, height, save,timer_stream);
111 }
112};
113
114int main(int argc, char **argv) {
115 init(argc, argv, new Conic4());
116
117 return 0;
118}
119
120/*
121 Local Variables:
122 mode:c++
123 c-file-style:"stroustrup"
124 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
125 indent-tabs-mode:nil
126 fill-column:99
127 End:
128*/
129// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
int main()
Conversion between Bezier control points and SBasis curves.
Adaptor that creates 2D functions from 1D ones.
Definition d2.h:55
Function that interpolates linearly between two values.
Definition linear.h:55
Function defined as discrete pieces.
Definition piecewise.h:71
Two-dimensional point that doubles as a vector.
Definition point.h:66
void push_back(double x, double y)
std::vector< Geom::Point > pts
vector< Handle * > handles
virtual void save(FILE *f)
virtual void draw(cairo_t *cr, std::ostringstream *notify, int w, int h, bool save, std::ostringstream *timing_stream)
const double cwp
Definition conic-4.cpp:20
const double w
Definition conic-4.cpp:19
const double swp
Definition conic-4.cpp:21
double c[8][4]
Lifts one dimensional objects into 2D.
Various utility functions.
Definition affine.h:22
SBasisN< n > cos(LinearN< n > bo, int k)
Bezier reverse(const Bezier &a)
Definition bezier.h:342
SBasisN< n > sin(LinearN< n > bo, int k)
void cairo_line_to(cairo_t *cr, Geom::Point p1)
struct _cairo cairo_t
Definition path-cairo.h:16
void cairo_d2_pw_sb(cairo_t *cr, Geom::D2< Geom::Piecewise< Geom::SBasis > > const &p)
void cairo_move_to(cairo_t *cr, Geom::Point p1)
some std functions to work with (pw)s-basis
Polynomial in symmetric power basis (S-basis)
double height
double width
void cairo_set_source_rgba(cairo_t *cr, colour c)
void init(int argc, char **argv, Toy *t, int width=600, int height=600)