///|
struct Track {
visible_samples : Int
peak : @sun.Position
peak_time : @sun.Instant
csv : String
} derive(Debug)
///|
/// Deterministic ten-minute samples, not a photovoltaic energy model.
fn track(start : @sun.Instant, site : @sun.Observer) -> Track {
let mut peak = @sun.sun_position(start, site)
let mut peak_time = start
let mut visible = 0
let mut csv = "utc,azimuth_deg,apparent_altitude_deg\n"
let samples = @sun.sample_observations(start, 600000.0, 144, site).unwrap()
for sample in samples {
let date = sample.time
let p = sample.sun
if p.altitude > 0.0 {
visible += 1
}
if p.altitude > peak.altitude {
peak = p
peak_time = date
}
csv += date.to_iso_utc() +
"," +
p.azimuth.to_string() +
"," +
p.altitude.to_string() +
"\n"
}
{ visible_samples: visible, peak, peak_time, csv, }
}
///|
fn main {
let date = @sun.utc(2026, 9, 14).unwrap()
let site = @sun.observer(31.23, 121.47).unwrap()
let result = track(date, site)
println(
"上海太阳位置轨迹,UTC 2026-09-14,每 10 分钟,共 144 点",
)
println(
"太阳视中心高于 0° 的样本数:" +
result.visible_samples.to_string(),
)
println("样本最高点:" + result.peak_time.to_iso_utc())
println("最高视高度角:" + result.peak.altitude.to_string() + "°")
println(
"求根计算的太阳中天:" +
@sun.sun_times(date, site).solar_noon.to_iso_utc(),
)
println(
"样本最高点不等于精确中天;以下 CSV 可用于太阳路径图,不用于发电量预测。",
)
println(result.csv)
}