summaryrefslogtreecommitdiffstats
path: root/src/toys/plane3d.py
blob: 0ffcb510fbb87f667f503484dc915852a9c9ff8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/python

import py2geom
import toyframework
import random,gtk
import numpy
from py2geom_glue import *

class Box3d(toyframework.Toy):
    def __init__(self):
        toyframework.Toy.__init__(self)
        self.tmat = numpy.zeros([3,4])
        # plane origin
        self.origin_handle = toyframework.PointHandle(180,65)
        self.handles.append(self.origin_handle)
        self.vanishing_points_handles = toyframework.PointSetHandle()
        path_a_name="ptitle.svgd"
        import sys
        if len(sys.argv) > 1:
            path_a_name = sys.argv[1]
        self.paths_a = py2geom.read_svgd(path_a_name)
    

        # Finite images of the three vanishing points and the origin
        self.handles.append(self.vanishing_points_handles)
        self.vanishing_points_handles.append(550,350)
        self.vanishing_points_handles.append(150,300)
        self.vanishing_points_handles.append(380,40)
        self.vanishing_points_handles.append(340,450)
    def draw(self, cr, pos, save):
        orig = self.origin_handle.pos;
	cr.set_source_rgba (0., 0.125, 0, 1)

        # create the transformation matrix for the map  P^3 --> P^2 that has the following effect:
        #      (1 : 0 : 0 : 0) --> vanishing point in x direction (= handle #0)
        #      (0 : 1 : 0 : 0) --> vanishing point in y direction (= handle #1)
        #      (0 : 0 : 1 : 0) --> vanishing point in z direction (= handle #2)
        #      (0 : 0 : 0 : 1) --> origin (= handle #3)
        
        tmat = numpy.zeros([3,4])
        for j in range(4):
            tmat[0][j] = self.vanishing_points_handles.pts[j][0]
            tmat[1][j] = self.vanishing_points_handles.pts[j][1]
            tmat[2][j] = 1

        self.notify = "Projection matrix:\n"
        for i in range(3):
            for j in range(4):
                self.notify += str(tmat[i][j]) + " "
            self.notify += '\n'

        for p in self.paths_a:
            B = py2geom.make_cuts_independant(p.toPwSb())
            preimage = [None]*4
                
            preimage[0] =  (B[0] - orig[0]) / 100;
            preimage[1] = -(B[1] - orig[1]) / 100;
            Piecewise<SBasis> res[3];
            for j in range(3):
                res[j] = (preimage[0] * tmat[j][0] +
                          preimage[1] * tmat[j][1] +
                          + tmat[j][3])
            
            result = D2PiecewiseSBasis(divide(res[0],res[2], 2), 
                                       divide(res[1],res[2], 2))
            
            toyframework.cairo_d2_pw(cr, result)
            cr.set_source_rgba (0., 0.125, 0, 1)
            cr.stroke()
        
        toyframework.Toy.draw(self, cr, pos, save)
    
t = Box3d()
import sys

toyframework.init(sys.argv, t, 500, 500)