Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查两条线是否相交

检查两条线是否相交
EN

Stack Overflow用户
提问于 2018-10-10 18:25:34
回答 3查看 1.4K关注 0票数 0

我要检查两条线是否相交。这些当前被包裹在边缘对撞器中。

在我的最小示例中,我使用了Collider2D.OverlapsCollider

代码语言:javascript
运行
AI代码解释
复制
public class EdgeColliderChecker : MonoBehaviour
{
    public EdgeCollider2D e1;
    public EdgeCollider2D e2;

    void Update () {
        Collider2D[] results1 = new Collider2D[1];
        e1.OverlapCollider(new ContactFilter2D(), results1);
        if (results1[0] != null)
        {
            Debug.Log(results1[0].name);
        }

        Collider2D[] results2 = new Collider2D[1];
        e1.OverlapCollider(new ContactFilter2D(), results2);
        if (results2[0] != null) {
            Debug.Log(results2[0].name);
        }
    }
}

这是我设置场景的方式:

正如你在上面的图片中看到的,这两条线显然是相交的。

问题是没有任何东西输出到控制台。

我不是百分之百确定ContactFilter应该如何配置,但看看文档,它是用来过滤结果的。因此,将其保留为空应该包括所有内容。

我真的只需要在两行之间进行检查。因此,将它们作为参数并返回指示交集的布尔值的函数将是最方便的。不幸的是,我在Unity中找不到这样的函数。

我自己构造函数应该不会太复杂,但我更喜欢使用unity提供的函数。因此,与其说这是一个与数学有关的问题,不如说是一个与统一性有关的问题。

编辑:

使用Collider2D.IsTouching(Collider2D)似乎也不起作用。我使用与前面相同的设置来代替下面的代码:

代码语言:javascript
运行
AI代码解释
复制
public class EdgeColliderChecker : MonoBehaviour
{
    public EdgeCollider2D e1;
    public EdgeCollider2D e2;

    void Update () {
        if (e1.IsTouching(e2)) {
            Debug.Log("INTERSECTION");
        }
    }
}

编辑2:

为此,我尝试创建自己的方法:

代码语言:javascript
运行
AI代码解释
复制
public static class EdgeColliderExtentions {
    public static List<Collider2D> GetInterSections(this EdgeCollider2D collider)
    {
        List<Collider2D> intersections = new List<Collider2D>();
        Vector2[] points = collider.points;
        for (int i = 0; i < points.Length - 1; i++)
        {
            Vector2 curr = collider.transform.TransformPoint(points[i]);
            Vector2 next = collider.transform.TransformPoint(points[i + 1]);
            Vector2 diff = next - curr;

            Vector2 dir = diff.normalized;

            float distance = diff.magnitude;

            RaycastHit2D[] results = new RaycastHit2D[30];
            ContactFilter2D filter = new ContactFilter2D();

            Debug.DrawLine(curr, curr + dir * distance, Color.red, 1 / 60f);

            int hits = Physics2D.Raycast(curr, dir, filter, results, distance);

            for (int j = 0; i < hits; i++)
            {
                Collider2D intersection = results[j].collider;
                if (intersection != collider)
                {
                    intersections.Add(intersection);
                }
            }
        }
        return intersections;
    }
}

EdgeColliderChecker

代码语言:javascript
运行
AI代码解释
复制
public class EdgeColliderChecker : MonoBehaviour
{
    public EdgeCollider2D e1;

    void Update ()
    {
        List<Collider2D> hits = e1.GetInterSections();
        if (hits.Count > 0) {
            Debug.Log(hits.Count);
        }
    }
}

还是一无所获。即使我计算的点与对撞机完全一致:

我为它做了数学计算,它似乎工作得很好,但测试不是很彻底。如果交叉点检查是在碰撞机四处移动时运行的,则交叉点检查会有一点起伏:

代码语言:javascript
运行
AI代码解释
复制
public class Line {
    private Vector2 start;
    private Vector2 end;

    public Line(Vector2 start, Vector2 end)
    {
        this.start = start;
        this.end = end;
    }

