AppleWatch 和時計に南中角度追加と二十四節気修正

AppleWatch 和時計に南中角度を追加

 

Xcode 16.0

macOS 15.0

WatchOS 11.0

出来たこと

  

 

内容

  • 「日時、二十四節気、日の出−日の入り」は、和時計から引用し大きく表示しました

       

 

  • 旧暦は、中国暦としました

    // 中国暦 = 旧暦

    let today = Date()

    let chineseCalendar = Calendar(identifier: .chinese)

    let comp = chineseCalendar.dateComponents([.year, .month, .day], from: today)

    Text("旧暦  \(comp.month!)/\(comp.day!)").font(.system(size: 18))

     

  • 万歩計
    • 基本的な機能であり、おそらく機能追加はしないでしょう。 

   

    • 歩数追加(24年3月19日)
      • CMPedometer」をググってみたら、みなさんから色々とアップされていました。 参考にさせていただきます

   

 

南中角度の追加と二十四節気を修正

 ①二十四節気の表記を変更

  • // 今日が24節気かどうか調べる

    // 引数  .... 計算対象となる年月日 year month day

    // 戻り値 .... 24節気の名称

    //=========================================================================

    func get24Sekki(year:Double, month:Double,day:Double)-> (String ) {

        let sekkiName = ["春分","清明","穀雨","立夏","小満","芒種","夏至","小暑","大暑","立秋","処暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至","小寒","大寒","立春","雨水","啓蟄"] // 24節気の定義

        var JD: Double

        var JD1: Double

        var JD2: Double

        var t: Double

        var today: Int

        var tomorrow: Int

        //今日の太陽の黄経

        JD = ymd2jd(yea: year, mont: month, ysDay: day)    //ユリウス日の計算

        JD1 = floor(JD)    //時刻引数を分解する

        JD2 = JD - JD1

        JD2 -= 9.0 / 24.0

        t = (JD2 + 0.5) / 36525.0

        t = t + (JD1 - 2451545.0) / 36525.0

        today = Int( LONGITUDE_SUN(t:t))

        //明日の太陽の黄経

        JD += 1

        JD1 = floor(JD)    //時刻引数を分解する

        JD2 = JD - JD1

        JD2 -= 9.0 / 24.0

        t = (JD2 + 0.5) / 36525.0

        t = t + (JD1 - 2451545.0) / 36525.0

        tomorrow = Int( LONGITUDE_SUN(t: t))

     

        today    = Int( 15.0 * floor( Double( today ) / 15.0 ))

        tomorrow = Int( 15.0 * floor( Double( tomorrow) / 15.0))

        if today != tomorrow {

            return( "*" + sekkiName[ tomorrow/15] )

        }else{

            return( sekkiName[ tomorrow/15] + " 過ぎ" )

        }

    }

 ②南中角度を昼角度と表記

  • //参考PG:http://k-ichikawa.blog.enjoy.jp/etc/HP/js/sunRise/srs1.html

    //......................................

    func calcB( m: Int, d1: Int, basyoNo: Int, latDat:String, lonDat:String ) -> (Double, Double, Double) {

        let MD = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // 日数

        //               札幌     金沢     東京    愛知      三重     大阪    福岡     那覇

        let latVal = [0,  43.05,  36.55,  35.68,  34.99,  34.35,  34.68,  33.58,  26.20 ]

        let lonVal = [0, 141.33, 136.65, 139.77, 137.10, 136.70, 135.52, 130.38, 127.68 ]

        let del:Double

        let phi:Double

        let t: Double

        var T: Double

        let delta: Double

        let ee: Double

        //let distES2: Double

        let tsta: Double

        let tend: Double

        let tmid: Double

        

        //TOUKYOU

        var lat = 35.68

        var lon = 139.77

        

        if basyoNo == 0 {

            lat = atof( latDat )

            lon = atof( lonDat )

            if lat == 0.0 || lon == 0.0 {

                lat = 35.68

                lon = 139.77

            }

        }else{

            lat = latVal[basyoNo]

            lon = lonVal[basyoNo]

        }

     

        var jd2 = d1

        for i in 0..<m-1 {

            jd2 += MD[i]

        }

        let jd: Double = Double( jd2 ) + 0.5

        let nd = 365.0;

        let w  = 2.0 * Double.pi / nd

        let wj = w * Double(jd)

        

        //太陽赤緯: δ(太陽光線と地球の赤道面との角度、±23°27'の範囲で変化)

        delta = 0.33281 - 22.984*cos(wj) - 0.34990*cos(2*wj) - 0.13980*cos(3*wj)

        + 3.7872*sin(wj) + 0.03250*sin(2*wj) + 0.07187*sin(3*wj)

        

        //均時差: e(天球上を一定な速さで動くと考えた平均太陽と、実際の太陽との移動の差、17分未満)

        ee =   0.0072*cos(wj) - 0.0528*cos(2*wj) - 0.0012*cos(3*wj)

        - 0.1229*sin(wj) - 0.1565*sin(2*wj) - 0.0041*sin(3*wj)

        

        //北緯

        phi = lat*Double.pi/180

        

        //東経

        del = delta*Double.pi/180

        

        //時角: t [単位: 時間]

        t = acos*1 /  (cos(del) * cos(phi))) * 180 / Double.pi

    //    t = acos(-tan(del)*tan(phi))*180/Double.pi

        

        //日の出

        T = (-t + 180)/15;

        tsta = T - (lon - 135)/15.0 - ee

        //日の暮れ

        T = (t + 180)/15

        tend = T - (lon - 135)/15.0 - ee

        

        //南中時刻

        tmid = (tsta + tend)/2

        T = 15 * tmid - 180

        let ttt = T * Double.pi/180

        let angH = asin(sin(phi) * sin(del) + cos(phi)*cos(del)*cos(ttt))

        //昼角度

        let tmidAng = angH*180/Double.pi

        

        //tsta:日の出  tend:日の入 tmidAng:昼角度

        return (tsta, tend, tmidAng)

    }

 ③場所指定に「愛知県/安城」を追加

 ・緯度経度を設定

   func calcB( m: Int, d1: Int,........

   中略

     //                札幌     金沢     東京    愛知      三重     大阪    福岡     那覇 

     let latVal = [0,  43.05,  36.55,  35.68,  34.99,  34.35,  34.68,  33.58,  26.20 ]

     let lonVal = [0, 141.33, 136.65, 139.77, 137.10, 136.70, 135.52, 130.38, 127.68 ]

   中略

  }

 

 ・pickerに追加   

  var body: some View {

     中略

     Picker("和時計の場所指定", selection: $selectionValue) {

         /// 選択項目の一覧

         Text("直接入力").tag(0)

         Text("北海道/札幌").tag(1)

         Text("石川/金沢").tag(2)

         Text("東京/東京").tag(3)

         Text("愛知/安城").tag(4)

         Text("三重/五ケ所").tag(5)

         Text("大阪/大阪").tag(6)

         Text("福岡/福岡").tag(7)

         Text("沖縄/那覇").tag(8)

     }

     .pickerStyle(.wheel)

    中略

  }

 

備考

太陽の位置が分かる既存ソフト

 

 

ここまで見ていただき、ありがとうございます

 

 

*1:-51 / 60 * Double.pi / 180-sin(del)*sin(phi

プライバシーポリシー |ページトップへ

`