change u-strasbg to cds.unistra urls + enhance/simplify inertia effect

This commit is contained in:
Matthieu Baumann
2025-09-22 11:11:12 +02:00
parent 904d449006
commit 2df32cb643
9 changed files with 3897 additions and 3865 deletions

View File

@@ -1,4 +1,4 @@
# [Aladin Lite](https://aladin.u-strasbg.fr/AladinLite) # [Aladin Lite](https://aladin.cds.unistra.fr/AladinLite)
**An astronomical HiPS visualizer in the browser** <img src="aladin-logo.png" alt="Aladin Lite logo" width="220"> **An astronomical HiPS visualizer in the browser** <img src="aladin-logo.png" alt="Aladin Lite logo" width="220">
@@ -8,14 +8,14 @@ See [A&A 578, A114 (2015)](https://arxiv.org/abs/1505.02291) and [IVOA HiPS Reco
Aladin Lite is built to be easily embeddable in any web page. It powers astronomical portals like [ESASky](https://sky.esa.int/), [ESO Science Archive portal](http://archive.eso.org/scienceportal/) and [ALMA Portal](https://almascience.eso.org/asax/). Aladin Lite is built to be easily embeddable in any web page. It powers astronomical portals like [ESASky](https://sky.esa.int/), [ESO Science Archive portal](http://archive.eso.org/scienceportal/) and [ALMA Portal](https://almascience.eso.org/asax/).
More details on [Aladin Lite documentation page](http://aladin.u-strasbg.fr/AladinLite/doc/). More details on [Aladin Lite documentation page](http://aladin.cds.unistra.fr/AladinLite/doc/).
A new [API technical documentation](https://cds-astro.github.io/aladin-lite/) is now available. A new [API technical documentation](https://cds-astro.github.io/aladin-lite/) is now available.
[![Run tests](https://github.com/cds-astro/aladin-lite/actions/workflows/test.yml/badge.svg)](https://github.com/cds-astro/aladin-lite/actions/workflows/test.yml) [![Run tests](https://github.com/cds-astro/aladin-lite/actions/workflows/test.yml/badge.svg)](https://github.com/cds-astro/aladin-lite/actions/workflows/test.yml)
[![API Documentation](https://img.shields.io/badge/API-documentation-blue.svg)](https://cds-astro.github.io/aladin-lite) [![API Documentation](https://img.shields.io/badge/API-documentation-blue.svg)](https://cds-astro.github.io/aladin-lite)
[![Release page](https://img.shields.io/badge/Release-download-yellow.svg)](https://aladin.cds.unistra.fr/AladinLite/doc/release/) [![Release page](https://img.shields.io/badge/Release-download-yellow.svg)](https://aladin.cds.unistra.fr/AladinLite/doc/release/)
Try Aladin Lite [here](https://aladin.u-strasbg.fr/AladinLite). Try Aladin Lite [here](https://aladin.cds.unistra.fr/AladinLite).
Aladin Lite is made possible thanks to pure Rust core libraries: Aladin Lite is made possible thanks to pure Rust core libraries:
* [cdshealpix](https://github.com/cds-astro/cds-healpix-rust) - for HEALPix projection and unprojection to/from sky coordinates * [cdshealpix](https://github.com/cds-astro/cds-healpix-rust) - for HEALPix projection and unprojection to/from sky coordinates

View File

@@ -1,5 +1,5 @@
{ {
"homepage": "https://aladin.u-strasbg.fr/", "homepage": "https://aladin.cds.unistra.fr/",
"name": "aladin-lite", "name": "aladin-lite",
"type": "module", "type": "module",
"version": "3.7.2-beta", "version": "3.7.2-beta",

View File

@@ -87,6 +87,7 @@ pub struct App {
time_start_dragging: Time, time_start_dragging: Time,
time_mouse_high_vel: Time, time_mouse_high_vel: Time,
dragging: bool, dragging: bool,
vel_history: Vec<f32>,
prev_cam_position: Vector3<f64>, prev_cam_position: Vector3<f64>,
//prev_center: Vector3<f64>, //prev_center: Vector3<f64>,
@@ -208,6 +209,7 @@ impl App {
let browser_features_support = BrowserFeaturesSupport::new(); let browser_features_support = BrowserFeaturesSupport::new();
let vel_history = vec![];
Ok(App { Ok(App {
gl, gl,
//ui, //ui,
@@ -244,6 +246,7 @@ impl App {
time_start_dragging, time_start_dragging,
time_mouse_high_vel, time_mouse_high_vel,
dragging, dragging,
vel_history,
prev_cam_position, prev_cam_position,
out_of_fov, out_of_fov,
@@ -1538,7 +1541,16 @@ impl App {
let dx = crate::math::vector::dist2(&from_mouse_pos, &to_mouse_pos).sqrt(); let dx = crate::math::vector::dist2(&from_mouse_pos, &to_mouse_pos).sqrt();
self.dist_dragging += dx; self.dist_dragging += dx;
//let now = Time::now();
//let dragging_duration = (now - self.time_start_dragging).as_secs();
//let dragging_vel = self.dist_dragging / dragging_duration;
// 1. Use smoothed velocity instead of instantaneous velocity
let dv = dx / (Time::now() - self.camera.get_time_of_last_move()).as_secs(); let dv = dx / (Time::now() - self.camera.get_time_of_last_move()).as_secs();
self.vel_history.push(dv);
if self.vel_history.len() > 5 {
self.vel_history.remove(0);
}
if dv > 10000.0 { if dv > 10000.0 {
self.time_mouse_high_vel = Time::now(); self.time_mouse_high_vel = Time::now();
@@ -1587,15 +1599,18 @@ impl App {
} }
let now = Time::now(); let now = Time::now();
let dragging_duration = (now - self.time_start_dragging).as_secs(); let avg_vel = self.vel_history.iter().copied().sum::<f32>() / self.vel_history.len() as f32;
let dragging_vel = self.dist_dragging / dragging_duration;
// Detect if there has been a recent acceleration // 2. Clamp minimum + maximum velocities
// It is also possible that the dragging time is too short and if it is the case, trigger the inertia let min_vel = 1000.0; // tweak
let recent_acceleration = (Time::now() - self.time_mouse_high_vel).as_secs() < 0.1
|| (Time::now() - self.time_start_dragging).as_secs() < 0.1;
if dragging_vel < 2000.0 && !recent_acceleration { // 3. Better condition for “recent acceleration
let t_since_drag = (now - self.time_start_dragging).as_secs();
let t_since_accel = (now - self.time_mouse_high_vel).as_secs();
let inertia_trigger =
avg_vel > min_vel || ((t_since_drag < 0.15) || (t_since_accel < 0.15));
if !inertia_trigger {
return; return;
} }
@@ -1605,10 +1620,8 @@ impl App {
let center = self.camera.get_center(); let center = self.camera.get_center();
let axis = self.prev_cam_position.cross(*center).normalize(); let axis = self.prev_cam_position.cross(*center).normalize();
//let delta_time = ((now - time_of_last_move).0 as f64).max(1.0);
let delta_angle = math::vector::angle3(&self.prev_cam_position, center).to_radians(); let delta_angle = math::vector::angle3(&self.prev_cam_position, center).to_radians();
let ampl = delta_angle * (dragging_vel as f64) * 5e-3; let ampl = (delta_angle * avg_vel as f64) * 5e-3;
//let ampl = (dragging_vel * 0.01) as f64;
self.inertia = Some(Inertia::new(ampl.to_radians(), axis, self.north_up)) self.inertia = Some(Inertia::new(ampl.to_radians(), axis, self.north_up))
} }

View File

@@ -27,6 +27,7 @@ impl Inertia {
} }
} }
/*
pub fn apply(&mut self, camera: &mut CameraViewPort, proj: &ProjectionType, _dt: DeltaTime) { pub fn apply(&mut self, camera: &mut CameraViewPort, proj: &ProjectionType, _dt: DeltaTime) {
let t = ((Time::now() - self.time_start).as_millis() / 1000.0) as f64; let t = ((Time::now() - self.time_start).as_millis() / 1000.0) as f64;
// Undamped angular frequency of the oscillator // Undamped angular frequency of the oscillator
@@ -46,6 +47,24 @@ impl Inertia {
let fov = start_fov * (1_f32 - alpha) + goal_fov * alpha;*/ let fov = start_fov * (1_f32 - alpha) + goal_fov * alpha;*/
camera.apply_axis_rotation(&self.axis, self.speed.to_angle(), proj); camera.apply_axis_rotation(&self.axis, self.speed.to_angle(), proj);
if self.north_up {
camera.set_position_angle(0.0.to_angle(), proj);
}
}*/
pub fn apply(&mut self, camera: &mut CameraViewPort, proj: &ProjectionType, _dt: DeltaTime) {
let t = ((Time::now() - self.time_start).as_millis() / 1000.0) as f64;
// Initial angular velocity
let v0 = self.ampl * 0.5;
// Friction coefficient (tweak this)
let damping = 2.5;
// Exponential decay of angular velocity
self.speed = (v0 * (-damping * t).exp()).min(3.0);
camera.apply_axis_rotation(&self.axis, self.speed.to_angle(), proj);
if self.north_up { if self.north_up {
camera.set_position_angle(0.0.to_angle(), proj); camera.set_position_angle(0.0.to_angle(), proj);
} }

File diff suppressed because it is too large Load Diff

View File

@@ -362,7 +362,7 @@ A.graphicOverlay = function (options) {
* @returns {ProgressiveCat} Returns a new Overlay object representing the graphic overlay. * @returns {ProgressiveCat} Returns a new Overlay object representing the graphic overlay.
* *
* @example * @example
* let gaia = A.catalogHiPS('http://axel.u-strasbg.fr/HiPSCatService/I/345/gaia2', {onClick: 'showTable', color: 'orange', name: 'Gaia', filter: myFilterFunction}); * let gaia = A.catalogHiPS('http://axel.cds.unistra.fr/HiPSCatService/I/345/gaia2', {onClick: 'showTable', color: 'orange', name: 'Gaia', filter: myFilterFunction});
* aladin.addCatalog(gaia) * aladin.addCatalog(gaia)
*/ */
A.catalogHiPS = function (url, options) { A.catalogHiPS = function (url, options) {

View File

@@ -941,7 +941,7 @@ export let Aladin = (function () {
objectName + objectName +
"'"; "'";
var url = var url =
"//simbad.u-strasbg.fr/simbad/sim-tap/sync?query=" + "//simbad.cds.unistra.fr/simbad/sim-tap/sync?query=" +
encodeURIComponent(query) + encodeURIComponent(query) +
"&request=doQuery&lang=adql&format=json&phase=run"; "&request=doQuery&lang=adql&format=json&phase=run";

View File

@@ -60,7 +60,7 @@ export let SimbadPointer = (function() {
if (Utils.isNumber(magnitude)) { if (Utils.isNumber(magnitude)) {
content += '<em>Mag: </em>' + magnitude + '<br>'; content += '<em>Mag: </em>' + magnitude + '<br>';
} }
content += '<br><a target="_blank" href="http://cdsportal.u-strasbg.fr/?target=' + encodeURIComponent(objName) + '">Query in CDS portal</a>'; content += '<br><a target="_blank" href="http://cdsportal.cds.unistra.fr/?target=' + encodeURIComponent(objName) + '">Query in CDS portal</a>';
content += '</div>'; content += '</div>';
aladinInstance.showPopup(objCoo.lon, objCoo.lat, title, content); aladinInstance.showPopup(objCoo.lon, objCoo.lat, title, content);

View File

@@ -75,7 +75,7 @@ export class OverlayStackBox extends Box {
};*/ };*/
static predefinedCats = { static predefinedCats = {
simbad: { simbad: {
url: "https://axel.u-strasbg.fr/HiPSCatService/SIMBAD", url: "https://axel.cds.unistra.fr/HiPSCatService/SIMBAD",
options: { options: {
id: "simbad", id: "simbad",
name: "SIMBAD", name: "SIMBAD",
@@ -98,7 +98,7 @@ export class OverlayStackBox extends Box {
}, },
}, },
gaia: { gaia: {
url: "https://axel.u-strasbg.fr/HiPSCatService/I/355/gaiadr3", url: "https://axel.cds.unistra.fr/HiPSCatService/I/355/gaiadr3",
options: { options: {
id: "gaia-dr3", id: "gaia-dr3",
name: "Gaia DR3", name: "Gaia DR3",
@@ -109,7 +109,7 @@ export class OverlayStackBox extends Box {
}, },
}, },
twomass: { twomass: {
url: "https://axel.u-strasbg.fr/HiPSCatService/II/246/out", url: "https://axel.cds.unistra.fr/HiPSCatService/II/246/out",
options: { options: {
id: "2mass", id: "2mass",
name: "2MASS", name: "2MASS",
@@ -790,7 +790,7 @@ export class OverlayStackBox extends Box {
moreHiPSLink.addEventListener("click", (e) => { moreHiPSLink.addEventListener("click", (e) => {
e.preventDefault(); e.preventDefault();
if (!self.hipsBrowser) if (!self.hipsBrowser)
self.hipsBrowser = new HiPSBrowserBox(aladin); self.hipsBrowser = new HiPSBrowserBox(self.aladin);
self.hipsBrowser._show({ position: { anchor: "center center" } }); self.hipsBrowser._show({ position: { anchor: "center center" } });
}); });