ich folgenden Resize-Skript gebaut - wie man sich von der Geige sehen, es funktioniert für Scaling-up, aber nicht nach unten:Skalieren skalieren skalieren, nicht nach unten. die Determinante macht es nervös
https://jsfiddle.net/calipoop/a37aeb08/
var item = document.getElementById('item'),
btn = document.getElementById('resizeBtn'),
s = 1;
btn.addEventListener('mousedown', initResize);
function initResize(e) {
var startS = s, startX = e.clientX, startY = e.clientY, dx, dy, d;
window.addEventListener('mousemove', resize);
window.addEventListener('mouseup', killResize);
function resize(e) {
dx = startX - e.clientX;
dy = startY - e.clientY;
d = Math.round(Math.sqrt(dx * dx + dy * dy));
s = startS + (d * .001);
item.style.transform = "scale(" + s + ")";
}
function killResize() {
window.removeEventListener('mousemove', resize);
window.removeEventListener('mouseup', killResize);
}
}
Ich habe versucht, das Problem zu beheben durch die Determinante/Kreuzprodukt für eine positive/negative Richtung unter Verwendung von:
https://jsfiddle.net/calipoop/zbx3us36/
det = (startX*e.clientY) - (e.clientX*startY);
dir = (det >= 0) ? 1 : -1; //get direction from sign of determinant
d = Math.round(Math.sqrt(dx * dx + dy * dy)) * dir;
Wie Sie von der Geige sehen können, "skaliert" es jetzt manchmal und es ist immer nervös.
Irgendwelche Mathe Majors mit Ideen? Bekomme ich die Determinante falsch? Vielen Dank im Voraus für jede Einsicht.
Dank für das Update Greg! Es ist jetzt viel glatter, aber nur, wenn Sie sich in eine vollkommen diagonale Richtung bewegen. Wenn Sie mehr in Richtung X oder Y-Achse drehen, springt es ... können Sie replizieren? Wie können wir den Sprung vermeiden? – calipoop
RE negative ganze Zahl, ich habe versucht, das über die Determinante zu erreichen (det = (startX x e.clientY) - (e.clientX x startY)). Ich dachte, das könnte die Skalierung glatter machen. – calipoop
Ich sah, es funktionierte nicht gut mit der Logik, da es davon abhing, wie Sie sich bewegten. –