【问题标题】:Intersection of two paths or a path and a point never returns true两条路径或一条路径与一个点的交集永远不会返回 true
【发布时间】:2019-05-08 05:56:39
【问题描述】:

我遇到了thisthis 的问题,都是关于 Android 中的检测交叉点的问题。好吧,我无法让它们与最终代码一起工作,所以我做了一个例子,其中 2 行肯定相交。在那种情况下甚至没有运气。我制作了一个示例代码,其中包含两条直线路径、适合它们的区域以及一个绝对穿过它的点。完全不走运。

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 组成。没有运气。你们中有人遇到过这种情况吗?

【问题讨论】:

    标签: android kotlin android-canvas


    【解决方案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) 的(忽略的)返回值现在是 true(非空)而不是 false

    【讨论】:

    • 太棒了,谢谢!现在,我必须找到一种方法将复杂的、用户制作的路径转换为封闭路径! 我仍然想知道为什么需要一个区域,如果它实际上是无用的(老实说,我认为使用区域是实际上将路径转换为表面!)
    • 提醒一下,在我尝试了复杂的Paths 和一个 3x3 像素的矩形(由封闭的Path 制成)之后,结果发现它与路径相交,就好像它们是封闭的(因此,它将与曲线的内部相交,但不会与外部相交!)。在此之后,很明显我之前的评论和你的答案是答案。
    • @Korcholis 你能解释一下它是如何工作的吗?你有复杂路径的代码示例吗?
    • 嘿@VadimEksler,我没有代码了,但据我记得,在获得点列表后,我刚刚创建了一个列表副本,其中一个维度添加了 1 个像素并将其反向添加到图纸列表中。类似于 A, B, C, D, D(-1), C(-1), B(-1), A(-1) 。这样,您将创建一个非常细的封闭路径(只有一个像素高或宽),用户很难感知(尤其是当 strokeWidth 大于 1 个像素时)。那么这只是close()ing 路径的问题。
    • @Korcholis tnx 但这种方法完全可以检测相交
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多