Android 判断点是否在三角形区域内部

360 阅读1分钟

一、简介

判断点是否在三角形内部,这是一个很常见的需求,比如点落在三角形内,就可以对图形进行平移,在外部就什么也不做

Snipaste_2023-10-12_16-41-53.png

这个图形是自定义View画出来,View的真实范围应该是下图的红线所示 Snipaste_2023-10-12_16-45-56.png

二、向量叉乘快速判断点在三角形内外

关于向量叉乘的知识可以看这篇文章

用向量叉乘快速判断点在三角形内外原理与代码_向量法判断点在三角形内部_zeeq_的博客-CSDN博客

/**
 * 判断点是否在三角形内部
 * 这个方法接受一个点和三角形的三个顶点作为参数,并返回一个布尔值,表示该点是否在三角形内部
 * 其中p为外部的点,a、b、c为三角形的三个顶点
 */
 private fun isPointInTriangle(p: PointF, a: PointF, b: PointF, c: PointF): Boolean {
    val abCrossProduct = crossProductLength(a, b, p)
    val bcCrossProduct = crossProductLength(b, c, p)
    val caCrossProduct = crossProductLength(c, a, p)
    return sameSign(abCrossProduct, bcCrossProduct) && sameSign(bcCrossProduct, caCrossProduct)
}

private fun crossProductLength(
    a: PointF,
    b: PointF,
    p: PointF
): Float {
    return (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x)
}

private fun sameSign(a: Float, b: Float): Boolean {
    return a * b >= 0
}