Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
arc-length-param.cpp
Go to the documentation of this file.
1#include <2geom/d2.h>
2#include <2geom/sbasis.h>
5
6#include <toys/path-cairo.h>
8
9#include <vector>
10using std::vector;
11using namespace Geom;
12
13static void dot_plot(cairo_t *cr, Piecewise<D2<SBasis> > const &M, double space=10){
14 //double dt=(M[0].cuts.back()-M[0].cuts.front())/space;
15 Piecewise<D2<SBasis> > Mperp = rot90(derivative(M)) * 2;
16 for( double t = M.cuts.front(); t < M.cuts.back(); t += space) {
17 Point pos = M(t), perp = Mperp(t);
18 draw_line_seg(cr, pos + perp, pos - perp);
19 }
20 cairo_pw_d2_sb(cr, M);
21 cairo_stroke(cr);
22}
23
24#define SIZE 4
25
26class LengthTester: public Toy {
27public:
28 PointSetHandle b1_handle;
29 PointSetHandle b2_handle;
30 void draw(cairo_t *cr,
31 std::ostringstream *notify,
32 int width, int height, bool save, std::ostringstream *timer_stream) override {
33
34 D2<SBasis> B1 = b1_handle.asBezier();
35 D2<SBasis> B2 = b2_handle.asBezier();
39
40// testing fuse_nearby_ends
41 std::vector< Piecewise<D2<SBasis> > > pieces;
44 for (auto & piece : pieces){
45 C.concat(piece);
46 }
47// testing fuse_nearby_ends
48
49 cairo_set_line_width (cr, .5);
50 cairo_set_source_rgba (cr, 0., 0.5, 0., 1);
51 //cairo_d2_sb(cr, B1);
52 cairo_pw_d2_sb(cr, C);
53 //cairo_pw_d2_sb(cr, B);
54 cairo_stroke(cr);
55
56 Timer tm;
58 tm.start();
59
61 Timer::Time als_time = tm.lap();
62 *timer_stream << "arc_length_parametrization, time = " << als_time << std::endl;
63
64 cairo_set_source_rgba (cr, 0., 0., 0.9, 1);
65 dot_plot(cr,uniform_B);
66 cairo_stroke(cr);
67 *notify << "pieces = " << uniform_B.size() << ";\n";
68
69 Toy::draw(cr, notify, width, height, save,timer_stream);
70 }
71
72public:
73 LengthTester(){
74 for(int i = 0; i < SIZE; i++) {
75 b1_handle.push_back(150+uniform()*300,150+uniform()*300);
76 b2_handle.push_back(150+uniform()*300,150+uniform()*300);
77 }
78 b1_handle.pts[0] = Geom::Point(150,150);
79 b1_handle.pts[1] = Geom::Point(150,150);
80 b1_handle.pts[2] = Geom::Point(150,450);
81 b1_handle.pts[3] = Geom::Point(450,150);
82 handles.push_back(&b1_handle);
83 handles.push_back(&b2_handle);
84 }
85};
86
87int main(int argc, char **argv) {
88 init(argc, argv, new LengthTester);
89 return 0;
90}
91
92/*
93 Local Variables:
94 mode:c++
95 c-file-style:"stroustrup"
96 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
97 indent-tabs-mode:nil
98 fill-column:99
99 End:
100*/
101//vim:filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99:
static void dot_plot(cairo_t *cr, Piecewise< D2< SBasis > > const &M, double space=10)
int main()
Conversion between Bezier control points and SBasis curves.
static int constexpr SIZE
Definition cielab.cpp:45
Adaptor that creates 2D functions from 1D ones.
Definition d2.h:55
Function defined as discrete pieces.
Definition piecewise.h:71
unsigned size() const
Definition piecewise.h:131
void concat(const Piecewise< T > &other)
Definition piecewise.h:235
Two-dimensional point that doubles as a vector.
Definition point.h:66
void push_back(double x, double y)
Geom::D2< Geom::SBasis > asBezier()
std::vector< Geom::Point > pts
void ask_for_timeslice()
Ask the OS nicely for a big time slice.
void start()
void lap(long long &ns)
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)
Lifts one dimensional objects into 2D.
Various utility functions.
Definition affine.h:22
std::vector< Geom::Piecewise< Geom::D2< Geom::SBasis > > > split_at_discontinuities(Geom::Piecewise< Geom::D2< Geom::SBasis > > const &pwsbin, double tol=.0001)
std::vector< Piecewise< D2< SBasis > > > fuse_nearby_ends(std::vector< Piecewise< D2< SBasis > > > const &f, double tol=0)
Bezier derivative(Bezier const &a)
Definition bezier.cpp:282
Piecewise< D2< SBasis > > arc_length_parametrization(D2< SBasis > const &M, unsigned order=3, double tol=.01)
D2< T > rot90(D2< T > const &a)
Definition d2.h:397
struct _cairo cairo_t
Definition path-cairo.h:16
void cairo_pw_d2_sb(cairo_t *cr, Geom::Piecewise< Geom::D2< Geom::SBasis > > const &p)
void draw_line_seg(cairo_t *cr, Geom::Point a, Geom::Point b)
two-dimensional geometric operators.
Polynomial in symmetric power basis (S-basis)
double height
double width
double uniform()
void cairo_set_source_rgba(cairo_t *cr, colour c)
void init(int argc, char **argv, Toy *t, int width=600, int height=600)