Saturday, December 31, 2011

Conversion Between Rotation and Direction in Games

In games, we might encounter the problem of Conversion Between Rotation and Direction. For example, if we want to fire a projectile direct (1, 2), and want to change the direction of the projectle. Thus somehow we have to calculate the rotation of the sprite with the formula:

rotation = 90 - atan(d.y / d.x) * 180 / pi;

While it's time-consuming to calculating it each time. So I wrote a function per-recorded  CGPoint directions relating to 180 degrees. (180 is enough in real time animation). 

- (CGPoint)rotationToDirect:(int)rotation
{
    switch (rotation) {
        case 0:return ccp(0.000000, 1.000000);          case 1:return ccp(0.017452, 0.999848);      
        case 2:return ccp(0.034899, 0.999391);          case 3:return ccp(0.052336, 0.998630);      
        case 4:return ccp(0.069756, 0.997564);          case 5:return ccp(0.087156, 0.996195);      
        case 6:return ccp(0.104528, 0.994522);          case 7:return ccp(0.121869, 0.992546);      
        case 8:return ccp(0.139173, 0.990268);          case 9:return ccp(0.156434, 0.987688);      
        case 10:return ccp(0.173648, 0.984808);         case 11:return ccp(0.190809, 0.981627);      
        case 12:return ccp(0.207912, 0.978148);         case 13:return ccp(0.224951, 0.974370);      
        case 14:return ccp(0.241922, 0.970296);         case 15:return ccp(0.258819, 0.965926);      
        case 16:return ccp(0.275637, 0.961262);         case 17:return ccp(0.292372, 0.956305);      
        case 18:return ccp(0.309017, 0.951057);         case 19:return ccp(0.325568, 0.945519);      
        case 20:return ccp(0.342020, 0.939693);         case 21:return ccp(0.358368, 0.933580);      
        case 22:return ccp(0.374607, 0.927184);         case 23:return ccp(0.390731, 0.920505);      
        case 24:return ccp(0.406737, 0.913545);         case 25:return ccp(0.422618, 0.906308);      
        case 26:return ccp(0.438371, 0.898794);         case 27:return ccp(0.453991, 0.891007);      
        case 28:return ccp(0.469472, 0.882948);         case 29:return ccp(0.484810, 0.874620);      
        case 30:return ccp(0.500000, 0.866025);         case 31:return ccp(0.515038, 0.857167);      
        case 32:return ccp(0.529919, 0.848048);         case 33:return ccp(0.544639, 0.838671);      
        case 34:return ccp(0.559193, 0.829038);         case 35:return ccp(0.573576, 0.819152);      
        case 36:return ccp(0.587785, 0.809017);         case 37:return ccp(0.601815, 0.798636);      
        case 38:return ccp(0.615662, 0.788011);         case 39:return ccp(0.629320, 0.777146);      
        case 40:return ccp(0.642788, 0.766044);         case 41:return ccp(0.656059, 0.754710);      
        case 42:return ccp(0.669131, 0.743145);         case 43:return ccp(0.681998, 0.731354);      
        case 44:return ccp(0.694658, 0.719340);         case 45:return ccp(0.707107, 0.707107);      
        case 46:return ccp(0.719340, 0.694658);         case 47:return ccp(0.731354, 0.681998);      
        case 48:return ccp(0.743145, 0.669131);         case 49:return ccp(0.754710, 0.656059);      
        case 50:return ccp(0.766044, 0.642788);         case 51:return ccp(0.777146, 0.629320);      
        case 52:return ccp(0.788011, 0.615662);         case 53:return ccp(0.798635, 0.601815);      
        case 54:return ccp(0.809017, 0.587785);         case 55:return ccp(0.819152, 0.573576);      
        case 56:return ccp(0.829038, 0.559193);         case 57:return ccp(0.838671, 0.544639);      
        case 58:return ccp(0.848048, 0.529919);         case 59:return ccp(0.857167, 0.515038);      
        case 60:return ccp(0.866025, 0.500000);         case 61:return ccp(0.874620, 0.484810);      
        case 62:return ccp(0.882948, 0.469472);         case 63:return ccp(0.891007, 0.453991);      
        case 64:return ccp(0.898794, 0.438371);         case 65:return ccp(0.906308, 0.422618);      
        case 66:return ccp(0.913545, 0.406737);         case 67:return ccp(0.920505, 0.390731);      
        case 68:return ccp(0.927184, 0.374607);         case 69:return ccp(0.933580, 0.358368);      
        case 70:return ccp(0.939693, 0.342020);         case 71:return ccp(0.945519, 0.325568);      
        case 72:return ccp(0.951056, 0.309017);         case 73:return ccp(0.956305, 0.292372);      
        case 74:return ccp(0.961262, 0.275637);         case 75:return ccp(0.965926, 0.258819);      
        case 76:return ccp(0.970296, 0.241922);         case 77:return ccp(0.974370, 0.224951);      
        case 78:return ccp(0.978148, 0.207912);         case 79:return ccp(0.981627, 0.190809);      
        case 80:return ccp(0.984808, 0.173648);         case 81:return ccp(0.987688, 0.156434);      
        case 82:return ccp(0.990268, 0.139173);         case 83:return ccp(0.992546, 0.121869);      
        case 84:return ccp(0.994522, 0.104528);         case 85:return ccp(0.996195, 0.087156);      
        case 86:return ccp(0.997564, 0.069756);         case 87:return ccp(0.998630, 0.052336);      
        case 88:return ccp(0.999391, 0.034899);         case 89:return ccp(0.999848, 0.017452);      
        case 90:return ccp(1.000000, 0.000000);         case 91:return ccp(0.999848, -0.017452);      
        case 92:return ccp(0.999391, -0.034899);        case 93:return ccp(0.998630, -0.052336);      
        case 94:return ccp(0.997564, -0.069756);        case 95:return ccp(0.996195, -0.087156);      
        case 96:return ccp(0.994522, -0.104528);        case 97:return ccp(0.992546, -0.121869);      
        case 98:return ccp(0.990268, -0.139173);        case 99:return ccp(0.987688, -0.156434);      
        case 100:return ccp(0.984808, -0.173648);       case 101:return ccp(0.981627, -0.190809);      
        case 102:return ccp(0.978148, -0.207912);       case 103:return ccp(0.974370, -0.224951);      
        case 104:return ccp(0.970296, -0.241922);       case 105:return ccp(0.965926, -0.258819);      
        case 106:return ccp(0.961262, -0.275637);       case 107:return ccp(0.956305, -0.292372);      
        case 108:return ccp(0.951056, -0.309017);       case 109:return ccp(0.945519, -0.325568);      
        case 110:return ccp(0.939693, -0.342020);       case 111:return ccp(0.933580, -0.358368);      
        case 112:return ccp(0.927184, -0.374607);       case 113:return ccp(0.920505, -0.390731);      
        case 114:return ccp(0.913545, -0.406737);       case 115:return ccp(0.906308, -0.422618);      
        case 116:return ccp(0.898794, -0.438371);       case 117:return ccp(0.891007, -0.453991);      
        case 118:return ccp(0.882948, -0.469472);       case 119:return ccp(0.874620, -0.484810);      
        case 120:return ccp(0.866025, -0.500000);       case 121:return ccp(0.857167, -0.515038);      
        case 122:return ccp(0.848048, -0.529919);       case 123:return ccp(0.838671, -0.544639);      
        case 124:return ccp(0.829038, -0.559193);       case 125:return ccp(0.819152, -0.573576);      
        case 126:return ccp(0.809017, -0.587785);       case 127:return ccp(0.798635, -0.601815);      
        case 128:return ccp(0.788011, -0.615662);       case 129:return ccp(0.777146, -0.629320);      
        case 130:return ccp(0.766044, -0.642788);       case 131:return ccp(0.754710, -0.656059);      
        case 132:return ccp(0.743145, -0.669131);       case 133:return ccp(0.731354, -0.681998);      
        case 134:return ccp(0.719340, -0.694658);       case 135:return ccp(0.707107, -0.707107);      
        case 136:return ccp(0.694658, -0.719340);       case 137:return ccp(0.681998, -0.731354);      
        case 138:return ccp(0.669131, -0.743145);       case 139:return ccp(0.656059, -0.754710);      
        case 140:return ccp(0.642788, -0.766044);       case 141:return ccp(0.629320, -0.777146);      
        case 142:return ccp(0.615662, -0.788011);       case 143:return ccp(0.601815, -0.798636);      
        case 144:return ccp(0.587785, -0.809017);       case 145:return ccp(0.573576, -0.819152);      
        case 146:return ccp(0.559193, -0.829038);       case 147:return ccp(0.544639, -0.838671);      
        case 148:return ccp(0.529919, -0.848048);       case 149:return ccp(0.515038, -0.857167);      
        case 150:return ccp(0.500000, -0.866025);       case 151:return ccp(0.484810, -0.874620);      
        case 152:return ccp(0.469472, -0.882948);       case 153:return ccp(0.453991, -0.891007);      
        case 154:return ccp(0.438371, -0.898794);       case 155:return ccp(0.422618, -0.906308);      
        case 156:return ccp(0.406737, -0.913545);       case 157:return ccp(0.390731, -0.920505);      
        case 158:return ccp(0.374607, -0.927184);       case 159:return ccp(0.358368, -0.933580);      
        case 160:return ccp(0.342020, -0.939693);       case 161:return ccp(0.325568, -0.945519);      
        case 162:return ccp(0.309017, -0.951057);       case 163:return ccp(0.292372, -0.956305);      
        case 164:return ccp(0.275637, -0.961262);       case 165:return ccp(0.258819, -0.965926);      
        case 166:return ccp(0.241922, -0.970296);       case 167:return ccp(0.224951, -0.974370);      
        case 168:return ccp(0.207912, -0.978148);       case 169:return ccp(0.190809, -0.981627);      
        case 170:return ccp(0.173648, -0.984808);       case 171:return ccp(0.156434, -0.987688);      
        case 172:return ccp(0.139173, -0.990268);       case 173:return ccp(0.121869, -0.992546);      
        case 174:return ccp(0.104528, -0.994522);       case 175:return ccp(0.087156, -0.996195);      
        case 176:return ccp(0.069756, -0.997564);       case 177:return ccp(0.052336, -0.998630);      
        case 178:return ccp(0.034899, -0.999391);       case 179:return ccp(0.017452, -0.999848);      
        case 180:return ccp(0.000000, -1.000000);       case 181:return ccp(-0.017452, -0.999848);      
        case 182:return ccp(-0.034899, -0.999391);       case 183:return ccp(-0.052336, -0.998630);      
        case 184:return ccp(-0.069756, -0.997564);       case 185:return ccp(-0.087156, -0.996195);      
        case 186:return ccp(-0.104528, -0.994522);       case 187:return ccp(-0.121869, -0.992546);      
        case 188:return ccp(-0.139173, -0.990268);       case 189:return ccp(-0.156434, -0.987688);      
        case 190:return ccp(-0.173648, -0.984808);       case 191:return ccp(-0.190809, -0.981627);      
        case 192:return ccp(-0.207912, -0.978148);       case 193:return ccp(-0.224951, -0.974370);      
        case 194:return ccp(-0.241922, -0.970296);       case 195:return ccp(-0.258819, -0.965926);      
        case 196:return ccp(-0.275637, -0.961262);       case 197:return ccp(-0.292372, -0.956305);      
        case 198:return ccp(-0.309017, -0.951057);       case 199:return ccp(-0.325568, -0.945519);      
        case 200:return ccp(-0.342020, -0.939693);       case 201:return ccp(-0.358368, -0.933580);      
        case 202:return ccp(-0.374607, -0.927184);       case 203:return ccp(-0.390731, -0.920505);      
        case 204:return ccp(-0.406737, -0.913545);       case 205:return ccp(-0.422618, -0.906308);      
        case 206:return ccp(-0.438371, -0.898794);       case 207:return ccp(-0.453991, -0.891007);      
        case 208:return ccp(-0.469472, -0.882948);       case 209:return ccp(-0.484810, -0.874620);      
        case 210:return ccp(-0.500000, -0.866025);       case 211:return ccp(-0.515038, -0.857167);      
        case 212:return ccp(-0.529919, -0.848048);       case 213:return ccp(-0.544639, -0.838671);      
        case 214:return ccp(-0.559193, -0.829038);       case 215:return ccp(-0.573576, -0.819152);      
        case 216:return ccp(-0.587785, -0.809017);       case 217:return ccp(-0.601815, -0.798636);      
        case 218:return ccp(-0.615662, -0.788011);       case 219:return ccp(-0.629320, -0.777146);      
        case 220:return ccp(-0.642788, -0.766044);       case 221:return ccp(-0.656059, -0.754710);      
        case 222:return ccp(-0.669131, -0.743145);       case 223:return ccp(-0.681998, -0.731354);      
        case 224:return ccp(-0.694658, -0.719340);       case 225:return ccp(-0.707107, -0.707107);      
        case 226:return ccp(-0.719340, -0.694658);       case 227:return ccp(-0.731354, -0.681998);      
        case 228:return ccp(-0.743145, -0.669131);       case 229:return ccp(-0.754710, -0.656059);      
        case 230:return ccp(-0.766044, -0.642788);       case 231:return ccp(-0.777146, -0.629320);      
        case 232:return ccp(-0.788011, -0.615662);       case 233:return ccp(-0.798635, -0.601815);      
        case 234:return ccp(-0.809017, -0.587785);       case 235:return ccp(-0.819152, -0.573576);      
        case 236:return ccp(-0.829038, -0.559193);       case 237:return ccp(-0.838671, -0.544639);      
        case 238:return ccp(-0.848048, -0.529919);       case 239:return ccp(-0.857167, -0.515038);      
        case 240:return ccp(-0.866025, -0.500000);       case 241:return ccp(-0.874620, -0.484810);      
        case 242:return ccp(-0.882948, -0.469472);       case 243:return ccp(-0.891007, -0.453991);      
        case 244:return ccp(-0.898794, -0.438371);       case 245:return ccp(-0.906308, -0.422618);      
        case 246:return ccp(-0.913545, -0.406737);       case 247:return ccp(-0.920505, -0.390731);      
        case 248:return ccp(-0.927184, -0.374607);       case 249:return ccp(-0.933580, -0.358368);      
        case 250:return ccp(-0.939693, -0.342020);       case 251:return ccp(-0.945519, -0.325568);      
        case 252:return ccp(-0.951056, -0.309017);       case 253:return ccp(-0.956305, -0.292372);      
        case 254:return ccp(-0.961262, -0.275637);       case 255:return ccp(-0.965926, -0.258819);      
        case 256:return ccp(-0.970296, -0.241922);       case 257:return ccp(-0.974370, -0.224951);      
        case 258:return ccp(-0.978148, -0.207912);       case 259:return ccp(-0.981627, -0.190809);      
        case 260:return ccp(-0.984808, -0.173648);       case 261:return ccp(-0.987688, -0.156434);      
        case 262:return ccp(-0.990268, -0.139173);       case 263:return ccp(-0.992546, -0.121869);      
        case 264:return ccp(-0.994522, -0.104528);       case 265:return ccp(-0.996195, -0.087156);      
        case 266:return ccp(-0.997564, -0.069756);       case 267:return ccp(-0.998630, -0.052336);      
        case 268:return ccp(-0.999391, -0.034899);       case 269:return ccp(-0.999848, -0.017452);      
        case 270:return ccp(-1.000000, 0.000000);       case 271:return ccp(-0.999848, 0.017452);      
        case 272:return ccp(-0.999391, 0.034899);       case 273:return ccp(-0.998630, 0.052336);      
        case 274:return ccp(-0.997564, 0.069756);       case 275:return ccp(-0.996195, 0.087156);      
        case 276:return ccp(-0.994522, 0.104528);       case 277:return ccp(-0.992546, 0.121869);      
        case 278:return ccp(-0.990268, 0.139173);       case 279:return ccp(-0.987688, 0.156434);      
        case 280:return ccp(-0.984808, 0.173648);       case 281:return ccp(-0.981627, 0.190809);      
        case 282:return ccp(-0.978148, 0.207912);       case 283:return ccp(-0.974370, 0.224951);      
        case 284:return ccp(-0.970296, 0.241922);       case 285:return ccp(-0.965926, 0.258819);      
        case 286:return ccp(-0.961262, 0.275637);       case 287:return ccp(-0.956305, 0.292372);      
        case 288:return ccp(-0.951056, 0.309017);       case 289:return ccp(-0.945519, 0.325568);      
        case 290:return ccp(-0.939693, 0.342020);       case 291:return ccp(-0.933580, 0.358368);      
        case 292:return ccp(-0.927184, 0.374607);       case 293:return ccp(-0.920505, 0.390731);      
        case 294:return ccp(-0.913545, 0.406737);       case 295:return ccp(-0.906308, 0.422618);      
        case 296:return ccp(-0.898794, 0.438371);       case 297:return ccp(-0.891007, 0.453991);      
        case 298:return ccp(-0.882948, 0.469472);       case 299:return ccp(-0.874620, 0.484810);      
        case 300:return ccp(-0.866025, 0.500000);       case 301:return ccp(-0.857167, 0.515038);      
        case 302:return ccp(-0.848048, 0.529919);       case 303:return ccp(-0.838671, 0.544639);      
        case 304:return ccp(-0.829038, 0.559193);       case 305:return ccp(-0.819152, 0.573576);      
        case 306:return ccp(-0.809017, 0.587785);       case 307:return ccp(-0.798635, 0.601815);      
        case 308:return ccp(-0.788011, 0.615662);       case 309:return ccp(-0.777146, 0.629320);      
        case 310:return ccp(-0.766044, 0.642788);       case 311:return ccp(-0.754710, 0.656059);      
        case 312:return ccp(-0.743145, 0.669131);       case 313:return ccp(-0.731354, 0.681998);      
        case 314:return ccp(-0.719340, 0.694658);       case 315:return ccp(-0.707107, 0.707107);      
        case 316:return ccp(-0.694658, 0.719340);       case 317:return ccp(-0.681998, 0.731354);      
        case 318:return ccp(-0.669131, 0.743145);       case 319:return ccp(-0.656059, 0.754710);      
        case 320:return ccp(-0.642788, 0.766044);       case 321:return ccp(-0.629320, 0.777146);      
        case 322:return ccp(-0.615662, 0.788011);       case 323:return ccp(-0.601815, 0.798636);      
        case 324:return ccp(-0.587785, 0.809017);       case 325:return ccp(-0.573576, 0.819152);      
        case 326:return ccp(-0.559193, 0.829038);       case 327:return ccp(-0.544639, 0.838671);      
        case 328:return ccp(-0.529919, 0.848048);       case 329:return ccp(-0.515038, 0.857167);      
        case 330:return ccp(-0.500000, 0.866025);       case 331:return ccp(-0.484810, 0.874620);      
        case 332:return ccp(-0.469472, 0.882948);       case 333:return ccp(-0.453991, 0.891007);      
        case 334:return ccp(-0.438371, 0.898794);       case 335:return ccp(-0.422618, 0.906308);      
        case 336:return ccp(-0.406737, 0.913545);       case 337:return ccp(-0.390731, 0.920505);      
        case 338:return ccp(-0.374607, 0.927184);       case 339:return ccp(-0.358368, 0.933580);      
        case 340:return ccp(-0.342020, 0.939693);       case 341:return ccp(-0.325568, 0.945519);      
        case 342:return ccp(-0.309017, 0.951057);       case 343:return ccp(-0.292372, 0.956305);      
        case 344:return ccp(-0.275637, 0.961262);       case 345:return ccp(-0.258819, 0.965926);      
        case 346:return ccp(-0.241922, 0.970296);       case 347:return ccp(-0.224951, 0.974370);      
        case 348:return ccp(-0.207912, 0.978148);       case 349:return ccp(-0.190809, 0.981627);      
        case 350:return ccp(-0.173648, 0.984808);       case 351:return ccp(-0.156434, 0.987688);      
        case 352:return ccp(-0.139173, 0.990268);       case 353:return ccp(-0.121869, 0.992546);      
        case 354:return ccp(-0.104528, 0.994522);       case 355:return ccp(-0.087156, 0.996195);      
        case 356:return ccp(-0.069756, 0.997564);       case 357:return ccp(-0.052336, 0.998630);      
        case 358:return ccp(-0.034899, 0.999391);       case 359:return ccp(-0.017452, 0.999848);  
        default:return ccp(0, 0);
    }
}