select filled elements by clicking inside (#340)
This commit is contained in:
parent
c67435719f
commit
5887be6eda
@ -50,10 +50,25 @@ export function hitTest(
|
|||||||
ty /= t;
|
ty /= t;
|
||||||
});
|
});
|
||||||
|
|
||||||
return Math.hypot(a * tx - px, b * ty - py) < lineThreshold;
|
if (element.backgroundColor !== "transparent") {
|
||||||
|
return (
|
||||||
|
a * tx - (px - lineThreshold) >= 0 && b * ty - (py - lineThreshold) >= 0
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return Math.hypot(a * tx - px, b * ty - py) < lineThreshold;
|
||||||
|
}
|
||||||
} else if (element.type === "rectangle") {
|
} else if (element.type === "rectangle") {
|
||||||
const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);
|
const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);
|
||||||
|
|
||||||
|
if (element.backgroundColor !== "transparent") {
|
||||||
|
return (
|
||||||
|
x > x1 - lineThreshold &&
|
||||||
|
x < x2 + lineThreshold &&
|
||||||
|
y > y1 - lineThreshold &&
|
||||||
|
y < y2 + lineThreshold
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// (x1, y1) --A-- (x2, y1)
|
// (x1, y1) --A-- (x2, y1)
|
||||||
// |D |B
|
// |D |B
|
||||||
// (x1, y2) --C-- (x2, y2)
|
// (x1, y2) --C-- (x2, y2)
|
||||||
@ -67,7 +82,7 @@ export function hitTest(
|
|||||||
x -= element.x;
|
x -= element.x;
|
||||||
y -= element.y;
|
y -= element.y;
|
||||||
|
|
||||||
const [
|
let [
|
||||||
topX,
|
topX,
|
||||||
topY,
|
topY,
|
||||||
rightX,
|
rightX,
|
||||||
@ -78,6 +93,42 @@ export function hitTest(
|
|||||||
leftY
|
leftY
|
||||||
] = getDiamondPoints(element);
|
] = getDiamondPoints(element);
|
||||||
|
|
||||||
|
if (element.backgroundColor !== "transparent") {
|
||||||
|
// TODO: remove this when we normalize coordinates globally
|
||||||
|
if (topY > bottomY) [bottomY, topY] = [topY, bottomY];
|
||||||
|
if (rightX < leftX) [leftX, rightX] = [rightX, leftX];
|
||||||
|
|
||||||
|
topY -= lineThreshold;
|
||||||
|
bottomY += lineThreshold;
|
||||||
|
leftX -= lineThreshold;
|
||||||
|
rightX += lineThreshold;
|
||||||
|
|
||||||
|
// all deltas should be < 0. Delta > 0 indicates it's on the outside side
|
||||||
|
// of the line.
|
||||||
|
//
|
||||||
|
// (topX, topY)
|
||||||
|
// D / \ A
|
||||||
|
// / \
|
||||||
|
// (leftX, leftY) (rightX, rightY)
|
||||||
|
// C \ / B
|
||||||
|
// \ /
|
||||||
|
// (bottomX, bottomY)
|
||||||
|
//
|
||||||
|
// https://stackoverflow.com/a/2752753/927631
|
||||||
|
return (
|
||||||
|
// delta from line D
|
||||||
|
(leftX - topX) * (y - leftY) - (leftX - x) * (topY - leftY) <= 0 &&
|
||||||
|
// delta from line A
|
||||||
|
(topX - rightX) * (y - rightY) - (x - rightX) * (topY - rightY) <= 0 &&
|
||||||
|
// delta from line B
|
||||||
|
(rightX - bottomX) * (y - bottomY) -
|
||||||
|
(x - bottomX) * (rightY - bottomY) <=
|
||||||
|
0 &&
|
||||||
|
// delta from line C
|
||||||
|
(bottomX - leftX) * (y - leftY) - (x - leftX) * (bottomY - leftY) <= 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
distanceBetweenPointAndSegment(x, y, topX, topY, rightX, rightY) <
|
distanceBetweenPointAndSegment(x, y, topX, topY, rightX, rightY) <
|
||||||
lineThreshold ||
|
lineThreshold ||
|
||||||
|
Loading…
x
Reference in New Issue
Block a user