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年3月19日)
南中角度の追加と二十四節気を修正
①二十四節気の表記を変更
-
// 今日が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