一、简介
判断点是否在三角形内部,这是一个很常见的需求,比如点落在三角形内,就可以对图形进行平移,在外部就什么也不做
这个图形是自定义View画出来,View的真实范围应该是下图的红线所示
二、向量叉乘快速判断点在三角形内外
关于向量叉乘的知识可以看这篇文章
用向量叉乘快速判断点在三角形内外原理与代码_向量法判断点在三角形内部_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
}