mirror of
https://github.com/cds-astro/aladin-lite.git
synced 2026-04-28 11:53:18 -07:00
change u-strasbg to cds.unistra urls + enhance/simplify inertia effect
This commit is contained in:
@@ -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.
|
||||||
|
|
||||||
[](https://github.com/cds-astro/aladin-lite/actions/workflows/test.yml)
|
[](https://github.com/cds-astro/aladin-lite/actions/workflows/test.yml)
|
||||||
[](https://cds-astro.github.io/aladin-lite)
|
[](https://cds-astro.github.io/aladin-lite)
|
||||||
[](https://aladin.cds.unistra.fr/AladinLite/doc/release/)
|
[](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
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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) {
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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" } });
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user