mirror of
				https://github.com/excalidraw/excalidraw.git
				synced 2025-11-04 12:54:23 +01:00 
			
		
		
		
	select filled elements by clicking inside (#340)
This commit is contained in:
		
				
					committed by
					
						
						Christopher Chedeau
					
				
			
			
				
	
			
			
			
						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 ||
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user