转盘控制算法

问题

一个转盘,上面有N个孔位,在转盘外部有若干个操作组件,每个操作组件都针对其安装位置的孔位进行操作。例如以下是一个有12个孔位的转盘,其11号孔位上方有一个操作组件Op-1,5号孔位上方有一个操作组件Op-2。操作组件不可移动,操作组件在转盘转动时也不可对孔位进行操作。控制转盘转动的常见问题是:(1)如何表示当前转盘的位置?(2)如何计算各操作位下的孔位号?

+--------------------------------------+
|         (Op-1)                       |
|            |                         |
|      +-----|------------------+      |
|      |     11    0     1      |      |
|      |                        |      |
|      | 10                  2  |      |
|      |                        |      |
|      |  9        +         3  |      |
|      |                        |      |
|      |  8                  4  |      |
|      |                        |      |
|      |     7     6     5      |      |
|      +-----------------|------+      |
|                        |             |
|                      (Op-2)          |
+--------------------------------------+

建模

以初始盘位孔位号为基准参考,在定义当前盘位为0号孔位顺时针转离原始位置的孔位数。盘位为0、盘位为3时,分别如下。

+--------------------------------------+    current = 0
|   (Op-1)11       0        1          |
|                  ↑                   |
|      +-----------|------------+      |
|      |     11    0     1      |      |
|  10  |           |            |  2   |
|      | 10        |         2  |      |
|      |           |            |      |
|   9  |  9        +         3  |  3   |
|      |                        |      |
|      |  8                  4  |      |
|   8  |                        |  4   |
|      |     7     6     5      |      |
|      +------------------------+      |
|                                      |
|          7       6       5(Op-2)     |
+--------------------------------------+
                             
+--------------------------------------+    current = 3
|   (Op-1)11       0       1           |
|                                      |
|      +------------------------+      |
|      |      8    9    10      |      |
|  10  |                        |  2   |
|      |  7                 11  |      |
|      |                        |      |
|   9  |  6        +---------0---→ 3   |
|      |                        |      |
|      |  5                  1  |      |
|   8  |                        |  4   |
|      |     4     3     2      |      |
|      +------------------------+      |
|                                      |
|          7       6        5(Op-2)    |
+--------------------------------------+

于是,计算操作组件下方孔位编号的方法就是:

#define HOLE_NUMBER 12
#define HOLE(pos) (((pos) + HOLE_NUMBER - current) % HOLE_NUMBER)

当pos = 11(即Op-1),current = 3时,HOLE(11) = (11+12-3)%12 = 8。

当pos = 5(即Op-2),current = 3时,HOLE(5) = (5+12-3)%12 = 2。

你可能感兴趣的:(c++,算法)