GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
Equalizer.hh
Go to the documentation of this file.
1
2#include "Graph.hh"
3#include "VectorTools.hh"
4
7
8class DerivateFunction : public Function<float, float>
9{
10public:
11 DerivateFunction(Function<float,float> &f, float delta) : f(f),delta(delta) { }
12 float Index(float x) const
13 {
14 float v1 = f.Index(x+delta);
15 float v2 = f.Index(x);
16 //std::cout << x << " " << v1 << " " << v2 << std::endl;
17 return (v1-v2)/delta;
18 }
19private:
21 float delta;
22};
23
24
25class PartialFunction2_1 : public Function<float,float>
26{
27public:
28 PartialFunction2_1(Function<Point2d, float> &f, float y_) : f(f),y(y_) { }
29 float Index(float x) const
30 {
31 Point2d p = { x,y };
32 return f.Index(p);
33 }
34private:
36 float y;
37};
38
39class PartialFunction2_2 : public Function<float,float>
40{
41public:
42 PartialFunction2_2(Function<Point2d, float> &f, float x_) : f(f),x(x_) { }
43 float Index(float y) const
44 {
45 Point2d p = { x,y };
46 return f.Index(p);
47 }
48private:
50 float x;
51};
52
53class PartialFunction3_1 : public Function<float,float>
54{
55public:
56 PartialFunction3_1(Function<Point, float> &f, float y_, float z_) : f(f),y(y_), z(z_) { }
57 float Index(float x) const
58 {
59 Point p(x,y,z);
60 return f.Index(p);
61 }
62private:
64 float y;
65 float z;
66};
67
68class PartialFunction3_2 : public Function<float,float>
69{
70public:
71 PartialFunction3_2(Function<Point, float> &f, float x_, float z_) : f(f),x(x_), z(z_) { }
72 float Index(float y) const
73 {
74 Point p(x,y,z);
75 return f.Index(p);
76 }
77private:
79 float x;
80 float z;
81};
82
83class PartialFunction3_3 : public Function<float,float>
84{
85public:
86 PartialFunction3_3(Function<Point, float> &f, float x_, float y_) : f(f),x(x_), y(y_) { }
87 float Index(float z) const
88 {
89 Point p(x,y,z);
90 return f.Index(p);
91 }
92private:
94 float x;
95 float y;
96};
97
98
99
100
101class Gradient : public Function<Point2d, Vector2d>
102{
103public:
106 {
107 PartialFunction2_1 p1(f, p.y);
108 PartialFunction2_2 p2(f, p.x);
109 DerivateFunction f1(p1,0.001);
110 DerivateFunction f2(p2,0.001);
111 Vector2d v;
112 v.dx = f1.Index(p.x);
113 v.dy = f2.Index(p.y);
114 return v;
115 }
116private:
118};
119
120class Gradient3d : public Function<Point, Vector>
121{
122public:
125 {
126 PartialFunction3_1 p1(f, p.y, p.z);
127 PartialFunction3_2 p2(f, p.x, p.z);
128 PartialFunction3_3 p3(f, p.x, p.y);
129 DerivateFunction f1(p1,0.0001);
130 DerivateFunction f2(p2,0.0001);
131 DerivateFunction f3(p3,0.0001);
132 Vector v;
133 v.dx = f1.Index(p.x);
134 v.dy = f2.Index(p.y);
135 v.dz = f3.Index(p.z);
136 //std::cout << "Vec: " << v << std::endl;
137 return v;
138 }
139private:
141};
142
143
144class Point2dFunction : public Function<Point2d, float>
145{
146public:
147 Point2dFunction(Function<std::pair<float,float>, float> &f) : f(f) { }
148 float Index(Point2d p) const
149 {
150 std::pair<float,float> pp = std::make_pair(p.x, p.y);
151 return f.Index(pp);
152 }
153private:
155};
156
157class IntegrationFunction : public Function<float, float>
158{
159 // Integration is function (R->R)->R.
160 // to get that from this code do this:
161 // IntegrationFunction i(...);
162 // float r = i.Index(x);
163public:
164 IntegrationFunction(const Function<float,float> &f, float delta, float startx, float endx, float C) : f(f), delta(delta), startx(startx), /*endx(endx),*/ C(C) { }
165 float Index(float x) const
166 {
167 float val = C;
168 float val2 = C;
169 for(float xx = startx;xx<x;xx+=delta)
170 {
171 val += std::min(f.Index(xx)*delta, f.Index(xx+delta)*delta);
172 val2 += std::max(f.Index(xx)*delta, f.Index(xx+delta)*delta);
173 }
174 val/=(x-startx);
175 val2/=(x-startx);
176 return (val+val2)/2.0;
177 }
178 float Delta(float x) const
179 {
180 float val = C;
181 float val2 = C;
182 for(float xx = startx;xx<x;xx+=delta)
183 {
184 val += std::min(f.Index(xx)*delta, f.Index(xx+delta)*delta);
185 val2 += std::max(f.Index(xx)*delta, f.Index(xx+delta)*delta);
186 }
187 val /= (x-startx);
188 val2 /= (x-startx);
189 return fabs(val-val2)/2.0;
190 }
191private:
193 float delta, startx, /*endx,*/ C;
194};
195
196template<class T, class U, class K>
198{
199public:
201 K Index(T t) const { return g.Index(f.Index(t)); }
202 std::vector<T> Inverse(K k) const
203 {
204 std::vector<U> vec = g.Inverse(k);
205 std::vector<T> vec2;
206 int size = vec.size();
207 for(int i=0;i<size;i++)
208 {
209 std::vector<T> vec3 = f.Inverse(vec[i]);
210 vec2.insert(vec2.end(), vec3.begin(), vec3.end());
211 }
212 return vec2;
213 }
214private:
217};
218template<class T>
220{
221public:
222 virtual T Element() const=0;
223};
224
225template<class U, class V>
227{
228public:
229 Exists(Forall<U> &fa, Function<U,V> &f) : fa(fa), f(f) { }
230 V Element() const { return f.Index(fa.Element()); }
231private:
232 Forall<U> &fa;
234};
235
236
237template<class T>
238class PowerSet : public Function<T,bool>
239{
240public:
241};
242
243template<class T>
245{
246public:
247 virtual bool Comp(T t1, T t2) const=0;
248};
249
250template<class A, class U=A>
251class SubImage : public Function<U,A>, public PowerSet<A>
252{
253public:
254 SubImage(Function<A,bool> &obj, bool choose) : obj(obj), choose(choose) { }
255 bool Index(A t) const
256 {
257 return obj.Index(t)==choose;
258 }
259 A Index(U t) const
260 {
261 return t;
262 }
263private:
264 Function<A,bool> &obj;
265 bool choose;
266};
267
268template<class X, class Y, class U=X, class V=Y>
269class InverseImageK : public Function<Function<V,Y>*, Function<U,X>*>, private Function<U,X>
270{
271public:
274 {
275 return *this;
276 }
277 X Index(U u) const
278 {
279 return u;
280 }
281private:
283};
284
285template<class X, class Y, class U=X, class V=Y>
286class InverseImageA : public Function<X,bool>
287{
288public:
290 bool Index(X x) const {
291 return a.Index(f.Index(x));
292 }
293 X Index(U u) const {
294 return u;
295 }
296private:
299};
300
301template<class A, class B>
302class InverseImage : public Function<PowerSet<B>*,PowerSet<A>*>, private PowerSet<A>
303{
304public:
307 {
308 bb = b;
309 return const_cast<InverseImage*>(this);
310 }
311private:
312 bool Index(A a) const
313 {
314 return bb->Index(f.Index(a));
315 }
316private:
317 Function<A,B> &f;
318 mutable PowerSet<B> *bb;
319};
320
321
322template<class Omega, class A, class B>
323class InverseImageF : public Function<Function<B,Omega>*, Function<A,Omega>*>, private Function<A,Omega>
324{
325public:
328 {
329 bb = b;
330 return const_cast<InverseImageF*>(this);
331 }
332private:
333 Omega Index(A a) const
334 {
335 return bb->Index(f.Index(a));
336 }
337private:
338 Function<A,B> &f;
339 Function<B,Omega> *bb;
340};
341
343{
344 static const Singleton &get() { static Singleton s; return s; }
345};
346
347template<class U, class V, class X, class Y>
349{
350public:
351 class Req
352 {
353 public:
354 virtual X i(U u) const=0;
355 virtual Y f(X x) const=0;
356 virtual Y j(V v) const=0;
357 };
358 class Res
359 {
360 public:
361 virtual bool u(U u) const=0;
362 virtual bool v(V v) const=0;
363 virtual bool x(X x) const=0;
364 virtual bool y(Y y) const=0;
365 };
366 class ResImpl : public Res
367 {
368 public:
369 ResImpl(PowerSet<Y> &mem, Req &r) : mem(mem),r(r) { }
370 bool u(U u) const { return mem.Index(r.f(r.i(u))); }
371 bool v(V v) const { return mem.Index(r.j(v)); }
372 bool x(X x) const { return mem.Index(r.f(x)); }
373 bool y(Y y) const { return mem.Index(y); }
374
375 private:
376 PowerSet<Y> &mem;
377 Req &r;
378 };
379
380};
381
382template<class A>
383class ElementSingleton : public Function<Singleton, A>
384{
385public:
386 ElementSingleton(A a) : a(a) { }
387 A Index(Singleton s) const { return a; }
388private:
389 A a;
390};
391
392template<class A>
393class Fiber : public Function<PowerSet<A>*,bool>
394{
395public:
396 Fiber(A a) : elem(a), image(elem) { }
397 bool Index(PowerSet<A> *mem) const
398 {
399 PowerSet<Singleton> *mem2 = image.Index(mem);
400 return mem2->Index(Singleton::get());
401 }
402private:
405};
406
407
408
409template<class U, class X, class Y>
417
418struct Spread
419{
421 float radius;
422};
423struct Pixel
424{
425public:
426 int x,y; // 0..sx, 0..sy
427 int r,g,b; // 0..255
428};
429#if 0
430struct Env
431{
432 Pixel center;
433 Pixel t,b,l,r;
434};
435class BlurFunction : public Function<Pixel, Env>
436{
437};
438#endif
439
440class ImageBools : public Function<Pixel, bool>
441{
442public:
443 ImageBools(Bitmap<Color> &bm) : bm(bm) { }
444
445 bool Index(Pixel p) const
446 {
447 Color c = bm.Map(p.x,p.y);
448 return c.r == p.r && c.g == p.g && c.b == p.b;
449 }
450private:
451 Bitmap<Color> &bm;
452};
453
454
455template<class A, class B, class Omega>
456class InverseImage2 : public Function<Function<B,Omega>*,Function<A,Omega>*>, private Function<A,Omega>
457{
458public:
461 {
462 bb = b;
463 return this;
464 }
465private:
466 Omega Index(A a) const
467 {
468 return bb->Index(f.Index(a));
469 }
470private:
471 Function<A,B> &f;
472 mutable Function<B,Omega> *bb;
473};
474
475
476template<class A>
477class Intersection : public PowerSet<A>
478{
479public:
480 Intersection(PowerSet<A> &m, PowerSet<A> &m2) : m(m), m2(m2) { }
481 bool Index(A a) const
482 {
483 return m.Index(a) && m2.Index(a);
484 }
485private:
486 PowerSet<A> &m;
487 PowerSet<A> &m2;
488};
489
490
491template<class T, class A, class C, class B>
492class Intersection2 : public Function<PowerSet<B>*,PowerSet<T>*>
493{
494public:
495 Intersection2(Function<A,B> &f1, Function<C,B> &f2, Function<T,A> &m1, Function<T,C> &m2) : i1(f1), i2(f2), im1(m1), im2(m2), mem(0) { }
497 {
498 PowerSet<A> *ia = i1.Index(b);
499 PowerSet<C> *ic = i1.Index(b);
500 PowerSet<T> *it1 = im1.Index(ia);
501 PowerSet<T> *it2 = im2.Index(ic);
502 delete mem;
503 mem = new Intersection<T>(it1,it2);
504 return mem;
505 }
506
507private:
512 mutable Intersection<T> *mem;
513};
514
515template<class A>
516class Union2 : public PowerSet<A>
517{
518public:
519 Union2(PowerSet<A> &m, PowerSet<A> &m2) : m(m), m2(m2) { }
520 bool Index(A a) const
521 {
522 return m.Index(a) || m2.Index(a);
523 }
524private:
525 PowerSet<A> &m;
526 PowerSet<A> &m2;
527};
528
529
530template<class A>
532{
533public:
534 IntersectionArray(Array<int,PowerSet<A>*> &arr) : arr(arr) { }
535 bool Index(A a) const
536 {
537 bool bb = true;
538 int size = arr.Size();
539 for(int i=0;i<size;i++)
540 {
541 PowerSet<A> *mem = arr.Index(i);
542 bool b = mem->Index(a);
543 bb &= b;
544 }
545 return bb;
546 }
547private:
549};
550
551template<class A>
552class UnionArray : public PowerSet<A>
553{
554public:
555 UnionArray(Array<int,PowerSet<A>*> &arr) : arr(arr) { }
556 bool Index(A a) const
557 {
558 bool bb = false;
559 int size = arr.Size();
560 for(int i=0;i<size;i++)
561 {
562 PowerSet<A> *mem = arr.Index(i);
563 bool b = mem->Index(a);
564 bb |= b;
565 }
566 return bb;
567 }
568private:
570};
571
572
573template<class A, class B>
574class Equalizer : public PowerSet<A>
575{
576public:
577 Equalizer(Compare<B> &comp, Function<A,B> &f1, Function<A,B> &f2) : comp(comp), f1(f1), f2(f2) { }
578 bool Index(A a) const
579 {
580 return comp.Comp(f1.Index(a), f2.Index(a));
581 }
582private:
583 Compare<B> &comp;
584 Function<A,B> &f1;
586};
587
588class DistanceFloat : public PowerSet<float>
589{
590public:
591 DistanceFloat(float p, float delta) : p(p), delta(delta) { }
592 bool Index(float x) const
593 {
594 return std::abs(x-p) < delta;
595 }
596private:
597 float p, delta;
598};
599
600class DistancePoint2d : public PowerSet<Point2d>
601{
602public:
603 DistancePoint2d(Point2d p, float r) : p(p), r(r) { }
604 bool Index(Point2d x) const
605 {
606 return (x-p).Dist() < r;
607 }
608private:
609 Point2d p;
610 float r;
611};
612
613template<class E, class A, class B>
614class Equalizer2 : public Function<PowerSet<B>*,PowerSet<E>*>
615{
616public:
617 Equalizer2(Function<A,B> &f1, Function<A,B> &f2, Function<E,A> &e) : f1(f1), f2(f2), e(e), mem(0) { }
619 {
620 PowerSet<A> *f_1 = f1.Index(b);
621 PowerSet<A> *f_2 = f2.Index(b);
622 delete mem;
623 mem = new Intersection<A>(*f_1,*f_2);
624 PowerSet<E> *ee = e.Index(mem);
625 return ee;
626 }
627private:
631 mutable Intersection<A> *mem;
632};
633template<class E, class A, class B>
634class Equalizer4 : public Function<E,B>
635{
636 Equalizer4(Function<A,B> &f1, Function<A,B> &f2, Function<E,A> &e, bool path_from_f2) : f1(f1), f2(f2), e(e), path_from_f2(path_from_f2) { }
637 B Index(E e) const
638 {
639 if (path_from_f2) { return f2.Index(e.Index(e)); }
640 return f1.Index(e.Index(e));
641 }
642private:
643 Function<A,B> &f1;
644 Function<A,B> &f2;
645 Function<E,A> &e;
646 bool path_from_f2;
647};
648
649
650template<class A, class B>
651class InverseEqualizer : public Function<A, std::vector<A> >
652{
653public:
655 std::vector<A> Index(A a) const
656 {
657 B b = f.Index(a);
658 return g.Inverse(b);
659 }
660private:
663};
664
665template<class A, class B>
666class CombineFunctions : public Function<A,std::pair<B,B> >
667{
668public:
670 std::pair<B,B> Index(A a) const
671 {
672 return std::make_pair(f.Index(a), g.Index(a));
673 }
674private:
676 Function<A,B> &g;
677};
678
679template<class A, class B>
680class RealGraph : public Function<A,std::pair<A,B> >
681{
682public:
684 std::pair<A,B> Index(A a) const
685 {
686 return std::make_pair(a,f.Index(a));
687 }
688private:
690};
691/*
692class RealEqualizer
693{
694public:
695 RealEqualizer(Function<A,B> &f1, Function<A,B> &f2) : gf1(f1), gf2(f2) { }
696
697private:
698 RealGraph<A,B> gf1;
699 RealGraph<A,B> gf2;
700};
701*/
702template<class A, class B, class C>
703class InversePullback : public Function<A,std::vector<B> >
704{
705public:
707 B Index(A a) const
708 {
709 C c = ac.Index(a);
710 std::vector<B> b = bc.Inverse(c);
711 return b;
712 }
713private:
714 Function<A,C> &ac;
716};
717
718template<class T>
719class ChooseElem : public PowerSet<T>
720{
721public:
722 ChooseElem(T a) : a(a) { }
723 bool Index(T a_) const { return a_==a; }
724private:
725 T a;
726};
727
728template<class A, class B>
729class Equalizer3 : public PowerSet<std::pair<A,B> >
730{
731public:
733 bool Index(std::pair<A,B> &ab) const
734 {
735 ChooseElem<B> c(ab.second);
736 PowerSet<A> *elem = eq.Index(&c);
737 return elem->Index(ab.first);
738 }
739private:
742};
743
744
745
747{
748 int x;
749 int y;
751};
752
753class ImageFunction : public Function<ImgSelect, int>
754{
755public:
756 ImageFunction(Bitmap<Color> &bm) : bm(bm) { }
757 int Index(ImgSelect p) const
758 {
759 Color c = bm.Map(p.x,p.y);
760 if (p.color_component == 0) return c.r;
761 if (p.color_component == 1) return c.g;
762 if (p.color_component == 2) return c.b;
763 return 0;
764 }
765private:
766 Bitmap<Color> &bm;
767};
768#if 0
769class BlurFunction : public Function<ImgSelect, int>
770{
771public:
772 BlurFunction(Bitmap<Color> &bm, float mult) : bm(bm) { }
773
774 int Index(ImgSelect p) const
775 {
776 int x = p.x;
777 int y = p.y;
778 Color cx1 = bm.Map(x-1,y);
779 Color cx2 = bm.Map(x+1,y);
780 Color cy1 = bm.Map(x,y-1);
781 Color cy2 = bm.Map(x,y+1);
782 Color c = bm.Map(x,y);
783 int val;
784 if (p.color_component == 0)
785 {
786 val = ((cx1.r+cx2.r+cy1.r+cy2.r)*mult/4.0 + (1.0-mult)*c.r);
787 }
788 if (p.color_component == 1)
789 {
790 val = ((cx1.g+cx2.g+cy1.g+cy2.g)*mult/4.0 + (1.0-mult)*c.g);
791 }
792 if (p.color_component == 2)
793 {
794 val = ((cx1.b+cx2.b+cy1.b+cy2.b)*mult/4.0 + (1.0-mult)*c.b);
795 }
796 return val;
797 }
798private:
799 Bitmap<Color> &bm;
800};
801
802#endif
803
804class ConstantBitmap2 : public Bitmap<Color>
805{
806public:
807 ConstantBitmap2(int sx, int sy, int r, int g, int b) : r(r), g(g), b(b) { }
808 int SizeX() const { return sx; }
809 int SizeY() const { return sy; }
810 Color Map(int x, int y) const
811 {
812 return Color(r,g,b);
813 }
814private:
815 int sx,sy,r,g,b;
816};
817
818#if 0
819class Sharpen : public Bitmap<Color>
820{
821public:
822 Sharpen(const Bitmap<Color> &c) : c(c), img(c) { }
823 int SizeX() const { return c.SizeX(); }
824 int SizeY() const { return c.SizeY(); }
825 Color Map(int x, int y) const
826 {
827 for(int r=0;r<255;r++)
828 {
829 ConstantBitmap2 b(r,0,0);
830 BlurFunction blur(b, 0.5);
831 Equalizer3<ImgSelect, int> eq(img, blur);
832
833 }
834 }
835private:
836 const Bitmap<Color> &c;
837 IdentityFunction id;
838 ImageFunction img;
839};
840#endif
841
842template<class A, class B, class C>
843class Pullback : private PowerSet<std::pair<A,B> >
844{
845public:
846 Pullback(Compare<C> &comp, Function<A,C> &f1, Function<B,C> &f2) : comp(comp), f1(f1), f2(f2) { }
847
848 bool Index(std::pair<A,B> p) const
849 {
850 return comp.Comp(f1.Index(p.first), f2.Index(p.second));
851 }
852private:
853 Compare<C> &comp;
854 Function<A,C> &f1;
856};
857
858// P = std::pair<A,B>
859template<class P, class A, class B, class C>
860class Pullback2 : public Function<PowerSet<C>*,PowerSet<P>*>
861{
862public:
863 Pullback2(Function<A,C> &f1, Function<B,C> &f2, Function<P,A> &p1, Function<P,B> &p2) : f1(f1), f2(f2), p1(p1), p2(p2), mem(0) { }
865 {
866 PowerSet<A> *f_1 = f1.Index(c);
867 PowerSet<B> *f_2 = f2.Index(c);
868 PowerSet<P> *p_1 = p1.Index(f_1);
869 PowerSet<P> *p_2 = p2.Index(f_2);
870 delete mem;
871 mem = new Intersection<P>(p_1,p_2);
872 return mem;
873 }
874
875private:
880 mutable Intersection<P> *mem;
881};
882template<class P, class A, class B, class C>
883class Pullback3 : public Function<P,C>
884{
885public:
886 Pullback3(Function<A,C> &f1, Function<B,C> &f2, Function<P,A> &p1, Function<P,B> &p2, bool is_path_from_B) : is_path_from_B(is_path_from_B), f1(f1), f2(f2), p1(p1), p2(p2) { }
887 C Index(P p) const
888 {
889 if (is_path_from_B) { return f2.Index(p2.Index(p)); }
890 return f1.Index(p1.Index(p));
891 }
892private:
893 bool is_path_from_B;
894 Function<A,C> &f1;
896 Function<P,A> &p1;
897 Function<P,B> &p2;
898};
899
900template<class P, class A, class B, class C>
901class Pullback4I : public Function<P,std::pair<C,C> >
902{
903public:
904 Pullback4I(Function<A,C> &f1, Function<B,C> &f2, Function<P,A> &p1, Function<P,B> &p2) : f1(f1), f2(f2),p1(p1), p2(p2) { }
905 std::pair<C,C> Index(P p) const
906 {
907 A a = p1.Index(p);
908 B b = p2.Index(p);
909 //std::cout << "Pullback4Is:" << a.first << " " << a.second << " " << b << std::endl;
910 C c1 = f1.Index(a);
911 C c2 = f2.Index(b);
912 //std::cout << "Pullback4I:" << c1 << " " << c2 << std::endl;
913 return std::make_pair(c1,c2);
914 }
915private:
916 Function<A,C> &f1;
918 Function<P,A> &p1;
919 Function<P,B> &p2;
920};
921class PbMinus : public Function<std::pair<float,float>, float>
922{
923public:
924 float Index(std::pair<float,float> p) const { return fabs(p.first - p.second); }
925};
926
927struct Float
928{
929 Float(float v) : value(v) { }
930 float value;
931 class FloatFunction : public Function<float,float>
932 {
933 public:
935 float Index(float x) const
936 {
937 Float a(x);
938 return f.Index(a);
939 }
940 private:
942 };
944 FloatFunction ff(f);
945 float x = ::SolveWithFailure(ff,t_0.value, t_1.value, error);
946 Float fl(x);
947 return fl;
948 }
949};
950
952{
953public:
954 FloatPair(float xx, float yy) : x(xx), y(yy) { }
955 float x,y;
956 class FloatFunction : public Function<Point2d,float>
957 {
958 public:
960 float Index(Point2d x) const
961 {
962 FloatPair a(x.x,x.y);
963 return f.Index(a);
964 }
965 private:
967 };
969 FloatFunction ff(f);
970 Point2d t_0a = { t_0.x, t_0.y };
971 Point2d t_1a = { t_1.x, t_1.y };
972 Point2d x = ::SolveWithFailure(ff,t_0a, t_1a, error);
973 FloatPair p(x.x,x.y);
974 return p;
975 }
976};
978{
979public:
981 Point get() const { return p; }
982 class FloatFunction : public Function<Point,float>
983 {
984 public:
986 float Index(Point x) const
987 {
988 FloatPoint a(x);
989 return f.Index(a);
990 }
991 private:
993 };
994
996 {
997 FloatFunction ff(f);
998 Point t_0a(t_0.p.x, t_0.p.y, t_0.p.z);
999 Point t_1a(t_1.p.x, t_1.p.y, t_1.p.z);
1000 Point p = ::SolveWithFailure(ff, t_0a, t_1a, error);
1001 FloatPoint pp(p);
1002 return pp;
1003 }
1004public:
1006};
1007
1008// T = Float or T = FloatPair
1009// P = std::pair<A,B>
1010// A = anything
1011// B = anything
1012// C = anything
1013template<class T, class P, class A, class B, class C>
1014class FloatPullbackGeneric : public Element<T> // T=float, C = float
1015{
1016public:
1018 Function<B, C> &f2,
1019 Function<P, A> &p1,
1020 Function<P, B> &p2,
1021 Function<T, P> &t,
1022 Function<std::pair<C,C>, float> &pb_minus,
1023 T t_0,
1024 T t_1) : t(t), pb(f1,f2,p1,p2), pb1(t,pb), pb2(pb1, pb_minus), t_0(t_0), t_1(t_1), f1(f1), f2(f2), p1(p1), p2(p2) { }
1025 T Elem() const
1026 {
1027 T val = T::SolveWithFailure(pb2, t_0, t_1, b);
1028 return val;
1029 }
1030 bool Success() const { Elem(); return b; }
1031 P get_P() const { return t.Index(Elem()); }
1032 A get_A() const { return p1.Index(get_P()); }
1033 B get_B() const { return p2.Index(get_P()); }
1034 std::pair<C,C> get_pair() const
1035 {
1036 return std::make_pair(f1.Index(get_A()), f2.Index(get_B()));
1037 }
1038private:
1039 Function<T, P> &t;
1041 //PbMinus m;
1042
1045 T t_0, t_1;
1046 Function<A,C> &f1;
1048 Function<P,A> &p1;
1049 Function<P,B> &p2;
1050 mutable bool b;
1051};
1052template<class P, class A, class B>
1053class FloatPullback : public FloatPullbackGeneric<Float,P,A,B, float>
1054{
1055public:
1058 Function<P, A> &p1,
1059 Function<P, B> &p2,
1061 float t_0,
1062 float t_1) : t_0a(t_0), t_1a(t_1), FloatPullbackGeneric<Float,P,A,B,float>(f1,f2,p1,p2,t,minus,t_0a,t_1a) { }
1063private:
1064 PbMinus minus;
1065 Float t_0a;
1066 Float t_1a;
1067};
1068class PointPointDistance : public Function<std::pair<Point,Point>, float>
1069{
1070public:
1071 float Index(std::pair<Point,Point> p) const
1072 {
1073 //std::cout << p.first << " " << p.second << std::endl;
1074 Vector v = p.first - p.second;
1075 return sqrt(v.dx*v.dx+v.dy*v.dy+v.dz*v.dz);
1076 }
1077};
1078
1079class Point2dPoint2dDistance : public Function<std::pair<Point2d,Point2d>, float>
1080{
1081public:
1082 float Index(std::pair<Point2d,Point2d> p) const
1083 {
1084 Vector2d v = p.first - p.second;
1085 return sqrt(v.dx*v.dx+v.dy*v.dy);
1086 }
1087};
1088
1089
1090template<class P, class A, class B>
1091class DistancePullback : public FloatPullbackGeneric<FloatPair, P,A,B, Point>
1092{
1093public:
1096 Function<P, A> &p1,
1097 Function<P, B> &p2,
1099 FloatPair t_0,
1100 FloatPair t_1) : FloatPullbackGeneric<FloatPair, P,A,B,Point>(f1,f2,p1,p2,t,dist,t_0,t_1) { }
1101private:
1102 PointPointDistance dist;
1103};
1104
1105template<class P, class A, class B>
1106class Distance2dPullback : public FloatPullbackGeneric<FloatPair, P,A,B, Point2d>
1107{
1108public:
1111 Function<P, A> &p1,
1112 Function<P, B> &p2,
1114 FloatPair t_0,
1115 FloatPair t_1) : FloatPullbackGeneric<FloatPair, P,A,B,Point2d>(f1,f2,p1,p2,t,dist,t_0,t_1) { }
1116private:
1118};
1119
1120template<class P, class A, class B>
1121class Distance3dPullback : public FloatPullbackGeneric<FloatPoint, P,A,B, Point>
1122{
1123public:
1126 Function<P, A> &p1,
1127 Function<P, B> &p2,
1129 FloatPoint t_0,
1130 FloatPoint t_1) : FloatPullbackGeneric<FloatPoint, P,A,B,Point>(f1,f2,p1,p2,t,dist,t_0,t_1) { }
1131private:
1132 PointPointDistance dist;
1133};
1134
1135
1136
1137
1138
1139template<class T, class K>
1140class Fst : public Function<std::pair<T,K>, T>
1141{
1142public:
1143 T Index(std::pair<T,K> p) const { return p.first; }
1144};
1145
1146template<class T, class K>
1147class Snd : public Function<std::pair<T,K>, K>
1148{
1149public:
1150 K Index(std::pair<T,K> p) const { return p.second; }
1151};
1152
1153
1154
1155
1156template<class P>
1157class DistPullback3d : public FloatPullback<P, Point, Point>
1158{
1159 DistPullback3d(Function<Point, float> &f1,
1163 Function<float, P> &t) :
1165};
1166
1167
1168
1169template<class P, class A, class B, class C>
1170class Pullback4 : public Function<P,InvertableFunction<C,C>*>, private InvertableFunction<C,C>
1171{
1172public:
1173 Pullback4(Function<A,C> &f1, Function<B,C> &f2, Function<P,A> &p1, Function<P,B> &p2, bool is_path_from_B) : is_path_from_B(is_path_from_B), f1(f1), f2(f2), p1(p1), p2(p2) { }
1175 {
1176
1177 }
1178private:
1179 bool is_path_from_B;
1180 Function<A,C> &f1;
1182 Function<P,A> &p1;
1183 Function<P,B> &p2;
1184};
1185
1186
1187
1188template<class A, class C>
1189class EquivalenceRelation : public PowerSet<std::pair<A,A> >
1190{
1191public:
1193 bool Index(std::pair<A,A> p) const
1194 {
1195 return pb.Index(p);
1196 }
1197private:
1198 Pullback<A,A,C> pb;
1199};
1200
1201class FloatCompare : public Compare<float>
1202{
1203public:
1204 bool Comp(float t1, float t2) const
1205 {
1206 return fabs(t1-t2) < 0.001;
1207 }
1208};
1209
1210class Distance2dA : public Function<Point2d, float>
1211{
1212public:
1213 float Index(Point2d p) const
1214 {
1215 return sqrt(p.x*p.x+p.y*p.y);
1216 }
1217};
1218
1219class Distance3d : public Function<Point, float>
1220{
1221public:
1222 float Index(Point p) const
1223 {
1224 return sqrt(p.x*p.x+p.y*p.y+p.z*p.z);
1225 }
1226};
1227
1228class PointCollectionDistance : public Function<Point, float>
1229{
1230public:
1232 float Index(Point p) const
1233 {
1234 float dist = 0.0;
1235 int s = coll.Size();
1236 for(int i=0;i<s;i++)
1237 {
1238 Point c = coll.Index(i);
1239 Vector v = p - c;
1240 dist += v.Dist();
1241 }
1242 return dist;
1243 }
1244private:
1245 PointCollection &coll;
1246};
1247
1248class PointCollectionNormal : public Function<Point, Vector>
1249{
1250public:
1251 PointCollectionNormal(PointCollection &coll, float dist1, float dist2) : coll(coll), dist1(dist1), dist2(dist2) { }
1253 {
1254 Vector dist(0.0, 0.0, 0.0);
1255 int s = coll.Size();
1256 float d = 0.0;
1257 for(int i=0;i<s;i++)
1258 {
1259 Point c = coll.Index(i);
1260 Vector v = p - c;
1261 d += v.Dist();
1262 if (d >= dist1 && d <= dist2)
1263 {
1264 dist += v;
1265 }
1266 }
1267 return dist;
1268 }
1269private:
1270 PointCollection &coll;
1271 float dist1, dist2;
1272};
1273
1274class Range2 : public PowerSet<float>
1275{
1276public:
1277 Range2(float start, float end) : start(start), end(end) { }
1278 bool Index(float x) const
1279 {
1280 return x >= start && x <=end;
1281 }
1282private:
1283 float start,end;
1284};
1285
1286class Step : public PowerSet<float>
1287{
1288public:
1289 Step(float x, bool flip) : x(x), flip(flip) { }
1290 bool Index(float xx) const
1291 {
1292 if (flip)
1293 {
1294 return xx > x;
1295 }
1296 else
1297 {
1298 return xx < x;
1299 }
1300 }
1301private:
1302 float x;
1303 bool flip;
1304};
1305
1306class Angle : public Function<Point2d, float>
1307{
1308public:
1309 float Index(Point2d p) const
1310 {
1311 return atan2(p.y,p.x);
1312 }
1313};
1314
1315class XCoord2d : public Function<Point2d, float>
1316{
1317public:
1318 float Index(Point2d p) const
1319 {
1320 return p.x;
1321 }
1322};
1323
1324class YCoord2d : public Function<Point2d, float>
1325{
1326public:
1327 float Index(Point2d p) const
1328 {
1329 return p.y;
1330 }
1331};
1332
1333
1334class XCoord3d : public Function<Point, float>
1335{
1336public:
1337 float Index(Point p) const
1338 {
1339 return p.x;
1340 }
1341};
1342
1343class YCoord3d : public Function<Point, float>
1344{
1345public:
1346 float Index(Point p) const
1347 {
1348 return p.y;
1349 }
1350};
1351
1352class ZCoord3d : public Function<Point, float>
1353{
1354public:
1355 float Index(Point p) const
1356 {
1357 return p.z;
1358 }
1359};
1360
1361class Repeat2 : public PowerSet<float>
1362{
1363public:
1364 Repeat2(PowerSet<float> &mem, float sizex) : mem(mem), sizex(sizex) { }
1365 bool Index(float t) const
1366 {
1367 while(t>sizex)
1368 t-=sizex;
1369 while(t<0.0)
1370 t+=sizex;
1371 return mem.Index(t);
1372 }
1373
1374private:
1375 PowerSet<float> &mem;
1376 float sizex;
1377};
1378
1379template<class A, class T>
1380class FunctionCall : public Element<T>
1381{
1382public:
1383 FunctionCall(Function<A, T> &f, A a) : f(f), a(a) { }
1384 T Elem() const
1385 {
1386 return f.Index(a);
1387 }
1388private:
1390 A a;
1391};
1392
1393class InverseImageSubset2d : public PowerSet<Point2d>
1394{
1395public:
1397 bool Index(Point2d p) const
1398 {
1399 const PowerSet<Point2d> *mem = img.Index(&m);
1400 return mem->Index(p);
1401 }
1402private:
1404 PowerSet<float> &m;
1405};
1406
1407class BitmapPowerSet : public PowerSet<Pos>
1408{
1409public:
1411 bool Index(Pos p) const
1412 {
1413 return bm.Map(p.x, p.y);
1414 }
1415private:
1416 Bitmap<bool> &bm;
1417};
1418
1419template<class T>
1420class BitmapInverseImage : public Function<T,bool>
1421{
1422public:
1423 BitmapInverseImage(Bitmap<bool> &bm, Function<T,Pos> &f) : mem(bm), inverse(f) { }
1424 bool Index(T t) const
1425 {
1426 PowerSet<T> *m = inverse.Index(mem);
1427 return m->Index(t);
1428 }
1429private:
1430 BitmapPowerSet mem;
1431 InverseImage<T,Pos> inverse;
1432};
1433
1434class ContinuousBitmapPowerSet : public PowerSet<Point2d>
1435{
1436public:
1438 bool Index(Point2d p) const
1439 {
1440 return bm.Map(p.x, p.y);
1441 }
1442private:
1444};
1445
1446template<class T>
1448{
1449public:
1451 bool Index(T t) const
1452 {
1453 PowerSet<T> *m = inverse.Index(mem);
1454 return m->Index(t);
1455 }
1456private:
1459};
1460
1461
1462class LineIn2dScanLine : public Function<float, bool> // x -> bool
1463{
1464public:
1465 LineIn2dScanLine(Point2d p1, Point2d p2, float y) : /*p1(p1), p2(p2),*/ line(p1,p2), image(line),y(y) { }
1466 bool Index(float x) const
1467 {
1468 Step st(y,false /*(p1.y<p2.y&&p1.x<p2.x) || (p2.y<p1.y&&p2.x<p1.x)*/);
1469 PowerSet<float> *x_mem = image.Index(&st);
1470 return x_mem->Index(x);
1471 }
1472private:
1473 //Point2d p1,p2;
1474 //ConstantFloatFunction c;
1475 LineIn2d2 line;
1476 //IdentityFunction<float> id;
1478 //Equalizer2<float,float,float> eq;
1479 float y;
1480};
1481
1483{
1484public:
1485 PolygonLines(PlanePoints2d &points, int num) : points(points),num(num) { }
1486 int Size() const
1487 {
1488 int i2 = 0;
1489 int count=0;
1490 int s = points.Size();
1491 for(;i2<s;i2++)
1492 {
1493 if (count == num) break;
1494 if (i2!=0 && points.Type(i2)==PlanePoints2d::EMove)
1495 count++;
1496 }
1497 int i3 = 0;
1498 int s2 = points.Size();
1499 for(;i2<s2;i2++,i3++)
1500 {
1501 if (i2!=0 && points.Type(i2)==PlanePoints2d::EMove) { break; }
1502 }
1503 return i3-1;
1504 }
1505 Line2d Index(int i) const
1506 {
1507 int i2 = 0;
1508 int count = 0;
1509 int s = points.Size();
1510 for(;i2<s;i2++)
1511 {
1512 if (count == num) break;
1513 if (i2!=0 && points.Type(i2)==PlanePoints2d::EMove)
1514 count++;
1515 }
1516 int pos = i2+i;
1517 Point2d p1 = points.Map(pos);
1518 Point2d p2 = points.Map(pos+1);
1519 Line2d l;
1520 l.p1 = p1;
1521 l.p2 = p2;
1522 return l;
1523 }
1524private:
1525 PlanePoints2d &points;
1526 int num;
1527};
1528
1529#if 0
1530class PolygonFill : public ContinuousBitmap<bool>
1531{
1532public:
1533 PolygonFill(float sx, float sy, Line2dCollection &coll) : sx(sx), sy(sy), coll(coll), swapped(coll) { }
1534 void Collect(CollectVisitor &vis)
1535 {
1536 }
1537 void HeavyPrepare() { }
1538
1539 void Prepare() { }
1540 float SizeX() const { return sx; }
1541 float SizeY() const { return sy; }
1542 bool Map(float x, float y) const
1543 {
1544 //std::cout << "PolygonFill" << x << " " << y << std::endl;
1545 FilterLines filter(swapped, y);
1546 bool res = false;
1547 int size = coll.Size();
1548 for(int i=0;i<size;i++)
1549 {
1550 bool use = filter.Index(i);
1551 //std::cout << "Use: " << use << " ";
1552 if (use)
1553 {
1554 Line2d l = coll.Index(i);
1555 //std::cout << "l: " << l.p1.x << "," << l.p1.y << " " << l.p2.x << "," << l.p2.y << " ";
1556 LineIn2dScanLine line(l.p1,l.p2,y);
1557 //std::cout << "line: " << line.Index(0) << " " << line.Index(20) << std::endl;
1558 bool b = line.Index(x);
1559 if (line.Index(0)==true && line.Index(sx-1)==false) b = !b;
1560 //std::cout << "b: " << b << std::endl;
1561 //res = res && b;
1562 if (b)
1563 {
1564 res = !res;
1565 }
1566 }
1567 }
1568 return res;
1569 }
1570private:
1571 float sx,sy;
1572 Line2dCollection &coll;
1573 mutable SwapLine2dCollection swapped;
1574};
1575#endif
1576
1577class TextureWithHole : public Bitmap<Color>
1578{
1579public:
1580 TextureWithHole(Bitmap<Color> &orig, PointCollection2d &coll)/* : cont(orig, orig.SizeX(),orig.SizeY()),*/ /*lines(coll, true),*/ /*poly(orig.SizeX(), orig.SizeY(), lines),*/ /*anot(cont, poly),*/ /*sample(anot, orig.SizeX(), orig.SizeY())*/ { }
1582 {
1583 // sample.Collect(vis);
1584 }
1585 void HeavyPrepare() { }
1586
1587 void Prepare() { /*sample.Prepare();*/ }
1588
1589 int SizeX() const { return 0; /*return sample.SizeX();*/ }
1590 int SizeY() const { return 0; /*return sample.SizeY();*/ }
1591 Color Map(int x, int y) const { Color c; return c; /*return sample.Map(x,y);*/ }
1592
1593private:
1594 //ContinuousBitmapFromBitmap<Color> cont;
1595 //ContinuousLines2d lines;
1596 //PolygonFill poly;
1597 //AndNotColorContinuousBitmap anot;
1598 //SampleBitmap sample;
1599};
1600
1601class GradientWithHole : public Bitmap<Color>
1602{
1603public:
1604 GradientWithHole(int sx, int sy, Point2d p1, Point2d p2, Color c1, Color c2,
1605 PointCollection2d &points)
1606 : grad(float(sx), float(sy), p1, p2, c1,c2),
1607 sample(grad, sx, sy),
1608 hole(sample, points) { }
1609 void Prepare() {}
1610
1611 int SizeX() const { return hole.SizeX(); }
1612 int SizeY() const { return hole.SizeY(); }
1613 Color Map(int x, int y) const { return hole.Map(x,y); }
1614
1615private:
1616 GradientBitmap grad; // ContinuousBitmap<Color>
1617 SampleBitmap sample;
1618 TextureWithHole hole;
1619};
1620
1621//
1622// Moving objects
1623//
1625{
1626public:
1627
1628};
1629template<class A>
1630class MinusFunction : public Function<A, float>
1631{
1632public:
1634 float Index(A x) const
1635 {
1636 return f.Index(x) - g.Index(x);
1637 }
1638private:
1641};
1642
1643
1644// 1) Screen surface Point2d
1645// 2) 3d world coordinates Point3d
1646// 3) 3d object coordinates Point3d
1647// 4) 2d texture coordinates Point2d
1648// 5) Texture pixel Color
1649
1650//
1651// Polynomial equation solving exactly
1652//
1653
1654class ConstantFunction : public Function<float, float>
1655{
1656public:
1657 ConstantFunction(float val) : val(val) { }
1658 float Index(float x) const { return val; }
1659private:
1660 float val;
1661};
1662
1663class SquareFunction : public InvertableFunction<float,float>
1664{ // x*x
1665public:
1666 float Index(float x) const { return x*x; }
1667 std::vector<float> Inverse(float x) const
1668 {
1669 std::vector<float> v;
1670 float val = sqrt(x);
1671 v.push_back(val);
1672 v.push_back(-val);
1673 return v;
1674 }
1675};
1676
1677class TimesConstantFunction : public InvertableFunction<float, float>
1678{ // *c
1679public:
1680 TimesConstantFunction(float c) : c(c) { }
1681 float Index(float x) const { return x*c; }
1682 std::vector<float> Inverse(float x) const
1683 {
1684 std::vector<float> v;
1685 x/=c;
1686 v.push_back(x);
1687 return v;
1688 }
1689private:
1690 float c;
1691};
1692
1693template<class X, class Y>
1694class SumXFunctionPullback : public Function<Y, std::vector<X> > // y|->x
1695{ // f(x) + g(y) = h(y)
1696public:
1698 std::vector<X> Index(Y x) const
1699 {
1700 return pb.Index(x);
1701 }
1702private:
1703 MinusFunction<Y> minus; // Y->float
1705};
1706
1707template<class X, class Y, class Z>
1708class SumXFunctionPullback2 : public Function<std::pair<Y,Z>, std::vector<X> >
1709{ // f(x) + g(y,z) = h(y,z)
1710public:
1712 Function< std::pair<Y,Z>, float> &g,
1713 Function< std::pair<Y,Z> , float > &h)
1714 : pb(f,g,h) { }
1715 std::vector<X> Index(std::pair<Y,Z> p) const
1716 {
1717 return pb.Index(p);
1718 }
1719private:
1721};
1722
1723class TreFoilKnot : public Curve<Point>
1724{
1725public:
1726 float Size() const { return 2.0*3.14159; }
1727 Point Index(float t) const
1728 {
1729 Point p;
1730 p.x = (2.0*cos(3*t))*cos(2.0*t);
1731 p.y = (2.0+cos(3*t))*sin(2.0*t);
1732 p.z = sin(3.0*t);
1733 return p;
1734 }
1735};
1736
1737class ChooseX2d : public Function<float, float>
1738{
1739public:
1741 float Index(float x) const { return f.Index(x).x; }
1742private:
1744};
1745
1746class ChooseY2d : public Function<float, float>
1747{
1748public:
1750 float Index(float x) const { return f.Index(x).y; }
1751private:
1753};
1754
1755
1756inline float FindRoot(Function<float,float> &f, float x) // f: x->y, returns x
1757{
1758 DerivateFunction df(f, 0.01);
1759 for(int i=0;i<20;i++)
1760 {
1761 x = x - f.Index(x)/df.Index(x);
1762 }
1763 return x;
1764}
1766{
1767 DerivateFunction df(f, 0.01);
1768 DerivateFunction ddf(df, 0.01);
1769 for(int i=0;i<20;i++)
1770 {
1771 x = x - df.Index(x)/ddf.Index(x);
1772 }
1773 return x;
1774}
1775
1776
1777//
1778// Equation solving using expressions
1779//
1790
1791class Expr
1792{
1793public:
1794 virtual int ChildCount() const=0;
1795 virtual Expr *Child(int i) const=0;
1796 virtual int Type() const=0;
1797};
1798
1799class X : public Expr
1800{
1801public:
1802 virtual int ChildCount() const { return 0; }
1803 virtual Expr *Child(int i) const { return 0; }
1804 virtual int Type() const { return EX; }
1805};
1806class Y : public Expr
1807{
1808public:
1809 virtual int ChildCount() const { return 0; }
1810 virtual Expr *Child(int i) const { return 0; }
1811 virtual int Type() const { return EY; }
1812};
1813class Num : public Expr
1814{
1815public:
1816 Num(float c) : c(c) { }
1817 virtual int ChildCount() const { return 0; }
1818 virtual Expr *Child(int i) const { return 0; }
1819 virtual int Type() const { return ENum; }
1820
1821 float c;
1822};
1823
1824class Plus2 : public Expr {
1825public:
1826 Plus2(Expr &t, Expr &k) : t(t), k(k) { }
1827 virtual int ChildCount() const { return 2; }
1828 virtual Expr *Child(int i) const { if (i==0) return &t; else return &k; }
1829 virtual int Type() const { return EPlus; }
1830
1833};
1834
1835class Pow2 {
1836public:
1837 Pow2(Expr &t) : t(t) { }
1838 virtual int ChildCount() const { return 1; }
1839 virtual Expr *Child(int i) const { return &t; }
1840 virtual int Type() const { return EPow2; }
1842};
1843
1844class Pow3 {
1845public:
1846 Pow3(Expr &t) : t(t) { }
1847 virtual int ChildCount() const { return 1; }
1848 virtual Expr *Child(int i) const { return &t; }
1849 virtual int Type() const { return EPow3; }
1851};
1852
1853class Mul2 {
1854public:
1855 Mul2(Expr &t, Expr &k) : t(t), k(k) { }
1856 virtual int ChildCount() const { return 2; }
1857 virtual Expr *Child(int i) const { if (i==0) return &t; else return &k; }
1858 virtual int Type() const { return EPlus; }
1859
1861};
1862
1863template<class T, class K>
1864class Eq
1865{
1866public:
1867 Eq(Expr &t, Expr &k) : t(t), k(k) { }
1870};
1871
1872//
1873// Support functions for pullback and equalizer
1874//
1875//
1876class FloatSpace : public Function<Point, float>
1877{
1878public:
1879 float Index(Point p) const { return Get(p); }
1880 virtual float Get(Point p) const=0;
1881};
1882
1883class FloatSpaceFunction : public Function<Point,float>
1884{
1885public:
1887 float Index(Point p) const { return sp.Get(p); }
1888private:
1889 FloatSpace &sp;
1890};
1891
1893{
1894public:
1895 virtual float Get(Point p, float time) const=0;
1896};
1897
1899{
1900public:
1901 DistanceFloatSpace(Point center) : center(center) { }
1902 virtual float Get(Point p) const
1903 {
1904 p-=center;
1905 return Vector(p).Dist();
1906 }
1907private:
1908 Point center;
1909};
1910
1912{
1913public: // values are 0.0 -- 1.0
1914 FloatSpaceY(float start_y, float end_y) : start_y(start_y), end_y(end_y) { }
1915 virtual float Get(Point p) const
1916 {
1917 if (p.y < start_y) return 0.0;
1918 if (p.y > end_y) return 1.0;
1919 return (p.y-start_y)/(end_y-start_y);
1920 }
1921private:
1922 float start_y;
1923 float end_y;
1924};
1925
1927{
1928public:
1929 ConstantFloatSpace(float val) : x(val) { }
1930 float Get(Point p) const { return x; }
1931
1932private:
1933 float x;
1934};
1935
1937{
1938public:
1939 UpgradeFloatSpace(FloatSpace &orig, VolumeObject &v, float value) : v(v), value(value), orig(orig) { }
1940 float Get(Point p) const
1941 {
1942 float val = orig.Get(p);
1943 bool b = v.Inside(p);
1944 if (val < value && b)
1945 {
1946 return value;
1947 }
1948 return val;
1949 }
1950private:
1951 VolumeObject &v;
1952 float value;
1953 FloatSpace &orig;
1954};
1955
1957{
1958public:
1959 DowngradeFloatSpace(FloatSpace &orig, VolumeObject &v, float value) : v(v), value(value), orig(orig) { }
1960 float Get(Point p) const
1961 {
1962 float val = orig.Get(p);
1963 bool b = v.Inside(p);
1964 if (val > value && b)
1965 {
1966 return value;
1967 }
1968 return val;
1969 }
1970private:
1971 VolumeObject &v;
1972 float value;
1973 FloatSpace &orig;
1974};
1975
1977{
1978public:
1979 UpgradeTimedFloatSpace(TimedFloatSpace &orig, TimedVolumeObject &v, float value) : v(v), value(value), orig(orig) { }
1980 float Get(Point p, float time) const
1981 {
1982 float val = orig.Get(p, time);
1983 bool b = v.Inside(p, time);
1984 if (val < value && b)
1985 {
1986 return value;
1987 }
1988 return val;
1989 }
1990private:
1992 float value;
1993 TimedFloatSpace &orig;
1994};
1995
1996#if 0
1997class DowngradeTimedFloatSpace : public FloatSpace
1998{
1999public:
2000 DowngradeTimedFloatSpace(TimedFloatSpace &orig, TimedVolumeObject &v, float value) : v(v), value(value), orig(orig) { }
2001 float Get(Point p, float time) const
2002 {
2003 float val = orig.Get(p, time);
2004 bool b = v.Inside(p, time);
2005 if (val > value && b)
2006 {
2007 return value;
2008 }
2009 return val;
2010 }
2011private:
2012 TimedVolumeObject &v;
2013 float value;
2014 TimedFloatSpace &orig;
2015};
2016#endif
2018{
2019public:
2020 MinFloatSpace(FloatSpace &s1, FloatSpace &s2) : s1(s1), s2(s2) { }
2021 float Get(Point p) const
2022 {
2023 return std::min(s1.Get(p), s2.Get(p));
2024 }
2025private:
2026 FloatSpace &s1;
2027 FloatSpace &s2;
2028};
2029
2031{
2032public:
2033 MaxFloatSpace(FloatSpace &s1, FloatSpace &s2) : s1(s1), s2(s2) { }
2034 float Get(Point p) const
2035 {
2036 return std::max(s1.Get(p), s2.Get(p));
2037 }
2038private:
2039 FloatSpace &s1;
2040 FloatSpace &s2;
2041};
2042
2044{
2045public:
2047 float Get(Point p, float time) const
2048 {
2049 return std::min(s1.Get(p, time), s2.Get(p, time));
2050 }
2051private:
2052 TimedFloatSpace &s1;
2053 TimedFloatSpace &s2;
2054};
2055
2057{
2058public:
2060 float Get(Point p, float time) const
2061 {
2062 return std::max(s1.Get(p, time), s2.Get(p, time));
2063 }
2064private:
2065 TimedFloatSpace &s1;
2066 TimedFloatSpace &s2;
2067};
2068
2070{
2071public:
2073 float Get(Point p) const
2074 {
2075 return 1.0-s1.Get(p);
2076 }
2077private:
2078 FloatSpace &s1;
2079};
2080
2082{
2083public:
2085 float Get(Point p, float time) const
2086 {
2087 return 1.0-s1.Get(p, time);
2088 }
2089private:
2090 TimedFloatSpace &s1;
2091};
2092
2094{
2095public:
2096 virtual void SetPoint(Point p)=0;
2097};
2098
2100{
2101public:
2102
2103};
2104
2105
2107{
2108public:
2113 ContinuousVoxel<float> *refletivity; // the percentage which is used to determine which part of colour will be reflected and which part is colour.
2114 //ContinuousVoxel<int> *blurcount;
2115 //ContinuousVoxel<float> *blur_dist;
2116};
2117
2118Color ColorCombine(Color c1, Color c2, float val);
2119
2121{
2122public:
2123 SphereProperties(Point center, float radius, float gap)
2124 {
2125 //volume = new SphereVolume(center, radius);
2126 //surfacepoints = new SphereSurfaceVolume(center, radius, gap);
2127 //normals = new SphereNormalContinuousVoxel(center);
2128 }
2129 SphereVolume *volume; // VolumeObject
2130 //SphereSurfaceVolume *surfacepoints; // VolumeObject
2131 //SphereNormalContinuousVoxel *normals; // ContinuousVoxel<Vector>
2132};
2134Vector Reflect(Point ray_pos, Vector ray_dir, Point hit_pos, Vector normal);
2135
2136template<class T, class K>
2137class Diagonal : public Function<T,std::pair<K,K> >
2138{
2139public:
2141 std::pair<K,K> Index(T t) const
2142 {
2143 K k = f.Index(t);
2144 return std::make_pair(k,k);
2145 }
2146private:
2148};
2149
2150#if 0
2152{
2153public:
2154 RaySphereIntersection(Point center, float radius,
2155 Function<float, Point> &ray,
2156 float t_0, float t_1)
2157 : dist(center), dist_f(dist), surf(radius), surf_f(surf),
2158 diag(ray), pb(dist_f, surf_f, fst, snd, diag, t_0, t_1) { }
2159 Point IntersectionPoint() const { return pb.get_A(); }
2160private:
2161 DistanceFloatSpace dist; // Point center needed
2162 FloatSpaceFunction dist_f;
2163 ConstantFloatSpace surf; // float needed
2164 FloatSpaceFunction surf_f;
2165 Fst<Point,Point> fst;
2166 Snd<Point,Point> snd;
2167 Diagonal<float, Point> diag;
2168 FloatPullback<std::pair<Point,Point>, Point, Point> pb;
2169};
2170#endif
2171
2172class AFunction : public Function<float, float>
2173{
2174public:
2175 AFunction(Function2<float,float,float> &f, float y) : f(f), y(y) { }
2176 float Index(float x) const
2177 {
2178 return f.Index(x,y);
2179 }
2180private:
2182 float y;
2183};
2184
2185class BFunction : public Function<float, float>
2186{
2187public:
2188 BFunction(Function2<float,float,float> &f, float x) : f(f), x(x) { }
2189 float Index(float y) const
2190 {
2191 return f.Index(x,y);
2192 }
2193private:
2195 float x;
2196};
2197
2198class PXFunction : public Function<Point2d, float>
2199{
2200public:
2201 float Index(Point2d p) const
2202 {
2203 return p.x;
2204 }
2205};
2206
2207class PYFunction : public Function<Point2d, float>
2208{
2209public:
2210 float Index(Point2d p) const
2211 {
2212 return p.y;
2213 }
2214};
2215
2216class XProdFunction : public Function<float, Point2d>
2217{
2218public:
2219 XProdFunction(float y) : y(y) { }
2220 Point2d Index(float x) const
2221 {
2222 Point2d p;
2223 p.x = x;
2224 p.y = y;
2225 return p;
2226 }
2227private:
2228 float y;
2229};
2230
2231class YProdFunction : public Function<float, Point2d>
2232{
2233public:
2234 YProdFunction(float x) : x(x) { }
2235 Point2d Index(float y) const
2236 {
2237 Point2d p;
2238 p.x = x;
2239 p.y = y;
2240 return p;
2241 }
2242private:
2243 float x;
2244};
2245
2246
2248{
2249 float x,y; // only valid for border points
2250};
2251
2252#if 0
2253class FunctionPlaneIntersection : public Function2<float, float, std::pair<Point2d, Point2d> >
2254{
2255public:
2256 FunctionPlaneIntersection(Function2<float, float, float> &f, // (x,z)->y
2257 Range rx, Range rz) : fa(f, p.y), fb(f,p.x), rx(rx), rz(rz) { }
2258 std::pair<Point2d,Point2d> Index(float x, float y) const
2259 {
2260 XProdFunction xprod(y);
2261 YProdFunction yprod(x);
2262 FloatPullback xpb(fa,fb, pxf, pyf, xprod, rx.start, rx.end);
2263 FloatPullback ypb(fa,fb, pxf, pyf, yprod, rz.start, rz.end);
2264 Point2d r1;
2265 r1.x = xpb.Elem();
2266 r1.y = y;
2267 Point2d r2;
2268 r2.x = x;
2269 r2.y = ypb.Elem();
2270 return std::make_pair(r1,r2);
2271 }
2272
2273
2274private:
2275 AFunction fa;
2276 BFunction fb;
2277 PXFunction pxf;
2278 PYFunction pyf;
2279 Range rx,rz;
2280};
2281#endif
2282
2283class Point2dDistance : public Function<std::pair<Point2d,Point2d>, float>
2284{
2285public:
2286 float Index(std::pair<Point2d,Point2d> p) const
2287 {
2288 Point2d d;
2289 d.x = p.first.x-p.second.x;
2290 d.y = p.first.y-p.second.y;
2291 return sqrt(d.x*d.x+d.y*d.y);
2292 }
2293};
2294#if 0
2295class IsSpecialPoint : public Function2<float,float, bool>
2296{
2297public:
2298 IsSpecialPoint(Function2<float,float,float> &f, Range rx,Range ry, float dist_required) : sect(f,rx,ry), dist_required(dist_required) { }
2299 bool Index(float x, float y) const
2300 {
2301 std::pair<Point2d, Point2d> p = sect.Index(x,y);
2302 float d = dist.Index(p);
2303 return d<dist_required;
2304 }
2305private:
2306 FunctionPlaneIntersection sect;
2307 Point2dDistance dist;
2308 float dist_required;
2309};
2310#endif
2311
2312//
2313// Proper root finding requires
2314//
2315
2316// 1) f(x,y,z)=0
2317// 2) graph. If f :: RxRxR->R, then we have 4d space (RxRxR)xR
2318// 3) 2nd part of graph, a function RxRxR->(RxRxRxR)-->2
2319// 4) (id_RxRxR,f)
2320// 5) x|->(x,x)
2321// 6) intersection of 4d spaces.
2322
2323// Intersection is:
2324// T------>A
2325// T-->K-->A
2326// T-->S-->A
2327
2328//
2329// 3d version works with a "loop". Put a loop to origo, and a circle in far away.
2330// Then run a root-finding in each position in the loop.
2331//
2332// 4d version works with sphere
2333// then run root-finding with tiny sphere and large sphere.
2334
2335#if 0
2336template<class T, class K>
2337class GraphOfFunction : public Function<T, std::pair<T,K> >
2338{
2339public:
2340 GraphOfFunction(Function<T,K> &f) : f(f) { }
2341 std::pair<T,K> Index(T t) const
2342 {
2343 return std::make_pair(t,f.Index(t));
2344 }
2345private:
2346 Function<T,K> &f;
2347};
2348
2349class Graph3d : public GraphOfFunction<Point,float>
2350{
2351};
2352
2353template<class S, class K>
2354struct GraphPair
2355{
2356 GraphPair(Function<T,K> &f1, Function<T,K> &f2) : gf1(f1), gf2(f2) { }
2357 std::pair<T,K> f1(S t) const { return gf1.Index(t); }
2358 std::pair<T,K> f2(S t) const { return gf2.Index(t); }
2359private:
2360 GraphOfFunction gf1, gf2;
2361};
2362
2363template<class T, class S>
2364class Intersection : public GraphPair<S,K>
2365{
2366public:
2367 virtual S get_1(T t) const=0;
2368 virtual S get_2(T t) const=0;
2369
2370 std::pair<T,K> getA(T t) const { return f1(get_1(t)); }
2371 std::pair<T,K> getB(T t) const { return f2(get_2(t)); }
2372
2373 // can be used to draw a picture.
2374 bool IsRoot(T t) const {
2375 return fabs(getA(t).second-getB(t).second)<0.001;
2376 }
2377};
2378
2379class Sphere
2380{
2381public:
2382 Sphere(Point center, float radius) : center(center), radius(radius) { }
2383 Point get_p(float x, float y)
2384 {
2385 }
2386};
2387
2388class EqSolver3d : public Function<std::pair<float,float>, float>
2389{
2390public:
2391 EqSolver3d(Function<Point, float> &f) : f(f) { }
2392 LineIn3d line(float x, float y) const
2393 {
2394 Point p1 = tiny.get_p(x,y);
2395 Point p2 = large.get_p(x,y);
2396 return l;
2397 }
2398 float Index(std::pair<float,float> p) const
2399 {
2400 float x = p.first;
2401 float y = p.second;
2402 Point p1 = tiny.get_p(x,y);
2403 Point p2 = large.get_p(x,y);
2404 LineIn3d ln(p1,p2);
2405 FunctionCompose<float,float,float> comp(ln, f);
2406 float s = ::Solve(comp, 0.0, 1.0);
2407 return s;
2408 }
2409public:
2410 Sphere tiny;
2411 Sphere large;
2412 Function<Point,float> &f;
2413};
2414
2415
2416
2417template<class T>
2418class OpValue
2419{
2420public:
2421 virtual bool Value(T t) const=0;
2422};
2423
2424template<class A, class B>
2425class OpFunction
2426{
2427public:
2428 virtual OpValue<A> *OpMap(OpValue<B> *value) const=0;
2429};
2430
2431class OpArea // upper limit
2432{
2433};
2434
2435class OpElem // lower limit
2436{
2437};
2438
2439//
2440// Differential equations
2441//
2442
2443// triangle dy/dx, tangent.
2444// expression e with x and y as variables with (x,y) : RxR
2445// dy/dx = e.
2446// SOLUTION:
2447// dy/dx = e/1.
2448// dy=e && dx=1.
2449
2450
2452{
2453public:
2454 LineLineIntersection(Point2d l1p1, Point2d l1p2,
2455 Point2d l2p1, Point2d l2p2)
2456 : l1p1(l1p1), l1p2(l1p2), l2p1(l2p1), l2p2(l2p2) { }
2457
2458 Point2d IntersectionPoint() const
2459 {
2460 float x1 = l1p1.x;
2461 float y1 = l1p1.y;
2462 float x2 = l1p2.x;
2463 float y2 = l1p2.y;
2464 float x3 = l2p1.x;
2465 float y3 = l2p1.y;
2466 float x4 = l2p2.x;
2467 float y4 = l2p2.y;
2468 // thanks to wikipedia line-line intersection for this stuff.
2469 float xupper =(x1*y2-y1*x2)*(x3-x4)-(x1-x2)*(x3*y4-y3*x4);
2470 float xlower = (x1-x2)*(y3-y4)-(y1-y2)*(x3-x4);
2471 float xx = xupper/xlower;
2472 float yupper = (x1*y2-y1*x2)*(y3-y4)-(y1-y2)*(x3*y4-y3*x4);
2473 float ylower = (x1-x2)*(y3-y4)-(y1-y2)*(x3-x4);
2474 float yy = yupper/ylower;
2475 Point2d p;
2476 p.x = xx;
2477 p.y = yy;
2478 return p;
2479 }
2480
2481private:
2482 Point2d l1p1, l1p2;
2483 Point2d l2p1, l2p2;
2484};
2485
2486
2487class SquareWithTriangle
2488{
2489public:
2490 // x^2+y^2=z^2
2491 // sin x = y/z
2492 // cos x = x/z
2493 // tan x = x/y
2494 // multiplication: area = x*y
2495 // factoring: A => (X,Y). x*y |- (x,y)
2496 // Question: How is a*b |-> z link working? It is same as factoring composed with atan(x,y).
2497};
2498
2499
2500//
2501// FULL CATEGORY IMPLEMENTATION
2502//
2503
2504template<template<> class Container, class A, class B>
2505class CATArrow
2506{
2507public:
2508 virtual B Func(A a) const=0;
2509 virtual Container<std::vector<A> > BackwardFunc(Container<B> cont) const=0;
2510};
2511
2512template<template<> class Container1, template<> class Container2, class A, class B>
2513class CATTypeConv
2514{
2515public:
2516 virtual Container2<B> Conv2(Container1<A> cont);
2517 virtual Container1<A> Conv1(Container2<B> cont);
2518};
2519
2520template<template<> class Container1, template<> class Container2, template<> class Container12, class A, class B, class C>
2521class CATCombinePair
2522{
2523public:
2524 virtual std::pair<Container1<A>, Container2<B> > Separate(Container12<C> c) const=0;
2525 virtual Container12<C> Combine(std::pair<Container1<A>, Container2<B> > p) const=0;
2526};
2527
2528template<template<> class Container, class A>
2529class CATSingleElemPair
2530{
2531public:
2532 virtual Container<A> SingleElem(A a) const=0;
2533};
2534
2535template<template<> class Container, class A, class I>
2536class CATChooseElem
2537{
2538public:
2539 virtual A ChooseElem(Container<A> cont, I elem) const=0;
2540};
2541
2542template<template<> class Container, class T>
2543class CATCount
2544{
2545public:
2546 virtual void SetContainer(Container<T> &cont)=0;
2547 virtual int NumItems() const=0;
2548};
2549
2550
2551template<template<> class Container, class A>
2552class CATIdentity
2553{
2554public:
2555 virtual Container<A> Identity(Container<A> cont) const=0;
2556};
2557
2558class TriangleComposition
2559{
2560public:
2561 CatArrow<C1, A,B> *Composition(CATArrow<C1, A,C> *c1, CATArrow<C1,C,B> *c2) const=0;
2562};
2563
2564class SquareComposition
2565{
2566public:
2567 //std::pair<CATArrow<C1,A,B1>*, CATArrow<C1,B1,C>*> Composition(CATArrow<C1,A,K1> *c1, CATArrow<C1,K1,C> *c2);
2568 //std::pair<CATArrow<C1,A,K1>*, CATArrow<C1,K1,C>*> Composition2(CATArrow<C1,A,B1> *c1, CATArrow<C1,B1,C> *c2);
2569 CATArrow<C1,A,C> *Intersection(CATARrow<C1,A,B> *c1, CATArrow<C1,B,C> *c2,
2570 CATArrow<C1,A,B2> *d1, CATArrow<C1,B2,C> *d2)
2571 {
2572 // implement as A->(B INTERSECT B2) -> C
2573 }
2574};
2575
2576class CATIntersection
2577{
2578public:
2579 virtual CatArrow<C1,A,B> *Intersect(CATArrow<C1,A,B> *a1, CATArrow<C1,A,B> *a2) const=0;
2580};
2581
2582class CATIntersectionArrow : public CATArrow<C1,A,B>
2583{
2584public: //
2585 CATIntersectionArrow(CATArrow<C1,A,B> *a1, CATArrow<C1,A,B> *a2) : a1(a1), a2(a2) : a1(a1), a2(a2)
2586 {
2587 }
2588private:
2589 virtual B Func(A a) const
2590 {
2591
2592 }
2593 virtual C1<std::vector<A> > BackwardFunc(C1<B> cont) const
2594 {
2595 }
2596private:
2597 CATArrow<C1,A,B> *a1;
2598 CATArrow<C1,A,B> *a2;
2599
2600};
2601
2602//
2603// IMPLEMENTATIONS
2604//
2605template<template<> class Container, class A, class B, class C>
2606class CATIntersection : public CATCombinePair<Container, Container, Container, A,B,C>, private CATArrow<Container, C,bool>
2607{
2608public:
2609 CATIntersection(bool (*fptrA)(A), bool (*fptrB)(B),
2610 CATArrow<Container, A, C> &fA,
2611 CATArrow<Container, B,C> &fB,
2612 CATSingleElemPair<Container, C> &singleelem,
2613 CATChooseElem<Container,C,int> &choose,
2614 CATCount<Container, bool> &count,
2615 CATChooseElem<Container,A,int> &chooseA,
2616 CATChooseElem<Container,B,int> &chooseB,
2617 CATCount<Container,A> &countA,
2618 CATCount<Container,B> &countB)
2619 :
2620 fptrA(fptrA), fptrB(fptrB), fA(fA), fB(fB), singleelem(singleelem), choose(choose),
2621 count(count), chooseA(chooseA), chooseB(chooseB), countA(countA), countB(countB)
2622 { }
2623 virtual std::pair<Container<A>, Container<B> > Separate(Container<C> c) const=0;
2624 virtual Container<C> Combine(std::pair<Container<A>, Container<B> > p) const
2625 {
2626 Container<A> cA = p.first;
2627 countA.SetContainer(cA);
2628 int na = countA.NumItems();
2629 std::vector<C> vec;
2630 for(int i1=0;i1<na;i1++)
2631 {
2632 A a1 = chooseA.ChooseElem(cA, i1);
2633 C c = fA.Func(a1);
2634 if (Func(c))
2635 vec.push_back(c);
2636 }
2637
2638
2639 Container<B> cB = p.second;
2640 countB.SetContainer(cB);
2641 int nb = countB.NumItems();
2642 for(int i2=0;i2<nb;i2++)
2643 {
2644 A a2 = chooseA.ChooseElem(cA, i2);
2645 C c = fB.Func(a2);
2646 if (Func(c))
2647 vec.push_back(c);
2648 }
2649
2650 }
2651 virtual bool Func(C c) const
2652 {
2653 Container<C> cc = singleelem.SingleElem(c);
2654 Container<A> a = fA.BackwardFunc(cc);
2655 Container<B> b = fB.BackwardFunc(cc);
2656 countA.SetContainer(a);
2657 int na = countA.NumItems();
2658 bool ba = false;
2659 for(int i1=0;i1<na;i1++)
2660 {
2661 A a1 = chooseA.ChooseElem(a,i1);
2662 bool aa = fptrA(a1);
2663 ba = ba || aa;
2664 }
2665 countB.SetContainer(b);
2666 int nb = countB.NumItems();
2667 bool bb2 = false;
2668 for(int i2=0;i2<nb;i2++)
2669 {
2670 B b1 = chooseB.ChooseElem(b,i2);
2671 bool bb = fptrB(b1);
2672 bb2 = bb2 || bb;
2673 }
2674 return ba && bb2;
2675 }
2676 virtual Container<std::vector<C> > BackwardFunc(Container<bool> cont) const
2677 {
2678 count.SetContainer(cont);
2679 int n = count.NumItems();
2680 for(int i=0;i<n;i++)
2681 {
2682 bool b = choose.ChooseElem(cont,i);
2683 }
2684 }
2685
2686private:
2687 bool (*fptrA)(A);
2688 bool (*fptrB)(B);
2689 //C (*fA)(A);
2690 //C (*fB)(B);
2691 CATArrow<Container, A,C> &fA;
2692 CATArrow<Container, B,C> &fB;
2693 CATSingleElemPair<Container,C> &singleelem;
2694 CATChooseElem<Container,C,int> &choose;
2695 CATCount<Container> &count;
2696 CATChooseElem<COntainer,A,int> &chooseA;
2697 CATChooseElem<Container,B,int> &chooseB;
2698 CATCount<Container> &countA;
2699 CATCount<Container> &countB;
2700};
2701
2702
2703template<class Container, class T>
2704class CATVector : public CATChooseElem<Container, T, int>, public CATCount<Container, T>
2705{
2706public:
2707 CATVector(std::vector<T> &vec) : vec(vec) { }
2708 virtual T ChooseElem(Container<T> cont, int elem) const
2709 {
2710 //m_cont = cont;
2711 //Refresh();
2712 return vec[elem];
2713 }
2714 virtual void SetContainer(Container<T> &cont) { /*m_cont = cont;*/ }
2715 virtual int NumItems() const { return vec.count(); }
2716
2717private:
2718 //Container<T> m_cont;
2719 std::vector<T> &vec;
2720};
2721
2722template<class Container, class T>
2723class CATVector2 : public Container<T>
2724{
2725public:
2726 CATVector2(std::vector<T> &vec) : vec(vec) { }
2727
2728private:
2729 std::vector<T> &vec;
2730};
2731
2732
2733//
2734// Proper intersection
2735//
2736
2737template<class T, class A, class B, class K>
2738class Intersection3 : public Function<T,std::pair<K,K> >
2739{
2740public:
2741 // functions must throw exception if not possible to do it
2742 Intersection3(Function<T,A> &ta,
2743 Function<T,B> &tb,
2744 Function<A,K> &ak,
2745 Function<B,K> &bk) : ta(ta), tb(tb), ak(ak), bk(bk) { }
2746 // throws if outside of the intersection
2747 K Index(T t) const
2748 {
2749 K k1;
2750 K k2;
2751 k1 = ak.Index(ta.Index(t));
2752 k2 = bk.Index(tb.Index(t));
2753 return std::make_pair(k1,k2);
2754 }
2755
2756private:
2757 Function<T,A> &ta;
2758 Function<T,B> &tb;
2759 Function<A,K> &ak;
2760 Function<B,K> &bk;
2761};
2762
2763template<class P, class A, class B, class K>
2764class pullback3 : public Intersection3<std::pair<P,K>, std::pair<P,K>, std::pair<P,K>, std::pair<P,K> >
2765{
2766};
2767
2768class SphereIntersectionTexture : public Bitmap<bool>
2769{
2770public:
2771 SphereIntersectionTexture(Point center1, float radius1,
2772 Point center2, float radius2,
2773 int sx, int sy) : center1(center1), radius1(radius1),
2774 center2(center2), radius2(radius2)
2775 sx(sx), sy(sy) { }
2776 virtual int SizeX() const { return sx; }
2777 virtual int SizeY() const { return sy; }
2778 virtual bool Map(int x, int y) const
2779 {
2780 float xx = float(x)/float(sx);
2781 float yy = float(y)/float(sy);
2782 SphericalPoint point(center1);
2783 point.r = radius1;
2784 point.alfa = xx*2.0*3.14159;
2785 point.beta = yy*2.0*3.14159;
2786 Point pos = point.ToPoint();
2787 pos -= center2;
2788 float d = Vector(pos).Dist();
2789 return d < radius2;
2790 }
2791
2792};
2793
2794template<class A>
2795class Occupied : public Function<A, bool>
2796{
2797public:
2798 virtual B f(A a) const=0;
2799 virtual B g(A a) const=0;
2800 bool Index(A x) const { return f(x)==g(x); }
2801};
2802
2803
2804template<class T, class C>
2805class PullbackMinus : public Function<T,C>
2806{
2807public:
2808 PullbackMinus(Function<T,C> &c1, Function<T,C> &c2) : c1(c1),c2(c2)
2809 {
2810 }
2811 C Index(T t) const { return c1.Index(t)-c2.Index(t); }
2812private:
2813 Function<T,C> &c1;
2814 Function<T,C> &c2;
2815};
2816
2817
2818/* THIS IS WORKING PULLBACK with T=float, C=float! */
2819/* todo: CHECK If negative values work in SolveWithFailure() */
2820template<class T, class A, class B, class C>
2821class Pullback
2822{
2823public:
2824 Pullback(Function<A,C> &f1, Function<B,C> &f2,
2825 Function<T,A> &p1, Function<T,B> &p2) : f1(f1), f2(f2),p1(p1),p2(p2), compose1(p1,f1), compose2(p2,f2), minus(compose1, compose2) { }
2826 T Solve(T t_0, T t_1, bool &success) const
2827 {
2828 success = false;
2829 T val = SolveWithFailure(minus, t_0, t_1, success);
2830 if (success) return val;
2831 return T();
2832 }
2833
2834private:
2835 Function<A,C> &f1;
2836 Function<B,C> &f2;
2837 Function<T,A> &p1;
2838 Function<T,B> &p2;
2839 FunctionCompose<T,A,C> compose1;
2840 FunctionCompose<T,B,C> compose2;
2841 PullbackMinus<T,C> minus;
2842};
2843
2844class DistanceFunction : public Function<Point,float>
2845{
2846public:
2847 DistanceFunction(Point center) : center(center) { }
2848 float Index(Point p) const { p-=center; return sqrt(p.x*p.x+p.y*p.y+p.z*p.z); }
2849private:
2850 Point center;
2851};
2852class ConstantFunction : public Function<void, float>
2853{
2854public:
2855 ConstantFunction(float val) : val(val) { }
2856 float Index(void) const { return val; }
2857};
2858class PointIdentity : public Function<float,Point>
2859{
2860public:
2861 PointIdentity(Point p1, Vector v) : p1(p1), v(v) { }
2862 Point Index(float p) const { return p1+v*p; }
2863private:
2864 Point p1;
2865 Vector v;
2866};
2867class PointExclam : public Function<Point, void>
2868{
2869public:
2870 void Index(Point p) const { }
2871};
2872class SpherePullback : public Pullback<float, Point, void, float>
2873{
2874public:
2875 SpherePullback(Point ray_p1, Vector ray_v, Point center, float val) : Pullback<float,Point,void,float>(dist, cx, id, exc), dist(center), id(ray_p1,ray_v), cx(val) { }
2876 float Solve(float p1, float p2, bool &success) const
2877 {
2878 return Pullback<float,Point,void,float>::Solve(p1,p2,success);
2879 }
2880private:
2881 DistanceFunction dist;
2882 ConstantFunction cx;
2883 PointIdentity id;
2884 PointExclam exc;
2885};
2886
2887class BlobPullback : public Pullback<float, Point, Point, float>
2888{
2889public:
2890
2891private:
2892 DistanceFunction dist1, dist2;
2893 PointIdentity ray1, ray2;
2894};
2895
2896
2897//
2898// Volumes and surfaces
2899//
2900template<class T>
2901class VolumeToSurface : public Function<Point2d, float>
2902{
2903public:
2904 VolumeToSurface(Function<Point2d, Point> &surface,
2905 Function<Point, T> &object) : surface(surface), object(object)
2906 {
2907 }
2908 float Index(Point2d p) const
2909 {
2910 return object.Index(surface.Index(p));
2911 }
2912private:
2913 Function<Point2d, Point> &surface;
2914 Function<Point,T> &object;
2915};
2916
2917class XYPlane : public Function<Point2d, Point>
2918{
2919public:
2920 XYPlane(float z) : z(z) { }
2921 Point Index(Point2d p) const { return Point(p.x,p.y,z); }
2922private:
2923 float z;
2924};
2925
2926//
2927// Complex distance
2928//
2929
2930struct RadiusPoints
2931{
2932 Point p1,p2;
2933 float r;
2934};
2935
2936struct RadiusPointCalc
2937{
2938 Vector pos(Point p) const
2939 {
2940 Vector v1 = p-p1;
2941 Vector v2 = p-p2;
2942 Plane pl(p, v1,v2);
2943 Point2d p2d = { pl.CoordsX(p), pl.CoordsY(p) };
2944 Point2d p2d2 = { pl.CoordsX(p1), pl.CoordsY(p1) };
2945 Point2d p2d3 = { pl.CoordsX(p2), pl.CoordsY(p2) };
2946
2947 Vector2d v2 = p2d2-p2d;
2948 Vector2d v3 = p2d3-p2d;
2949 Vector2d v = v2+v3;
2950
2951 LineLineIntersection intersect(p2d2, p2d3, p2d, p2d+v);
2952 Point2d intersectpoint = intersect.IntersectionPoint();
2953 Point px = pl.Navigate(intersectpoint);
2954
2955
2956 }
2957};
2958
2959
2960class IntersectableCurve2d
2961{
2962public:
2963 virtual Point2d Curve(float val) const=0;
2964 virtual float Dist(Point2d p) const=0;
2965};
2966void Intersection(IntersectableCurve &c1, IntersectableCurve &c2)
2967{
2968 // STEP1 compose c1.Curve and c2.Dist.
2969 // STEP2 use float->float in root finding.
2970}
2971
2972class ConstantMinus : public Function<float,float>
2973{
2974public:
2975 ConstantMinus(Function<float,float> &f, float c) : f(f), c(c) { }
2976 float Index(float x) const
2977 {
2978 return f.Index(x)-c;
2979 }
2980private:
2981 Function<float,float> &f;
2982 float c;
2983};
2984
2985
2986class Pullback_c
2987{
2988public:
2989 Pullback_c(Function<float,float> &f1, Function<float,float> &f2, float b) : f(f), g(g), b(b), cons1(f,b), cons2(g,b) { }
2990 std::pair<float,float> solve(float s1, float s2) const
2991 {
2992 float val = Solve(cons1, s1, s2);
2993 float val2 = Solve(cons2, s1, s2);
2994 return std::make_pair(val, val2);
2995 }
2996private:
2997 Function<float,float> &f;
2998 Function<float,float> &g;
2999 float b;
3000 ConstantMinus cons1;
3001 ConstantMinus cons2;
3002};
3003
3004template<class A, class B>
3005class Pullback_int_d : public Function<std::pair<A,B>, bool>
3006{
3007public:
3008 Pullback_d(Function<A,int> &f, Function<B,int> &g) : f(f), g(g) { }
3009 bool Index(std::pair<A,B> &p) const
3010 {
3011 int c = f.Index(p.first);
3012 int c2 = g.Index(p.second);
3013 return c==c2;
3014 }
3015private:
3016 Function<A,C> &f;
3017 Function<B,C> &g;
3018};
3019
3020template<class A, class B, class C>
3021class Pullback_d : public Function<std::pair<A,B>, bool>
3022{
3023public:
3024 Pullback_d(Function<A,C> &f, Function<B,C> &g) : f(f), g(g) { }
3025 bool Index(std::pair<A,B> &p) const
3026 {
3027 C c = f.Index(p.first);
3028 C c2 = g.Index(p.second);
3029 return c<c2;
3030 }
3031private:
3032 Function<A,C> &f;
3033 Function<B,C> &g;
3034};
3035
3036template<class T, class A, class B, class C>
3037class Pullback_full : public Function<T,std::pair<A,B> >, public Function<std::pair<A,B>, bool>
3038{
3039public:
3040 Pullback_full(Function<T,A> &ta,
3041 Function<T,B> &tb,
3042 Function<A,C> &ac,
3043 Function<B,C> &bc)
3044 : ta(ta),
3045 tb(tb),
3046 ac(ac),
3047 bc(bc) { }
3048
3049 std::pair<A,B> Index(T t) const
3050 {
3051 A a = ta.Index(t);
3052 B b = tb.Index(t);
3053 return std::make_pair(a,b);
3054 }
3055 bool Index(std::pair<A,B> p) const
3056 {
3057 return ac.Index(p.first)==bc.Index(p.second);
3058 }
3059private:
3060 Function<T,A> &ta;
3061 Function<T,B> &tb;
3062 Function<A,C> &ac;
3063 Function<B,C> &bc;
3064};
3065
3066
3067template<class X, class Y>
3068class Exists : public Function<Function<std::pair<X,Y>,bool>*,Function<X,bool>* >, private Function<X,bool>
3069{
3070public:
3071 Exists(std::vector<Y> &vec) : vec(vec) { }
3072 Function<X,bool> *Index(Function<std::pair<X,Y>, bool> &f)
3073 {
3074 ff = &f;
3075 return const_cast<Exists*>(this);
3076 }
3077 bool Index(X x) const
3078 {
3079 int s = vec.size();
3080 bool bb = false;
3081 for(int i=0;i<s;i++)
3082 {
3083 bool b = ff->Index(std::make_pair(x, vec[i]));
3084 bb |= b;
3085 }
3086 return bb;
3087 }
3088private:
3089 Function<std::pair<X,Y>, bool> *ff;
3090 std::vector<Y> &vec;
3091};
3092
3093template<class I, class A, class B>
3094class Arrow
3095{
3096public:
3097 virtual std::pair<A,B> FindMap(I i) const=0;
3098};
3099
3100template<class I, class I1, class I2, class T, class A, class B, class V>
3101class InverseImageOnArrows : public Arrow<I,T,A>
3102{
3103public:
3104 InverseImage(Arrow<I1,V,B> &part, Arrow<I2,A,B> &f) : part(part), f(f) { }
3105 virtual std::pair<T,A> FindMap(I i) const
3106 {
3107 I1 i1 = i.first;
3108 I2 i2 = i.second;
3109 std::pair<V,B> p1 = part.FindMap(i1);
3110 std::pair<A,B> p2 = f.FindMap(i2);
3111 if (p1.second == p2.second)
3112 {
3113 A a = p2.first;
3114 T t = a;
3115 return std::make_pair(t,a);
3116 }
3117 else
3118 {
3119 return std::make_pair(T(),A());
3120 }
3121 }
3122
3123private:
3124 Arrow<I1,V,B> &part;
3125 Arrow<I2,A,B> &f;
3126};
3127
3128
3129#endif
3130
3131class MultiplicationTableI : public Bitmap<int>
3132{
3133public:
3134 int SizeX() const { return 65535; }
3135 int SizeY() const { return 65535; }
3136 int Map(int x, int y) const { return x*y; }
3137};
3139{
3140public:
3141 float SizeX() const { return 65535.0; }
3142 float SizeY() const { return 65535.0; }
3143 float Map(float x, float y) const { return x*y; }
3144};
3145
3146
3147// It's absolutely forbidden to change this class at all
3148template<class A>
3150{
3151public:
3160
3166 ForAllExists forallexists_detection(bool (*bool_property)(A a), std::vector<A> vec, int &pos)
3167 {
3169 bool vecempty = vec.size()==0;
3170 e.exists = vecempty?EUnknown:EUnknownButProbablyFalse;
3171 e.forall = vecempty?EUnknown:EUnknownButProbablyTrue;
3172 int s = vec.size();
3173 int i=0;
3174 for(;i<s;i++)
3175 {
3176 bool b = bool_property(vec[i]);
3177 // (property==true |- exists=true), (property==false |- forall=false)
3178 if (b) { e.exists = ETrue; } else { e.forall=EFalse; }
3179 // optimizations
3180 if (e.exists==ETrue && e.forall==EFalse) { break; }
3181 }
3182 pos = i;
3183 return e;
3184 }
3185};
3186// It's absolutely forbidden to change this class above at all
P func(int c, EveryApi &ev)
Definition test.cpp:59
Env e
Definition Common.cc:2
float Solve(const Function< float, float > &func, float t_0, float t_1)
Definition Effect.cc:1836
FunctionImpl0< VectorCollection *, FloatArray *, Distance > DistanceFunction
Definition Effect.hh:3075
Color ColorCombine(Color c1, Color c2, float val)
Definition Equalizer.cc:2
float FindMinMaxPoint(Function< float, float > &f, float x)
Definition Equalizer.hh:1765
Vector Reflect(Point ray_pos, Vector ray_dir, Point hit_pos, Vector normal)
Definition Equalizer.cc:3
ExprType
Definition Equalizer.hh:1781
@ EPow2
Definition Equalizer.hh:1786
@ EY
Definition Equalizer.hh:1783
@ EPlus
Definition Equalizer.hh:1785
@ ENum
Definition Equalizer.hh:1784
@ EPow3
Definition Equalizer.hh:1787
@ EMul
Definition Equalizer.hh:1788
@ EX
Definition Equalizer.hh:1782
float FindRoot(Function< float, float > &f, float x)
Definition Equalizer.hh:1756
ObjectProperties ToObj(SphereProperties &sp)
Definition Equalizer.cc:9
Point2d SolveWithFailure(const Function< Point2d, float > &func, Point2d tl, Point2d br, bool &error)
GameApi::ML part(GameApi::EveryApi &ev, GameApi::ML ml, float x_trans, float y_rot, int x, int y, int mode=0)
Definition GameApi.cc:38016
Complex ln(Complex z)
Definition GameApi_pl.cc:31431
Complex minus(Complex x, Complex y)
Definition GameApi_pl.cc:31437
Point IntersectionPoint(LinePlaneIntersection &c, Point line_p1, Point line_p2)
Definition Intersect.cc:30
Power< subset< P > * > * Intersect(Power< T > *left_p, Power< K > *right_p)
Point2d LineLineIntersection(Point2d l1_p1, Point2d l1_p2, Point2d l2_p1, Point2d l2_p2)
Definition VectorTools.cc:1564
float Dist(const Point &a, const Point &b)
Definition VectorTools.cc:78
void use(T)
Definition boxed_cast_test.cpp:8
void error(std::string err, std::string fail_reason)
Definition check.cc:18
AFunction(Function2< float, float, float > &f, float y)
Definition Equalizer.hh:2175
float Index(float x) const
Definition Equalizer.hh:2176
Definition compiled_tests.cpp:1189
Definition Equalizer.hh:1307
float Index(Point2d p) const
Definition Equalizer.hh:1309
Definition EffectI.hh:22
Definition Effect.hh:245
float Index(float y) const
Definition Equalizer.hh:2189
BFunction(Function2< float, float, float > &f, float x)
Definition Equalizer.hh:2188
Definition compiled_tests.cpp:1200
bool Index(T t) const
Definition Equalizer.hh:1424
BitmapInverseImage(Bitmap< bool > &bm, Function< T, Pos > &f)
Definition Equalizer.hh:1423
Definition Equalizer.hh:1408
BitmapPowerSet(Bitmap< bool > &bm)
Definition Equalizer.hh:1410
bool Index(Pos p) const
Definition Equalizer.hh:1411
Definition GraphI.hh:826
virtual int SizeY() const =0
virtual int SizeX() const =0
virtual C Map(int x, int y) const =0
Definition Equalizer.hh:720
bool Index(T a_) const
Definition Equalizer.hh:723
ChooseElem(T a)
Definition Equalizer.hh:722
ChooseX2d(Function< float, Point2d > &f)
Definition Equalizer.hh:1740
float Index(float x) const
Definition Equalizer.hh:1741
float Index(float x) const
Definition Equalizer.hh:1750
ChooseY2d(Function< float, Point2d > &f)
Definition Equalizer.hh:1749
virtual void Collect(CollectVisitor &vis)=0
Definition GameApi.cc:43596
virtual void HeavyPrepare()=0
Definition GraphI.hh:622
Definition VectorTools.hh:380
int r
Definition VectorTools.hh:744
int g
Definition VectorTools.hh:744
int b
Definition VectorTools.hh:744
CombineFunctions(Function< A, B > &f, Function< A, B > &g)
Definition Equalizer.hh:669
std::pair< B, B > Index(A a) const
Definition Equalizer.hh:670
Definition Equalizer.hh:245
virtual bool Comp(T t1, T t2) const =0
Color Map(int x, int y) const
Definition Equalizer.hh:810
int SizeX() const
Definition Equalizer.hh:808
int SizeY() const
Definition Equalizer.hh:809
ConstantBitmap2(int sx, int sy, int r, int g, int b)
Definition Equalizer.hh:807
ConstantFloatSpace(float val)
Definition Equalizer.hh:1929
float Get(Point p) const
Definition Equalizer.hh:1930
Definition Equalizer.hh:1655
ConstantFunction(float val)
Definition Equalizer.hh:1657
float Index(float x) const
Definition Equalizer.hh:1658
Definition Containment.hh:34
bool Index(T t) const
Definition Equalizer.hh:1451
ContinuousBitmapInverseImage(ContinuousBitmap< bool > &bm, Function< T, Point2d > &f)
Definition Equalizer.hh:1450
Definition Equalizer.hh:1435
ContinuousBitmapPowerSet(ContinuousBitmap< bool > &bm)
Definition Equalizer.hh:1437
bool Index(Point2d p) const
Definition Equalizer.hh:1438
Definition GraphI.hh:1164
virtual float SizeY() const =0
virtual void Prepare()=0
virtual C Map(float x, float y) const =0
virtual float SizeX() const =0
Definition GraphI.hh:1188
Definition EffectI.hh:30
Definition Equalizer.hh:9
DerivateFunction(Function< float, float > &f, float delta)
Definition Equalizer.hh:11
float Index(float x) const
Definition Equalizer.hh:12
Diagonal(Function< T, K > &f)
Definition Equalizer.hh:2140
std::pair< K, K > Index(T t) const
Definition Equalizer.hh:2141
Definition Equalizer.hh:1211
float Index(Point2d p) const
Definition Equalizer.hh:1213
Distance2dPullback(Function< A, Point2d > &f1, Function< B, Point2d > &f2, Function< P, A > &p1, Function< P, B > &p2, Function< FloatPair, P > &t, FloatPair t_0, FloatPair t_1)
Definition Equalizer.hh:1109
Distance3dPullback(Function< A, Point > &f1, Function< B, Point > &f2, Function< P, A > &p1, Function< P, B > &p2, Function< FloatPoint, P > &t, FloatPoint t_0, FloatPoint t_1)
Definition Equalizer.hh:1124
Definition Equalizer.hh:1220
float Index(Point p) const
Definition Equalizer.hh:1222
virtual float Get(Point p) const
Definition Equalizer.hh:1902
DistanceFloatSpace(Point center)
Definition Equalizer.hh:1901
bool Index(float x) const
Definition Equalizer.hh:592
DistanceFloat(float p, float delta)
Definition Equalizer.hh:591
DistancePoint2d(Point2d p, float r)
Definition Equalizer.hh:603
bool Index(Point2d x) const
Definition Equalizer.hh:604
DistancePullback(Function< A, Point > &f1, Function< B, Point > &f2, Function< P, A > &p1, Function< P, B > &p2, Function< FloatPair, P > &t, FloatPair t_0, FloatPair t_1)
Definition Equalizer.hh:1094
DowngradeFloatSpace(FloatSpace &orig, VolumeObject &v, float value)
Definition Equalizer.hh:1959
float Get(Point p) const
Definition Equalizer.hh:1960
Definition Equalizer.hh:384
A Index(Singleton s) const
Definition Equalizer.hh:387
ElementSingleton(A a)
Definition Equalizer.hh:386
Definition Effect.hh:571
Expr & k
Definition Equalizer.hh:1869
Eq(Expr &t, Expr &k)
Definition Equalizer.hh:1867
Expr & t
Definition Equalizer.hh:1868
Definition Equalizer.hh:615
PowerSet< E > * Index(PowerSet< B > *b) const
Definition Equalizer.hh:618
Equalizer2(Function< A, B > &f1, Function< A, B > &f2, Function< E, A > &e)
Definition Equalizer.hh:617
Equalizer3(Function< A, B > &f1, Function< A, B > &f2)
Definition Equalizer.hh:732
bool Index(std::pair< A, B > &ab) const
Definition Equalizer.hh:733
Equalizer(Compare< B > &comp, Function< A, B > &f1, Function< A, B > &f2)
Definition Equalizer.hh:577
bool Index(A a) const
Definition Equalizer.hh:578
EquivalenceRelation(Compare< C > &comp, Function< A, C > &f)
Definition Equalizer.hh:1192
bool Index(std::pair< A, A > p) const
Definition Equalizer.hh:1193
Definition Equalizer.hh:227
V Element() const
Definition Equalizer.hh:230
Exists(Forall< U > &fa, Function< U, V > &f)
Definition Equalizer.hh:229
Definition Equalizer.hh:1792
virtual int ChildCount() const =0
virtual int Type() const =0
virtual Expr * Child(int i) const =0
Definition Equalizer.hh:411
InverseImageSquare< U, X, Singleton, Y >::Req Req
Definition Equalizer.hh:413
InverseImageSquare< U, X, Singleton, Y >::ResImpl ResImpl
Definition Equalizer.hh:415
InverseImageSquare< U, X, Singleton, Y >::Res Res
Definition Equalizer.hh:414
bool Index(PowerSet< A > *mem) const
Definition Equalizer.hh:397
Fiber(A a)
Definition Equalizer.hh:396
Definition Equalizer.hh:1202
bool Comp(float t1, float t2) const
Definition Equalizer.hh:1204
Definition Equalizer.hh:957
FloatFunction(Function< FloatPair, float > &f)
Definition Equalizer.hh:959
float Index(Point2d x) const
Definition Equalizer.hh:960
Definition Equalizer.hh:983
FloatFunction(const Function< FloatPoint, float > &f)
Definition Equalizer.hh:985
float Index(Point x) const
Definition Equalizer.hh:986
bool Success() const
Definition Equalizer.hh:1030
P get_P() const
Definition Equalizer.hh:1031
std::pair< C, C > get_pair() const
Definition Equalizer.hh:1034
FloatPullbackGeneric(Function< A, C > &f1, Function< B, C > &f2, Function< P, A > &p1, Function< P, B > &p2, Function< T, P > &t, Function< std::pair< C, C >, float > &pb_minus, T t_0, T t_1)
Definition Equalizer.hh:1017
T Elem() const
Definition Equalizer.hh:1025
B get_B() const
Definition Equalizer.hh:1033
A get_A() const
Definition Equalizer.hh:1032
FloatPullback(Function< A, float > &f1, Function< B, float > &f2, Function< P, A > &p1, Function< P, B > &p2, Function< float, P > &t, float t_0, float t_1)
Definition Equalizer.hh:1056
float Index(Point p) const
Definition Equalizer.hh:1887
FloatSpaceFunction(FloatSpace &sp)
Definition Equalizer.hh:1886
FloatSpaceY(float start_y, float end_y)
Definition Equalizer.hh:1914
virtual float Get(Point p) const
Definition Equalizer.hh:1915
Definition Equalizer.hh:1877
virtual float Get(Point p) const =0
float Index(Point p) const
Definition Equalizer.hh:1879
Definition Equalizer.hh:932
FloatFunction(Function< Float, float > &f)
Definition Equalizer.hh:934
float Index(float x) const
Definition Equalizer.hh:935
Definition Equalizer.hh:3150
ForAllExists forallexists_detection(bool(*bool_property)(A a), std::vector< A > vec, int &pos)
Definition Equalizer.hh:3166
State
Definition Equalizer.hh:3153
@ ETrue
Definition Equalizer.hh:3154
@ EUnknownButProbablyTrue
Definition Equalizer.hh:3157
@ EUnknownButProbablyFalse
Definition Equalizer.hh:3158
@ EUnknown
Definition Equalizer.hh:3156
@ EFalse
Definition Equalizer.hh:3155
Definition Equalizer.hh:220
virtual T Element() const =0
Definition Equalizer.hh:1141
T Index(std::pair< T, K > p) const
Definition Equalizer.hh:1143
Definition Effect.hh:518
C Index(const std::pair< A, B > &p)
Definition Effect.hh:522
FunctionCall(Function< A, T > &f, A a)
Definition Equalizer.hh:1383
T Elem() const
Definition Equalizer.hh:1384
Definition Effect.hh:490
FloatArray * Index(VectorCollection *a) const
Definition Effect.hh:417
Definition EffectI.hh:11
virtual B Index(A a) const =0
Vector Index(Point p) const
Definition Equalizer.hh:124
Gradient3d(Function< Point, float > &f)
Definition Equalizer.hh:123
Definition Graph.hh:3311
int SizeY() const
Definition Equalizer.hh:1612
int SizeX() const
Definition Equalizer.hh:1611
GradientWithHole(int sx, int sy, Point2d p1, Point2d p2, Color c1, Color c2, PointCollection2d &points)
Definition Equalizer.hh:1604
Color Map(int x, int y) const
Definition Equalizer.hh:1613
void Prepare()
Definition Equalizer.hh:1609
Vector2d Index(Point2d p) const
Definition Equalizer.hh:105
Gradient(Function< Point2d, float > &f)
Definition Equalizer.hh:104
Definition Effect.hh:7706
ImageBools(Bitmap< Color > &bm)
Definition Equalizer.hh:443
bool Index(Pixel p) const
Definition Equalizer.hh:445
int Index(ImgSelect p) const
Definition Equalizer.hh:757
ImageFunction(Bitmap< Color > &bm)
Definition Equalizer.hh:756
IntegrationFunction(const Function< float, float > &f, float delta, float startx, float endx, float C)
Definition Equalizer.hh:164
float Delta(float x) const
Definition Equalizer.hh:178
float Index(float x) const
Definition Equalizer.hh:165
PowerSet< T > * Index(PowerSet< B > *b) const
Definition Equalizer.hh:496
Intersection2(Function< A, B > &f1, Function< C, B > &f2, Function< T, A > &m1, Function< T, C > &m2)
Definition Equalizer.hh:495
bool Index(A a) const
Definition Equalizer.hh:535
IntersectionArray(Array< int, PowerSet< A > * > &arr)
Definition Equalizer.hh:534
Definition Equalizer.hh:478
bool Index(A a) const
Definition Equalizer.hh:481
Intersection(PowerSet< A > &m, PowerSet< A > &m2)
Definition Equalizer.hh:480
std::vector< A > Index(A a) const
Definition Equalizer.hh:655
InverseEqualizer(Function< A, B > &f, InvertableFunction< A, B > &g)
Definition Equalizer.hh:654
K Index(T t) const
Definition Equalizer.hh:201
std::vector< T > Inverse(K k) const
Definition Equalizer.hh:202
InverseFunctionCompose(InvertableFunction< T, U > &f, InvertableFunction< U, K > &g)
Definition Equalizer.hh:200
InverseImage2(Function< A, B > &f)
Definition Equalizer.hh:459
Function< A, Omega > * Index(Function< B, Omega > *b) const
Definition Equalizer.hh:460
InverseImageA(Function< X, Y > &f, Function< Y, bool > &a)
Definition Equalizer.hh:289
bool Index(X x) const
Definition Equalizer.hh:290
X Index(U u) const
Definition Equalizer.hh:293
Function< A, Omega > * Index(Function< B, Omega > *b) const
Definition Equalizer.hh:327
InverseImageF(Function< A, B > &f)
Definition Equalizer.hh:326
X Index(U u) const
Definition Equalizer.hh:277
InverseImageK(Function< X, Y > &f)
Definition Equalizer.hh:272
Function< U, X > * Index(Function< V, Y > *vy) const
Definition Equalizer.hh:273
Definition Equalizer.hh:352
virtual Y f(X x) const =0
virtual Y j(V v) const =0
virtual X i(U u) const =0
Definition Equalizer.hh:367
bool v(V v) const
Definition Equalizer.hh:371
bool x(X x) const
Definition Equalizer.hh:372
ResImpl(PowerSet< Y > &mem, Req &r)
Definition Equalizer.hh:369
bool u(U u) const
Definition Equalizer.hh:370
bool y(Y y) const
Definition Equalizer.hh:373
Definition Equalizer.hh:359
virtual bool x(X x) const =0
virtual bool y(Y y) const =0
virtual bool u(U u) const =0
virtual bool v(V v) const =0
Definition Equalizer.hh:349
bool Index(Point2d p) const
Definition Equalizer.hh:1397
InverseImageSubset2d(Function< Point2d, float > &f, PowerSet< float > &m)
Definition Equalizer.hh:1396
Definition Equalizer.hh:303
PowerSet< A > * Index(PowerSet< B > *b) const
Definition Equalizer.hh:306
InverseImage(Function< A, B > &f)
Definition Equalizer.hh:305
Definition Equalizer.hh:704
InversePullback(Function< A, C > &ac, InvertableFunction< B, C > &bc)
Definition Equalizer.hh:706
B Index(A a) const
Definition Equalizer.hh:707
Definition Effect.hh:269
Definition Graph.hh:5788
Definition Graph.hh:5977
LineIn2dScanLine(Point2d p1, Point2d p2, float y)
Definition Equalizer.hh:1465
bool Index(float x) const
Definition Equalizer.hh:1466
MaxFloatSpace(FloatSpace &s1, FloatSpace &s2)
Definition Equalizer.hh:2033
float Get(Point p) const
Definition Equalizer.hh:2034
float Get(Point p, float time) const
Definition Equalizer.hh:2060
MaxTimedFloatSpace(TimedFloatSpace &s1, TimedFloatSpace &s2)
Definition Equalizer.hh:2059
float Get(Point p) const
Definition Equalizer.hh:2021
MinFloatSpace(FloatSpace &s1, FloatSpace &s2)
Definition Equalizer.hh:2020
float Get(Point p, float time) const
Definition Equalizer.hh:2047
MinTimedFloatSpace(TimedFloatSpace &s1, TimedFloatSpace &s2)
Definition Equalizer.hh:2046
Definition Equalizer.hh:1631
MinusFunction(Function< A, float > &f, Function< A, float > &g)
Definition Equalizer.hh:1633
float Index(A x) const
Definition Equalizer.hh:1634
Definition Equalizer.hh:1625
virtual Expr * Child(int i) const
Definition Equalizer.hh:1857
Expr & t
Definition Equalizer.hh:1860
Expr & k
Definition Equalizer.hh:1860
virtual int ChildCount() const
Definition Equalizer.hh:1856
virtual int Type() const
Definition Equalizer.hh:1858
Mul2(Expr &t, Expr &k)
Definition Equalizer.hh:1855
Definition Equalizer.hh:3139
float SizeX() const
Definition Equalizer.hh:3141
float Map(float x, float y) const
Definition Equalizer.hh:3143
float SizeY() const
Definition Equalizer.hh:3142
Definition Equalizer.hh:3132
int SizeX() const
Definition Equalizer.hh:3134
int SizeY() const
Definition Equalizer.hh:3135
int Map(int x, int y) const
Definition Equalizer.hh:3136
float c
Definition Equalizer.hh:1821
virtual int Type() const
Definition Equalizer.hh:1819
virtual int ChildCount() const
Definition Equalizer.hh:1817
Num(float c)
Definition Equalizer.hh:1816
virtual Expr * Child(int i) const
Definition Equalizer.hh:1818
OneMinusFloatSpace(FloatSpace &s1)
Definition Equalizer.hh:2072
float Get(Point p) const
Definition Equalizer.hh:2073
OneMinusTimedFloatSpace(TimedFloatSpace &s1)
Definition Equalizer.hh:2084
float Get(Point p, float time) const
Definition Equalizer.hh:2085
Definition Equalizer.hh:2199
float Index(Point2d p) const
Definition Equalizer.hh:2201
Definition Equalizer.hh:2208
float Index(Point2d p) const
Definition Equalizer.hh:2210
Definition Equalizer.hh:26
PartialFunction2_1(Function< Point2d, float > &f, float y_)
Definition Equalizer.hh:28
float Index(float x) const
Definition Equalizer.hh:29
Definition Equalizer.hh:40
float Index(float y) const
Definition Equalizer.hh:43
PartialFunction2_2(Function< Point2d, float > &f, float x_)
Definition Equalizer.hh:42
Definition Equalizer.hh:54
float Index(float x) const
Definition Equalizer.hh:57
PartialFunction3_1(Function< Point, float > &f, float y_, float z_)
Definition Equalizer.hh:56
Definition Equalizer.hh:69
float Index(float y) const
Definition Equalizer.hh:72
PartialFunction3_2(Function< Point, float > &f, float x_, float z_)
Definition Equalizer.hh:71
Definition Equalizer.hh:84
float Index(float z) const
Definition Equalizer.hh:87
PartialFunction3_3(Function< Point, float > &f, float x_, float y_)
Definition Equalizer.hh:86
Definition Equalizer.hh:922
float Index(std::pair< float, float > p) const
Definition Equalizer.hh:924
Definition Graph.hh:8313
@ EMove
Definition Graph.hh:8321
virtual int Type() const
Definition Equalizer.hh:1829
Expr & k
Definition Equalizer.hh:1832
Plus2(Expr &t, Expr &k)
Definition Equalizer.hh:1826
Expr & t
Definition Equalizer.hh:1831
virtual Expr * Child(int i) const
Definition Equalizer.hh:1828
virtual int ChildCount() const
Definition Equalizer.hh:1827
Definition Equalizer.hh:2284
float Index(std::pair< Point2d, Point2d > p) const
Definition Equalizer.hh:2286
Point2dFunction(Function< std::pair< float, float >, float > &f)
Definition Equalizer.hh:147
float Index(Point2d p) const
Definition Equalizer.hh:148
Definition Equalizer.hh:1080
float Index(std::pair< Point2d, Point2d > p) const
Definition Equalizer.hh:1082
Definition Effect.hh:2663
PointCollectionDistance(PointCollection &coll)
Definition Equalizer.hh:1231
float Index(Point p) const
Definition Equalizer.hh:1232
Vector Index(Point p) const
Definition Equalizer.hh:1252
PointCollectionNormal(PointCollection &coll, float dist1, float dist2)
Definition Equalizer.hh:1251
Definition Effect.hh:2456
Definition Equalizer.hh:2094
virtual void SetPoint(Point p)=0
Definition Equalizer.hh:1069
float Index(std::pair< Point, Point > p) const
Definition Equalizer.hh:1071
int Size() const
Definition Equalizer.hh:1486
Line2d Index(int i) const
Definition Equalizer.hh:1505
PolygonLines(PlanePoints2d &points, int num)
Definition Equalizer.hh:1485
Expr & t
Definition Equalizer.hh:1841
virtual int Type() const
Definition Equalizer.hh:1840
virtual Expr * Child(int i) const
Definition Equalizer.hh:1839
virtual int ChildCount() const
Definition Equalizer.hh:1838
Pow2(Expr &t)
Definition Equalizer.hh:1837
virtual Expr * Child(int i) const
Definition Equalizer.hh:1848
virtual int Type() const
Definition Equalizer.hh:1849
Pow3(Expr &t)
Definition Equalizer.hh:1846
Expr & t
Definition Equalizer.hh:1850
virtual int ChildCount() const
Definition Equalizer.hh:1847
Definition Equalizer.hh:239
PowerSet< P > * Index(PowerSet< C > *c) const
Definition Equalizer.hh:864
Pullback2(Function< A, C > &f1, Function< B, C > &f2, Function< P, A > &p1, Function< P, B > &p2)
Definition Equalizer.hh:863
Pullback3(Function< A, C > &f1, Function< B, C > &f2, Function< P, A > &p1, Function< P, B > &p2, bool is_path_from_B)
Definition Equalizer.hh:886
C Index(P p) const
Definition Equalizer.hh:887
Definition Equalizer.hh:902
Pullback4I(Function< A, C > &f1, Function< B, C > &f2, Function< P, A > &p1, Function< P, B > &p2)
Definition Equalizer.hh:904
std::pair< C, C > Index(P p) const
Definition Equalizer.hh:905
InvertableFunction< C, C > * Index(P p) const
Definition Equalizer.hh:1174
Pullback4(Function< A, C > &f1, Function< B, C > &f2, Function< P, A > &p1, Function< P, B > &p2, bool is_path_from_B)
Definition Equalizer.hh:1173
Definition Equalizer.hh:844
bool Index(std::pair< A, B > p) const
Definition Equalizer.hh:848
Pullback(Compare< C > &comp, Function< A, C > &f1, Function< B, C > &f2)
Definition Equalizer.hh:846
bool Index(float x) const
Definition Equalizer.hh:1278
Range2(float start, float end)
Definition Equalizer.hh:1277
Definition Effect.hh:1305
T end
Definition Effect.hh:1310
T start
Definition Effect.hh:1309
Definition RayTracing.hh:8
std::pair< A, B > Index(A a) const
Definition Equalizer.hh:684
RealGraph(Function< A, B > &f)
Definition Equalizer.hh:683
Repeat2(PowerSet< float > &mem, float sizex)
Definition Equalizer.hh:1364
bool Index(float t) const
Definition Equalizer.hh:1365
Definition Graph.hh:3420
Definition Equalizer.hh:1148
K Index(std::pair< T, K > p) const
Definition Equalizer.hh:1150
Definition Equalizer.hh:2100
Definition VolumeObjects.hh:470
Definition Graph.hh:8058
Sphere(Point center, float radius)
Definition Graph.hh:8060
Definition Equalizer.hh:1664
std::vector< float > Inverse(float x) const
Definition Equalizer.hh:1667
float Index(float x) const
Definition Equalizer.hh:1666
Definition Equalizer.hh:1287
Step(float x, bool flip)
Definition Equalizer.hh:1289
bool Index(float xx) const
Definition Equalizer.hh:1290
SubImage(Function< A, bool > &obj, bool choose)
Definition Equalizer.hh:254
A Index(U t) const
Definition Equalizer.hh:259
bool Index(A t) const
Definition Equalizer.hh:255
std::vector< X > Index(std::pair< Y, Z > p) const
Definition Equalizer.hh:1715
SumXFunctionPullback2(InvertableFunction< X, float > &f, Function< std::pair< Y, Z >, float > &g, Function< std::pair< Y, Z >, float > &h)
Definition Equalizer.hh:1711
Definition Equalizer.hh:1695
SumXFunctionPullback(InvertableFunction< X, float > &f, Function< Y, float > &g, Function< Y, float > &h)
Definition Equalizer.hh:1697
std::vector< X > Index(Y x) const
Definition Equalizer.hh:1698
Definition Equalizer.hh:1578
int SizeX() const
Definition Equalizer.hh:1589
TextureWithHole(Bitmap< Color > &orig, PointCollection2d &coll)
Definition Equalizer.hh:1580
int SizeY() const
Definition Equalizer.hh:1590
void Prepare()
Definition Equalizer.hh:1587
void HeavyPrepare()
Definition Equalizer.hh:1585
void Collect(CollectVisitor &vis)
Definition Equalizer.hh:1581
Color Map(int x, int y) const
Definition Equalizer.hh:1591
Definition Equalizer.hh:1893
virtual float Get(Point p, float time) const =0
Definition VolumeObjects.hh:390
std::vector< float > Inverse(float x) const
Definition Equalizer.hh:1682
TimesConstantFunction(float c)
Definition Equalizer.hh:1680
float Index(float x) const
Definition Equalizer.hh:1681
Definition Equalizer.hh:1724
Point Index(float t) const
Definition Equalizer.hh:1727
float Size() const
Definition Equalizer.hh:1726
Union2(PowerSet< A > &m, PowerSet< A > &m2)
Definition Equalizer.hh:519
bool Index(A a) const
Definition Equalizer.hh:520
UnionArray(Array< int, PowerSet< A > * > &arr)
Definition Equalizer.hh:555
bool Index(A a) const
Definition Equalizer.hh:556
UpgradeFloatSpace(FloatSpace &orig, VolumeObject &v, float value)
Definition Equalizer.hh:1939
float Get(Point p) const
Definition Equalizer.hh:1940
float Get(Point p, float time) const
Definition Equalizer.hh:1980
UpgradeTimedFloatSpace(TimedFloatSpace &orig, TimedVolumeObject &v, float value)
Definition Equalizer.hh:1979
Definition VectorTools.hh:125
float Dist() const
Definition VectorTools.cc:141
float dy
Definition VectorTools.hh:268
float dz
Definition VectorTools.hh:268
float dx
Definition VectorTools.hh:268
Definition VolumeObjects.hh:130
Definition Equalizer.hh:1316
float Index(Point2d p) const
Definition Equalizer.hh:1318
Definition Equalizer.hh:1335
float Index(Point p) const
Definition Equalizer.hh:1337
Point2d Index(float x) const
Definition Equalizer.hh:2220
XProdFunction(float y)
Definition Equalizer.hh:2219
Definition Equalizer.hh:1800
virtual int ChildCount() const
Definition Equalizer.hh:1802
virtual Expr * Child(int i) const
Definition Equalizer.hh:1803
virtual int Type() const
Definition Equalizer.hh:1804
Definition Equalizer.hh:1325
float Index(Point2d p) const
Definition Equalizer.hh:1327
Definition Equalizer.hh:1344
float Index(Point p) const
Definition Equalizer.hh:1346
YProdFunction(float x)
Definition Equalizer.hh:2234
Point2d Index(float y) const
Definition Equalizer.hh:2235
Definition Equalizer.hh:1807
virtual int ChildCount() const
Definition Equalizer.hh:1809
virtual Expr * Child(int i) const
Definition Equalizer.hh:1810
virtual int Type() const
Definition Equalizer.hh:1811
Definition Equalizer.hh:1353
float Index(Point p) const
Definition Equalizer.hh:1355
border radius
Definition gameapi_example.php:45
P g(unsigned int c, EveryApi &ev)
Definition test.cpp:19
d
Definition meshpage.php:3895
n< br > font size
Definition meshpage.php:3536
background image
Definition meshpage_bootstrap.php:1723
Object filter(Container c, Function f)
Takes elements from Container c that match function f, return them.
size_t count(const T &t_target, const typename T::key_type &t_key)
Definition bootstrap_stl.hpp:104
std::pair< ssize_t, ssize_t > Range
Definition httplib.h:1164
@ object
object (unordered set of name/value pairs)
Definition json.hpp:1221
double f(const std::string &, double, bool) noexcept
Definition profile_cpp_calls_2.cpp:4
int f2(char c)
Definition test.cpp:51
Definition GameApi.h:30
Definition GameApi.h:93
Definition GameApi.h:43
Definition Equalizer.hh:2248
float x
Definition Equalizer.hh:2249
float y
Definition Equalizer.hh:2249
Definition Equalizer.hh:952
float y
Definition Equalizer.hh:955
FloatPair(float xx, float yy)
Definition Equalizer.hh:954
float x
Definition Equalizer.hh:955
static FloatPair SolveWithFailure(Function< FloatPair, float > &f, FloatPair t_0, FloatPair t_1, bool &error)
Definition Equalizer.hh:968
Definition Equalizer.hh:978
Point p
Definition Equalizer.hh:1005
Point get() const
Definition Equalizer.hh:981
static FloatPoint SolveWithFailure(const Function< FloatPoint, float > &f, FloatPoint t_0, FloatPoint t_1, bool &error)
Definition Equalizer.hh:995
FloatPoint(Point p)
Definition Equalizer.hh:980
Definition Equalizer.hh:928
Float(float v)
Definition Equalizer.hh:929
static Float SolveWithFailure(Function< Float, float > &f, Float t_0, Float t_1, bool &error)
Definition Equalizer.hh:943
float value
Definition Equalizer.hh:930
Definition Equalizer.hh:3162
State forall
Definition Equalizer.hh:3164
State exists
Definition Equalizer.hh:3163
Definition Equalizer.hh:747
int color_component
Definition Equalizer.hh:750
int x
Definition Equalizer.hh:748
int y
Definition Equalizer.hh:749
Definition FreeType2.cc:432
Definition Graph.hh:5780
Point2d p1
Definition Graph.hh:5781
Point2d p2
Definition Graph.hh:5781
Definition Equalizer.hh:2107
ContinuousVoxel< float > * refletivity
Definition Equalizer.hh:2113
VolumeObject * surfacepoints
Definition Equalizer.hh:2110
ContinuousVoxel< Color > * color
Definition Equalizer.hh:2112
VolumeObject * volume
Definition Equalizer.hh:2109
ContinuousVoxel< Vector > * normals
Definition Equalizer.hh:2111
Definition GameApi.h:23
Definition Equalizer.hh:424
int x
Definition Equalizer.hh:426
int y
Definition Equalizer.hh:426
int g
Definition Equalizer.hh:427
int r
Definition Equalizer.hh:427
int b
Definition Equalizer.hh:427
Definition VectorTools.hh:910
float x
Definition VectorTools.hh:911
float y
Definition VectorTools.hh:911
Definition Parser.cc:60
float x
Definition Parser.cc:60
float Dist() const
Definition VectorTools.cc:150
float y
Definition Parser.cc:60
float z
Definition Parser.cc:60
Definition test.cpp:10
int x
Definition test.cpp:10
int y
Definition test.cpp:10
Definition Equalizer.hh:343
static const Singleton & get()
Definition Equalizer.hh:344
Definition Equalizer.hh:2121
SphereVolume * volume
Definition Equalizer.hh:2129
SphereProperties(Point center, float radius, float gap)
Definition Equalizer.hh:2123
Definition Equalizer.hh:419
float radius
Definition Equalizer.hh:421
Color center
Definition Equalizer.hh:420
Definition GameApi.h:42
Definition GameApi.h:17
Definition VectorTools.hh:972
float dy
Definition VectorTools.hh:973
float dx
Definition VectorTools.hh:973
num
Definition view.php:2821