【iOSプログラミング】惑星公転軌道をデフォルト機能だけでシミュレーションしてみた
前回までに
・iOS Developer登録(申請篇、アクティベート篇、完結篇)
ということでやってきました。
前回初めて勉強したレイヤーの復習ということで
今回は蛇足というか完全に遊びですw
iPhoneアプリを勉強して10日目のニートが調子にのって戯言を言っているなー程度に
少しだけお付き合い下さい。
前回、レイヤーは任意の軌道を移動することができると言いましたが、
それを利用して太陽系の惑星を公転軌道をシミュレーションしてみました。
その様子です。
中心の黒いのが銀河の中心で
中心がオレンジで赤いのが太陽
その周りを金星(茶色)、地球(青)、火星(赤)、木製(水色)が公転しています。
更に地球の周りには黄色い月が公転しています。
ちなみに公転周期と公転半径(そもそも真円じゃない笑)は現実のものとは全く異なる仮想的なものです。
こんな感じで書いたら天文学の先生とかに怒られそうですが
アニメーションの勉強ということでお許し頂ければと思います。
以下、ソースコードです。
//銀河系の中心 int radiusCore = 10; CALayer *galaticsCore = [CALayer layer]; galaticsCore.bounds = CGRectMake(0, 0, radiusCore*2, radiusCore*2); galaticsCore.position = self.view.center; galaticsCore.cornerRadius = radiusCore; galaticsCore.backgroundColor = [UIColor blackColor].CGColor; [self.view.layer addSublayer:galaticsCore]; int radiusOrbitSun = 80; CALayer *orbitSun = [CALayer layer]; orbitSun.bounds = CGRectMake(0, 0, radiusOrbitSun*2, radiusOrbitSun*2); orbitSun.position = self.view.center; orbitSun.cornerRadius = radiusOrbitSun; orbitSun.borderColor = [UIColor lightGrayColor].CGColor; orbitSun.borderWidth = 1.5; int radiusSun = 30; CALayer *sun = [CALayer layer]; sun.bounds = CGRectMake(0, 0, radiusSun*2, radiusSun*2); sun.position = CGPointMake(radiusOrbitSun, 0); sun.cornerRadius = radiusSun; sun.borderColor = [UIColor redColor].CGColor; sun.borderWidth = radiusSun/2; sun.backgroundColor = [UIColor orangeColor].CGColor; [orbitSun addSublayer:sun]; CABasicAnimation *revolutionOfSun = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; revolutionOfSun.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; revolutionOfSun.fromValue = [NSNumber numberWithFloat:0]; revolutionOfSun.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)]; revolutionOfSun.repeatCount = HUGE_VALF; revolutionOfSun.duration = 8.0; [orbitSun addAnimation:revolutionOfSun forKey:@"transform"]; [self.view.layer addSublayer:orbitSun]; // Orbit of Jupiter int radiusOrbitJupiter = 90; CALayer *orbitJupiter = [CALayer layer]; orbitJupiter.bounds = CGRectMake(0, 0, radiusOrbitJupiter*2, radiusOrbitJupiter*2); orbitJupiter.position = sun.position; orbitJupiter.cornerRadius = radiusOrbitJupiter; orbitJupiter.borderColor = [UIColor lightGrayColor].CGColor; orbitJupiter.borderWidth = 1.5; int radiusJupiter = 20; CALayer *Jupiter = [CALayer layer]; Jupiter.bounds = CGRectMake(0, 0, radiusJupiter*2, radiusJupiter*2); Jupiter.position = CGPointMake(radiusOrbitJupiter, 0); Jupiter.cornerRadius = radiusJupiter; Jupiter.backgroundColor = [UIColor cyanColor].CGColor; [orbitJupiter addSublayer:Jupiter]; CABasicAnimation *revolutionOfJupiter = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; revolutionOfJupiter.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; revolutionOfJupiter.fromValue = [NSNumber numberWithFloat:0]; revolutionOfJupiter.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)]; revolutionOfJupiter.repeatCount = HUGE_VALF; revolutionOfJupiter.duration = 7.0; [orbitJupiter addAnimation:revolutionOfJupiter forKey:@"transform"]; [orbitSun addSublayer:orbitJupiter]; // Orbit of Venus int radiusOrbitVenus = 40; CALayer *orbitVenus = [CALayer layer]; orbitVenus.bounds = CGRectMake(0, 0, radiusOrbitVenus*2, radiusOrbitVenus*2); orbitVenus.position = sun.position; orbitVenus.cornerRadius = radiusOrbitVenus; orbitVenus.borderColor = [UIColor lightGrayColor].CGColor; orbitVenus.borderWidth = 1.5; int radiusVenus = 5; CALayer *Venus = [CALayer layer]; Venus.bounds = CGRectMake(0, 0, radiusVenus*2, radiusVenus*2); Venus.position = CGPointMake(radiusOrbitVenus, 0); Venus.cornerRadius = radiusVenus; Venus.backgroundColor = [UIColor brownColor].CGColor; [orbitVenus addSublayer:Venus]; CABasicAnimation *revolutionOfVenus = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; revolutionOfVenus.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; revolutionOfVenus.fromValue = [NSNumber numberWithFloat:0]; revolutionOfVenus.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)]; revolutionOfVenus.repeatCount = HUGE_VALF; revolutionOfVenus.duration = 3.0; [orbitVenus addAnimation:revolutionOfVenus forKey:@"transform"]; [orbitSun addSublayer:orbitVenus]; // Orbit of Mars int radiusOrbitMars = 70; CALayer *orbitMars = [CALayer layer]; orbitMars.bounds = CGRectMake(0, 0, radiusOrbitMars*2, radiusOrbitMars*2); orbitMars.position = sun.position; orbitMars.cornerRadius = radiusOrbitMars; orbitMars.borderColor = [UIColor lightGrayColor].CGColor; orbitMars.borderWidth = 1.5; int radiusMars = 5; CALayer *Mars = [CALayer layer]; Mars.bounds = CGRectMake(0, 0, radiusMars*2, radiusMars*2); Mars.position = CGPointMake(radiusOrbitMars, 0); Mars.cornerRadius = radiusMars; Mars.backgroundColor = [UIColor redColor].CGColor; [orbitMars addSublayer:Mars]; CABasicAnimation *revolutionOfMars = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; revolutionOfMars.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; revolutionOfMars.fromValue = [NSNumber numberWithFloat:0]; revolutionOfMars.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)]; revolutionOfMars.repeatCount = HUGE_VALF; revolutionOfMars.duration = 4.0; [orbitMars addAnimation:revolutionOfMars forKey:@"transform"]; [orbitSun addSublayer:orbitMars]; // Orbit of Earth int radiusOrbitEarth = 60; CALayer *orbitEarth = [CALayer layer]; orbitEarth.bounds = CGRectMake(0, 0, radiusOrbitEarth*2, radiusOrbitEarth*2); orbitEarth.position = sun.position; orbitEarth.cornerRadius = radiusOrbitEarth; orbitEarth.borderColor = [UIColor lightGrayColor].CGColor; orbitEarth.borderWidth = 1.5; int radiusEarth = 8; CALayer *earth = [CALayer layer]; earth.bounds = CGRectMake(0, 0, radiusEarth*2, radiusEarth*2); earth.position = CGPointMake(radiusOrbitEarth, 0); earth.cornerRadius = radiusEarth; earth.backgroundColor = [UIColor blueColor].CGColor; [orbitEarth addSublayer:earth]; CABasicAnimation *revolutionOfEarth = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; revolutionOfEarth.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; revolutionOfEarth.fromValue = [NSNumber numberWithFloat:0]; revolutionOfEarth.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)]; revolutionOfEarth.repeatCount = HUGE_VALF; revolutionOfEarth.duration = 5.0; [orbitEarth addAnimation:revolutionOfEarth forKey:@"transform"]; [orbitSun addSublayer:orbitEarth]; // Orbit of Moon int radiusOrbitMoon = 30; CALayer *orbitMoon = [CALayer layer]; orbitMoon.bounds = CGRectMake(0, 0, radiusOrbitMoon*2, radiusOrbitMoon*2); orbitMoon.position = earth.position; orbitMoon.cornerRadius = radiusOrbitMoon; orbitMoon.borderColor = [UIColor lightGrayColor].CGColor; orbitMoon.borderWidth = 1.5; int radiusMoon = 5; CALayer *moon = [CALayer layer]; moon.bounds = CGRectMake(0, 0, radiusMoon*2, radiusMoon*2); moon.position = CGPointMake(radiusOrbitMoon, 0); moon.cornerRadius = radiusMoon; moon.backgroundColor = [UIColor yellowColor].CGColor; [orbitMoon addSublayer:moon]; CABasicAnimation *revolutionOfMoon = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; revolutionOfMoon.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; revolutionOfMoon.fromValue = [NSNumber numberWithFloat:0]; revolutionOfMoon.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)]; revolutionOfMoon.repeatCount = HUGE_VALF; revolutionOfMoon.duration = 2.0; [orbitMoon addAnimation:revolutionOfMoon forKey:@"transform"]; [orbitEarth addSublayer:orbitMoon];
こんなの少し出来る人なら簡単に出来そうですけど、
少し時間かかるので自分のようなニートくらいしかやる人なんていなさそうです。
汚いソースコード失礼しました。
続きます。