StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
StackGenVis/frontend/node_modules/@interactjs/modifiers/snap/pointer.js

170 lines
4.3 KiB

import * as utils from "../../utils/index.js";
function start(arg) {
const {
interaction,
interactable,
element,
rect,
state,
startOffset
} = arg;
const {
options
} = state;
const origin = options.offsetWithOrigin ? getOrigin(arg) : {
x: 0,
y: 0
};
let snapOffset;
if (options.offset === 'startCoords') {
snapOffset = {
x: interaction.coords.start.page.x,
y: interaction.coords.start.page.y
};
} else {
const offsetRect = utils.rect.resolveRectLike(options.offset, interactable, element, [interaction]);
snapOffset = utils.rect.rectToXY(offsetRect) || {
x: 0,
y: 0
};
snapOffset.x += origin.x;
snapOffset.y += origin.y;
}
const {
relativePoints
} = options;
state.offsets = rect && relativePoints && relativePoints.length ? relativePoints.map((relativePoint, index) => ({
index,
relativePoint,
x: startOffset.left - rect.width * relativePoint.x + snapOffset.x,
y: startOffset.top - rect.height * relativePoint.y + snapOffset.y
})) : [utils.extend({
index: 0,
relativePoint: null
}, snapOffset)];
}
function set(arg) {
const {
interaction,
coords,
state
} = arg;
const {
options,
offsets
} = state;
const origin = utils.getOriginXY(interaction.interactable, interaction.element, interaction.prepared.name);
const page = utils.extend({}, coords);
const targets = [];
if (!options.offsetWithOrigin) {
page.x -= origin.x;
page.y -= origin.y;
}
for (const offset of offsets) {
const relativeX = page.x - offset.x;
const relativeY = page.y - offset.y;
for (let index = 0, len = options.targets.length; index < len; index++) {
const snapTarget = options.targets[index];
let target;
if (utils.is.func(snapTarget)) {
target = snapTarget(relativeX, relativeY, interaction, offset, index);
} else {
target = snapTarget;
}
if (!target) {
continue;
}
targets.push({
x: (utils.is.number(target.x) ? target.x : relativeX) + offset.x,
y: (utils.is.number(target.y) ? target.y : relativeY) + offset.y,
range: utils.is.number(target.range) ? target.range : options.range,
source: snapTarget,
index,
offset
});
}
}
const closest = {
target: null,
inRange: false,
distance: 0,
range: 0,
delta: {
x: 0,
y: 0
}
};
for (const target of targets) {
const range = target.range;
const dx = target.x - page.x;
const dy = target.y - page.y;
const distance = utils.hypot(dx, dy);
let inRange = distance <= range; // Infinite targets count as being out of range
// compared to non infinite ones that are in range
if (range === Infinity && closest.inRange && closest.range !== Infinity) {
inRange = false;
}
if (!closest.target || (inRange // is the closest target in range?
? closest.inRange && range !== Infinity // the pointer is relatively deeper in this target
? distance / range < closest.distance / closest.range // this target has Infinite range and the closest doesn't
: range === Infinity && closest.range !== Infinity || // OR this target is closer that the previous closest
distance < closest.distance : // The other is not in range and the pointer is closer to this target
!closest.inRange && distance < closest.distance)) {
closest.target = target;
closest.distance = distance;
closest.range = range;
closest.inRange = inRange;
closest.delta.x = dx;
closest.delta.y = dy;
}
}
if (closest.inRange) {
coords.x = closest.target.x;
coords.y = closest.target.y;
}
state.closest = closest;
return closest;
}
function getOrigin(arg) {
const {
element
} = arg.interaction;
const optionsOrigin = utils.rect.rectToXY(utils.rect.resolveRectLike(arg.state.options.origin, null, null, [element]));
const origin = optionsOrigin || utils.getOriginXY(arg.interactable, element, arg.interaction.prepared.name);
return origin;
}
const defaults = {
range: Infinity,
targets: null,
offset: null,
offsetWithOrigin: true,
origin: null,
relativePoints: null,
endOnly: false,
enabled: false
};
const snap = {
start,
set,
defaults
};
export default snap;
//# sourceMappingURL=pointer.js.map