两条路径或一条路径与一个点的相交永远不会返回true

时间:2018-12-06 13:58:57

标签: android kotlin android-canvas

我遇到了thisthis的问题,全部与Android中的检测交集有关。好吧,我无法使它们与最终代码一起工作,因此我举了一个例子,其中两行肯定相交。在这种情况下甚至都不幸运。我编写了一个示例代码,其中包含两条直线路径,适合它们的区域以及一个一定要交叉的点。完全倒霉。

var theyCross = false
val intersectionPath = Path()

val clipArea = Region(0, 0, 100, 100)
val path1 = Path()
path1.moveTo(50f, 0f)
path1.lineTo(50f, 100f)

val path2 = Path()
path2.moveTo(0f, 50f)
path2.lineTo(100f, 50f)

val newRegion1 = Region()
newRegion1.setPath(path1, clipArea)

val newRegion2 = Region()
newRegion2.setPath(path2, clipArea)

if(
    !newRegion1.quickReject(newRegion2) && 
    newRegion1.op(newRegion2, Region.Op.INTERSECT)
) {
    // lines should cross!
    theyCross = true
}

if (intersectionPath.op(path1, path2, Path.Op.INTERSECT)) {
    if (!intersectionPath.isEmpty) {
        // lines should cross!
        theyCross = true
    }
}

if (newRegion1.contains(50, 50)) {
    // lines should cross!
    theyCross = true
}

if (newRegion1.quickContains(49, 49, 51, 51)) {
    // lines should cross!
    theyCross = true
}

在此示例中,我没有使用Canvas,但是在我的原始代码中,我使用的是,每个路径都是由PaintstrokeWidth组成的。没运气。你们有没有遇到过这个?

1 个答案:

答案 0 :(得分:1)

仅当路径是曲面而不是直线时才有效,例如:

val clipArea = Region(0, 0, 100, 100)
val path1 = Path()
path1.moveTo(50f, 0f)
path1.lineTo(50f, 100f)
path1.lineTo(51f, 100f)
path1.lineTo(51f, 0f)
path1.close()

val path2 = Path()
path2.moveTo(0f, 50f)
path2.lineTo(100f, 50f)
path2.lineTo(100f, 51f)
path2.lineTo(0f, 51f)
path2.close()

通过newRegion1.setPath(path1, clipArea)的(忽略)返回值现在是真(非空)而不是假