chiark / gitweb /
pointmap command for use by moebius2
[moebius.git] / library.cc
1 /*
2  * Points library
3  */
4
5 #include <stdlib.h>
6 #include <stdio.h>
7
8 #include "library.hh"
9 #include "transforms.hh"
10
11 double Point::planedistance= 1.0;
12 double Point::eyedistance= 1.0;
13 double Point::cutoffdistance= 10.0;
14 double Point::eyex= 0.0;
15
16 TransformList Point::usertransforms;
17 TransformList Point::povtransform;
18
19 Point TransformList::operator()(Point it) {
20   for (int i=0; i<used; i++) { it= (*a[i])(it); }
21   return it;
22 }
23
24 void TransformList::append(Transform *it) {
25   if (used >= size) {
26     size+=5; size<<=1;
27     a= (Transform**)realloc(a,sizeof(Transform*)*size);
28     if (!a) { perror("realloc"); exit(1); }
29   }
30   a[used++]= it;
31 }
32
33 void TransformList::clearcontents() {
34   for (int i=0; i<used; i++) delete a[i];
35 }
36   
37 Point::operator Onscreen() const {
38   Point it= transformed();
39   double factor= eyedistance / (eyedistance + planedistance - it[2]);
40   return Onscreen(it[0] * factor + eyex * (1.0-factor), it[1] * factor);
41 }
42
43 void Point::setobserver(double theta, double eta, double planedist, double eyedist,
44                         double cutoffdist) {
45   planedistance= planedist;
46   eyedistance= eyedist;
47   cutoffdistance= cutoffdist;
48   povtransform.reset();
49   if (theta != 0.0) povtransform.append(new XZRotationTransform(theta));
50   if (eta != 0.0) povtransform.append(new YZRotationTransform(eta));
51 }