如何检测一个点是否在复杂的、不规则的矢量形状(SVG)内部?

Ste*_* M. 2 events svg point vector-graphics detection

我对这一切或多或少都是陌生的。我正在尝试使用 SVG 创建一个应用程序(因为我宁愿拥有可以缩放而不损失质量的矢量形状)。使用网络技术,后来迁移到反应原生。

有什么方法可以让我找出一个点(x,y,也由 CSS 的lefttop属性确定)是否位于高度复杂的、不规则的矢量形状内?

我知道我的问题充满了限制,这使得它很难回答,即使指出正确的文档也会有所帮助。

PS:我尝试了 elementFromPoint() 方法,但它返回 DOM 在我的 SVG 周围放置的边界矩形。这完全违背了我的目的,我想确保仅在 SVG 路径内检测到该点并自行塑造。感谢任何帮助,谢谢!

Sph*_*xxx 6

只要您使用内联 SVG,elementFromPoint()就应该可以正常工作:

const shape = document.querySelector('#shape'),
      status = document.querySelector('#inout');

document.body.addEventListener('mousemove', function(e) {
    const x = e.clientX,
          y = e.clientY;
    
    if(document.elementFromPoint(x, y) === shape) {
        status.className = status.textContent = 'inside';
    }
    else {
        status.className = status.textContent = 'outside';
    }
});
Run Code Online (Sandbox Code Playgroud)
h2 { margin: 0; }

.inside { color: lime; }
.outside { color: red; }
Run Code Online (Sandbox Code Playgroud)
<h2>The cursor is: <span id="inout" class="outside">outside</span></h2>

<svg xmlns="http://www.w3.org/2000/svg" width="250" height="200">
    <path id="shape" d="M150,120  q26,75 -80,50  c-80,-25 -53,-125 -26,-125  c53,-25 107,-25 107,50  q107,-50 53,50 z"
          stroke-width="4" fill="yellow" stroke="limegreen" />
</svg>
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/n98m4Lrk/