Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / mapping / python / map.py @ 918

History | View | Annotate | Download (5.37 KB)

1
#!/usr/bin/env python
2

    
3
from scipy import linalg, array
4
from gtk import *
5
from socket import *
6
from struct import *
7
import gobject
8
import sys, pickle, pygtk, gtk, string, cairo, gobject, math, weakref
9
from random import random
10

    
11
#mine
12
from model import model
13

    
14
pi = 3.1415927
15

    
16
#endmine
17

    
18
class map_model(model):
19
    def __init__(self):
20
        self.eqn = []
21

    
22
    def __setattr__(self,name,value):
23
        self.__dict__[name] = value
24
        self.changed()
25

    
26
    def add_eqn(self, eqn):
27
        self.eqn = [eqn] + self.eqn
28

    
29
hostname = 'localhost'
30

    
31
class Screen(gtk.DrawingArea):
32
    __gsignals__ = { "expose-event" : "override" }
33
    
34
    def __init__ (self, socket):
35
        gtk.DrawingArea.__init__(self)
36

    
37
        self.xres, self.yres = (800,800)
38

    
39
        self.set_size_request(self.xres, self.yres)
40

    
41

    
42
        self.socket = socket
43
        self.bots = []
44

    
45
        self.draw = map_model()
46
        self.draw.bot = [1,1,pi/2] # x y theta
47
        self.draw.add_dependent(self.redraw)
48

    
49
        self.scale_const = 50
50
        self.xdisp = 400
51
        self.ydisp = 400
52
        self.nticks = 21
53
        self.units = 10
54

    
55
    def redraw(self, eqn):
56
        self.clear_area()
57
        self.draw_bot()
58
        self.draw_grid()
59
        
60
    def do_expose_event(self, event):
61
        self.redraw(None)
62

    
63
    def clear_area(self):
64
        self.ctx = self.window.cairo_create()
65
        self.ctx.rectangle(0,0,1000,1000)
66
        self.ctx.set_source_rgb(1,1,1)
67
        self.ctx.fill()
68
        
69

    
70
    def draw_bot(self):
71
        self.ctx = self.window.cairo_create()
72
        self.ctx.new_path()
73
        
74
        x, y, theta = self.draw.bot
75
        y = -y #because we don't want to draw down more units
76
        
77
        #draw blob
78
        self.ctx.set_source_rgb(0,1,0)
79
        xscl = (self.xres - self.xdisp) / self.units
80
        yscl = (self.yres - self.ydisp) / self.units
81

    
82
        cx = x * xscl + self.xdisp
83
        cy = y * yscl + self.ydisp
84
        self.ctx.arc(cx, cy, 20, 0, 2*pi)
85
        self.ctx.fill()
86

    
87
        #draw "arrow"
88
        self.ctx.set_source_rgb(0,0,1)
89
        self.ctx.arc(cx,cy, 5, 0, 2*pi)
90
        self.ctx.fill()
91
        
92
        self.ctx.move_to(cx,cy)
93
        dx = 20 * math.cos(theta + 0.05)
94
        dy = -20 * math.sin(theta + 0.05)
95
        dx = int(dx)
96
        dy = int(dy)
97
        
98
        self.ctx.rel_line_to(dx, dy)
99
        self.ctx.stroke()
100

    
101
    def draw_grid(self):
102

    
103
        self.ctx.set_source_rgb(0,0,0)
104
        self.ctx.new_path()
105
        
106
        #vertical
107
        self.ctx.move_to(400,0)
108
        self.ctx.rel_line_to(0,800)
109
        self.ctx.stroke()
110

    
111
        #vticks
112
        self.ctx.move_to(400,0)
113
        for i in range( self.nticks + 1 ):
114
            self.ctx.rel_line_to(5,0)
115
            self.ctx.stroke()
116
            self.ctx.move_to(400, i * 800 / self.nticks)
117
        
118
        #horiz
119
        self.ctx.move_to(0,400)
120
        self.ctx.rel_line_to(800,0)
121
        self.ctx.stroke()
122

    
123
        #hticks
124
        self.ctx.move_to(0,400)
125
        for i in range(self.nticks + 1):
126
            self.ctx.rel_line_to(0,-5)
127
            self.ctx.stroke()
128
            self.ctx.move_to(i * 800 / self.nticks, 400)
129

    
130
    def draw_graph(self, equations, n):
131
        self.ctx = self.window.cairo_create()
132
        self.ctx.set_source_rgb(0,0,0)
133
        self.ctx.new_path()
134
        
135
        for equn in equations:
136
            xmin, xmax = equn[-2],equn[-1]
137
            eqn = equn[:-2]
138
            dx = float(xmax - xmin) / n
139
            x = xmin
140
            y = 0
141
            for i in range(len(eqn)):
142
                y += eqn[-1 * i - 1] * ( x ** i)
143

    
144
            self.ctx.move_to(self.x_disp + x * self.scale_const,400 - y * self.scale_const)
145
            
146
            for diffel in range(1,n+1):
147
                x = xmin + diffel * dx
148
                y = 0
149
                for i in range(len(eqn)):
150
                    y += eqn[-1 * i - 1] * ( x ** i)
151
                self.ctx.line_to(self.x_disp + int(x * self.scale_const),400 - int(y * self.scale_const))
152
                self.ctx.stroke()
153
                self.ctx.move_to(self.x_disp + int(x * self.scale_const),400 - int(y * self.scale_const))
154

    
155
    def receive_info(self):
156
        
157
        buf = self.socket.recv(100)
158
        if (buf):
159
            items = unpack('4c2hf5h')
160
            print items
161
        
162
#         info = self.draw.bot
163
#         dx = random() * 2 - 1
164
#         dy = random() * 2 - 1
165
        
166
#         self.draw.bot = [info[0] + dx, info[1] + dx, info[2]]
167
        
168
        return True
169

    
170

    
171
def solve(lisvals):
172
    p0y, p1y, m0y, m1y, x0, x1 = lisvals
173
    A = array([[x0**3 , x0**2 , x0 , 1],
174
               [x1**3 , x1**2 , x1 , 1],
175
               [3 * x0**2 , 2 * x0 , 1 , 0],
176
               [3 * x1**2 , 2 * x1 , 1 , 0]])
177
    
178
    B = array([p0y, p1y, m0y, m1y])
179
    tarr = linalg.solve(A,B)
180
    lis = []
181
    for i in range(4):
182
        lis.append(tarr[i])
183
    return lis + [0,1]
184

    
185
def main():
186
    
187
    window = gtk.Window()
188
    window.connect("delete-event", gtk.main_quit)
189

    
190
    sock = socket()
191
    sock.connect((hostname, int(sys.argv[1])))
192

    
193
#    mywidg = Screen(sock)
194
    
195
    mywidg = Screen(sock)
196

    
197
    bigbox = gtk.HBox()
198
    bigbox.pack_end(mywidg, True, True, 0)
199
    
200
    window.add(bigbox)
201
    bigbox.show()
202
    mywidg.show()
203
    window.show()
204

    
205
    gobject.idle_add(mywidg.receive_info)
206
 #   gobject.timeout_add(250, mywidg.receive_info)
207
    gtk.main()
208

    
209
if __name__=='__main__':
210
    if (len(sys.argv) < 2): #or not str.isdecimal(sys.argv[1])):
211
        print("Usage: %s <portno>" % sys.argv[0])
212
        sys.exit()
213

    
214
    main()