    public static Vector2 GetIntersectionPoint(Line a, Line b)
    {
        //y = kx + m;
        //k = (y2 - y1) / (x2 - x1)
        float kA = (a.end.y - a.start.y) / (a.end.x - a.start.x);
        float kB = (b.end.y - b.start.y) / (b.end.x - b.start.x);

        //m = y - k * x
        float mA = a.start.y - kA * a.start.x;
        float mB = b.start.y - kB * b.start.x;

        float x = (mB - mA) / (kA - kB);
        float y = kA * x + mA;
        return new Vector2(x,y);
    }

    public static bool Intersects(Line a, Line b)
    {
        Vector2 intersect = GetIntersectionPoint(a, b);            

        if (Vector2.Distance(a.start, intersect) < Vector2.Distance(a.start, a.end) &&
            Vector2.Distance(a.end, intersect) < Vector2.Distance(a.start, a.end))
        {
            return true;
        }
        return false;
    }
}

public static class EdgeColliderExtentions
{
    public static bool Intersects(this EdgeCollider2D collider, EdgeCollider2D other)
    {
        Vector2[] points = collider.points;
        Vector2[] otherPoints = other.points;
        for (int i = 0; i < points.Length - 1; i++)
        {
            Vector2 start = collider.transform.TransformPoint(points[i]);
            Vector2 end = collider.transform.TransformPoint(points[i + 1]);
            Line line = new Line(start, end);
            for (int j = 0; j < otherPoints.Length - 1; j++)
            {
                Vector2 otherStart = other.transform.TransformPoint(otherPoints[i]);
                Vector2 otherEnd = other.transform.TransformPoint(otherPoints[i + 1]);
                Line otherLine = new Line(otherStart, otherEnd);
                if (Line.Intersects(line, otherLine))
                {
                    return true;
                }
            }
        }
        return false;
    }
}

但是我真的很想用unity提供的东西来代替。

EN

回答 3

Stack Overflow用户

发布于 2018-10-10 18:41:28

使用Collider.bounds.Intersects(Collider.bounds)确定两个边界是否相交:

代码语言:javascript
运行
AI代码解释
复制
void Update () {
    if (e1.bounds.Intersects(e2.bounds)) {
        Debug.Log("Bounds intersecting");
    }
}

不幸的是,这不会让你知道边缘是否相交。但是,如果测试结果为假,则可以跳过边缘测试。

票数 1
EN

Stack Overflow用户

发布于 2018-10-11 22:52:05

我意识到我可以根据我的用例将其中一个边缘对撞器交换为多边形对撞器。

Collider2D.OverlapsCollider()中使用多边形和边碰撞器可以按预期工作。

我不知道我是否应该接受这个答案,因为它没有解决最初的问题,即在单位中寻找直线相交的函数。

票数 1
EN

Stack Overflow用户

发布于 2018-10-12 06:01:36

您可以使用以下内容获得相对接近的近似结果:

你可以创建一个脚本,沿着这条线均匀地添加几个小盒子碰撞器,越多越好。然后进行正常的碰撞检测。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52746588

