2012-04-07 20 views
5

Sto provando a programmare un robot da spostare. Il robot si muove in base a dove si trova attualmente. Ci sono quattro posti dove può essere:Robot Motion in Python

LOCATION1 Motion Plan is like so, 
5 6 
3 4 
1 2 
Initial positon is (x1,y1) 
This gets coded as (x1,y1)->(x1+dx,y1)->(x1,y1+dy)->(x1+dx,y1+dy) ... and so on 

LOCATION2 Motion Plan is like so, 
5 3 1 
6 4 2 
The initial position is (x1,y1) 
This gets coded as (x1,y1)->(x1,y1-dy)->(x1-dx,y1)->(x1-dx,y1-dy) ... and so on 

LOCATION3 Motion Plan is like so, 
6 5 
4 3 
2 1 
Initial positon is (x1,y1) 
This gets coded as (x1,y1)->(x1-dx,y1)->(x1,y1+dy)->(x1-dx,y1+dy) ... and so on 

LOCATION4 Motion Plan is like so, 
6 4 2 
5 3 1 
The initial position is (x1,y1) 
This gets coded as (x1,y1)->(x1,y1+dy)->(x1-dx,y1)->(x1-dx,y1+dy) ... and so on 

Ho difficoltà a trovare un buon modo divinatorio per codificare questo. Sto pensando sulle linee di definire 4 differenti regole prossima mossa e poi avere un po 'di istruzioni if ​​che scelgono le regole corrette

ha qualcuno fatto qualcosa di simile ... C'è un modo migliore

+0

Usa modello di progettazione macchina stato – pylover

risposta

2

So che questo potrebbe essere reso più elegante (e i nomi dei miei metodi sono orribili!), Ma forse qualcosa del genere?

>>> import itertools 
>>> def alternator(*values): 
...  return itertools.cycle(values) 
... 
>>> def increasor(value_1, dvalue_1, steps=2): 
...  counter = itertools.count(value_1, dvalue_1) 
...  while True: 
...    repeater = itertools.repeat(counter.next(), steps) 
...    for item in repeater: 
...     yield item 
... 
>>> def motion_plan(x_plan, y_plan, steps=6): 
...  while steps > 0: 
...   yield (x_plan.next(), y_plan.next()) 
...   steps -= 1 
... 
>>> for pos in motion_plan(alternator('x1', 'x1+dx'), increaser('y1', '+dy'): #Location 1 motion plan 
...  print pos 
... 
('x1', 'y1') 
('x1+dx', 'y1') 
('x1', 'y1+dy') 
('x1+dx', 'y1+dy') 
('x1', 'y1+dy+dy') 
('x1+dx', 'y1+dy+dy') 

ero incerto quanta flessibilità avevi bisogno di questo, si potrebbe ridurre la complessità ancora di più se si desidera rimuovere una certa flessibilità. Inoltre quasi sicuramente non useresti stringhe per questo, ho solo pensato che fosse il modo più semplice per dimostrare l'idea. Se si utilizzano i numeri, allora qualcosa di simile:

>>> count = 0 
>>> for pos in motion_plan(increaser(0, -1), alternator(0, 1)): #location 4 motion plan 
...  print "%d %r" % (count, pos) 
...  count += 1 
1 (0, 0) 
2 (0, 1) 
3 (-1, 0) 
4 (-1, 1) 
5 (-2, 0) 
6 (-2, 1) 

dovrebbero corrispondere abbastanza chiaramente a questo:

LOCATION4 Motion Plan is like so, 
6 4 2 
5 3 1 

Credo che i piani di movimento sarebbe come segue:

Location1 = motion_plan(alternator(0, 1), increasor(0, 1)) 
Location2 = motion_plan(increasor(0, -1), alternator(0, -1)) 
Location3 = motion_plan(alternator(0, -1), increasor(0, 1)) 
Location4 = motion_plan(increasor(0, -1), alternator(0, 1)) 
0

si potrebbe fare quello, quello che vorresti fare è.

def motion_loc1(x1,y1,dx,dy): 
    # your operation 


def motion_loc2(x1,y1,dx,dy): 
    # your operation 

E quindi nel programma principale, in base a x1, y1 chiamare i vari metodi di movimento.