Change before you have to.

androidアプリ開発、iosアプリ開発、rails、deep learning .etc.を使った社会実験。

【iOSプログラミング】惑星公転軌道をデフォルト機能だけでシミュレーションしてみた

 

前回までに

iOS Developer登録(申請篇、アクティベート篇、完結篇)

開発環境の整備

オブジェクト指向とは?

いざプログラミング!

iOSアプリで部品を作る

iOSアプリケーションのアニメーションまとめ

iOSアプリケーションのレイヤーまとめ

 

ということでやってきました。

前回初めて勉強したレイヤーの復習ということで

今回は蛇足というか完全に遊びですw

iPhoneアプリを勉強して10日目のニートが調子にのって戯言を言っているなー程度に

少しだけお付き合い下さい。

 

前回、レイヤーは任意の軌道を移動することができると言いましたが、

それを利用して太陽系の惑星を公転軌道をシミュレーションしてみました。 

その様子です。


orbitCalc - YouTube

 

 

中心の黒いのが銀河の中心で

中心がオレンジで赤いのが太陽

その周りを金星(茶色)、地球(青)、火星(赤)、木製(水色)が公転しています。

更に地球の周りには黄色い月が公転しています。

 

ちなみに公転周期と公転半径(そもそも真円じゃない笑)は現実のものとは全く異なる仮想的なものです。

こんな感じで書いたら天文学の先生とかに怒られそうですが

アニメーションの勉強ということでお許し頂ければと思います。

 

 

以下、ソースコードです。

 

  
    //銀河系の中心
    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];

 

こんなの少し出来る人なら簡単に出来そうですけど、

少し時間かかるので自分のようなニートくらいしかやる人なんていなさそうです。

 

汚いソースコード失礼しました。

 

続きます。