复制
相关文章
几何算法:判断两条线段是否相交
一条线段两个点,可以列出一个两点式(x - x1) / (x2 - x1) = (y - y1) / (y2 - y1)),两条线段是两个两点式,这样就是 二元一次方程组 了 ,就能求出两条直线的交点。
前端西瓜哥
2023/08/18
9940
几何算法:判断两条线段是否相交
leetcode之判断路径是否相交
这里维护走过的点,然后遍历path的字符,对x,y坐标进行相应移动,每次移动之后都判断下该点是否走过,走过则返回true,没有则将改点记录到走过的的点中,遍历完都没有符合条件就返回false。
code4it
2020/11/07
6340
leetcode之判断路径是否相交
leetcode之判断路径是否相交
这里维护走过的点,然后遍历path的字符,对x,y坐标进行相应移动,每次移动之后都判断下该点是否走过,走过则返回true,没有则将改点记录到走过的的点中,遍历完都没有符合条件就返回false。
code4it
2020/11/17
5760
unity3d:两条线段相交并求交点坐标
外积,又称叉积,是向量代数(解析几何)中的一个概念。两个向量v1(x1, y1)和v2(x2, y2)的外积v1×v2=x1y2-y1x2。如果由v1到v2是顺时针转动,外积为负,反之为正,为0表示二者方向相同(平行)。
立羽
2023/08/24
6370
unity3d:两条线段相交并求交点坐标
关于判断两个矩形是否相交
最近在做WEB前端项目时,需要识别一个元素是否有某些部位出现在可视区域内,当有某个部位出现在可视区域时,就执行该元素绑定的动画,如果完全不在可视区域内则移除其动画,当再次出现时重复执行动画。
Yiiven
2022/12/15
2.5K0
关于判断两个矩形是否相交
js检查日期是否合法
检查日期是否合法 <script> function CheckDateTime(str) { var reg = /^(\d+)-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/; var r = str.match(reg); if (r == null) return false; r[2] = r[2] - 1; var d = new Date(r[
江一铭
2022/06/16
6.7K0
js检查是否是数组
该方法兼容Chrome 5, Firefox 4.0, IE 9, Opera 10.5 和 Safari 5,详细兼容性,可以查阅这篇文章。
IT工作者
2022/01/27
3.6K0
JS检查是否支持Storage
查看效果:http://hovertree.com/code/html5/q69kvsi6.htm
全栈程序员站长
2022/07/15
3K0
JavaScript 检查是否是数字
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/109551.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/05
1.2K0
平面中判断线段与矩形是否相交
那么关键就在于两个子算法:判断点在矩形内和判断线段相交。判断点在矩形内非常简单,就是比较点是否在矩形的四至范围就可以了;而判断线段相交可以参考《空间或平面判断两线段相交(求交点)》这篇文章。
charlee44
2021/06/21
3.1K0
判断两个矩形是否相交(Rect Intersection)
最近在开发一个2D组态图形组件的过程中,里面的数学模块,涉及到两个矩形是否相交的判断。
用户3158888
2023/07/09
6040
判断两个矩形是否相交(Rect Intersection)
python 检查是否存在ddos攻击
import dpkt import socket import optparse
用户5760343
2019/07/31
3.9K0
python 检查是否存在ddos攻击
php-检查网站是否宕机
浏览量 2 <?php $url="http://www.google.com"; $agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT
kdyonly
2023/03/03
1.7K0
Kettle之“检查表是否存在”
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/53884107
用户1148526
2019/05/25
4K0
检测系统是否为检查版本(Checked)
<<Windows internals 5th editon>> page 48.
obaby
2023/02/28
2.3K0
检测系统是否为检查版本(Checked)
检查评论者是否有Gravatar头像
今天Angel来了,同时为风风找到了一个评论方面的BUG——游客身份若使用的邮箱没有Gravatar头像就不能发评论,这对于一些有特殊需要的朋友来说可能算不上BUG,但却不是我的需求,之后发现是comments-ajax.php文件中的以下代码在起作用:
WindCoder
2018/09/20
9950
Python脚本检查TCP端口是否正常
#!/usr/bin/python import socket import re import sys def check_server(address,port): s = socket.socket() print "Attempting to connect to %s on port %s" % (address,port) try: s.connect((address,port)) print "Connected to %s on port %s" % (address,port) retu
院长技术
2021/02/19
1.7K0
LeetCode 5448. 判断路径是否相交(195周赛)
给你一个字符串 path,其中 path[i] 的值可以是 'N'、'S'、'E' 或者 'W',分别表示向北、向南、向东、向西移动一个单位。
freesan44
2020/06/29
3550
shell脚本 检查文件是否被修改
1.进行检测目录的添加,可以多个目录 2.添加定时任务,可以一分钟一次,有改动会输出改动情况 #!/bin/bash #2020-3-14 #监测文件是否被修改脚本 #监测目录 dir_file=(/etc) file_list=/usr/local/file_list.txt error_file=/usr/local/error_list.txt display_path() { for i in `ls` do if [[ -d $i ]];then             cd $i    
陈不成i
2021/06/23
2.3K0
检查Android是否具有摄像头
通常我们进行摄像头操作,如扫描二维码需要判断是否有后置摄像头(Rear camera),比如Nexus 7 一代就没有后置摄像头,这样在尝试使用的时候,我们需要进行判断进行一些提示或者处理。
技术小黑屋
2018/09/04
1.1K0

相似问题

如何检查两条线段是否相交?

23

如何检查用户绘制的两条线是否相交?

21

找出两条线是否相交

24

找出两条线段是否相交

10

确定两条线是否相交

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档