首页 > 其他分享 >unity中, 二维平面上,求从点A出发,沿着方向B,与线段C的交点

unity中, 二维平面上,求从点A出发,沿着方向B,与线段C的交点

时间:2024-08-14 10:40:39浏览次数:12  
标签:线段 从点 unity 交点 C2 C1 null Vector2

代码说明:

  • 点A:起始点。
  • 方向B:一个方向向量,表示从点A出发的方向。
  • 线段C:由两个点C1和C2定义。
 1 using UnityEngine;
 2 
 3 public class LineIntersection : MonoBehaviour
 4 {
 5     // 返回从点A出发,沿着方向B,与线段C的交点。如果没有交点,则返回null
 6     public static Vector2? GetIntersection(Vector2 A, Vector2 B, Vector2 C1, Vector2 C2)
 7     {
 8         // 方向向量
 9         Vector2 dirAB = B.normalized;  // 方向B是一个向量
10         Vector2 dirC = C2 - C1;
11 
12         // 定义线段C的法向量
13         Vector2 normalC = new Vector2(-dirC.y, dirC.x);
14 
15         // 计算AB与线段C的方向向量夹角的cos值(点积)
16         float denominator = Vector2.Dot(dirAB, normalC);
17         if (Mathf.Abs(denominator) < 1e-6)
18         {
19             // AB和线段C平行,没有交点
20             return null;
21         }
22 
23         // 计算参数t, t表示从A沿方向B移动到交点的比例
24         float t = Vector2.Dot(C1 - A, normalC) / denominator;
25 
26         if (t < 0)
27         {
28             // 交点在A的反方向,不考虑
29             return null;
30         }
31 
32         // 计算交点P
33         Vector2 P = A + t * dirAB;
34 
35         // 检查P是否在线段C上
36         float crossProduct = (P.x - C1.x) * (C2.y - C1.y) - (P.y - C1.y) * (C2.x - C1.x);
37         if (Mathf.Abs(crossProduct) > 1e-6)
38         {
39             // P不在线段C上
40             return null;
41         }
42 
43         float dotProduct = Vector2.Dot(P - C1, C2 - C1);
44         if (dotProduct < 0 || dotProduct > Vector2.Dot(C2 - C1, C2 - C1))
45         {
46             // P在延长线上,但不在线段C上
47             return null;
48         }
49 
50         return P;
51     }
52 }

 

使用方法:

调用GetIntersection函数来获取交点:

Vector2 A = new Vector2(0, 0);
Vector2 B = new Vector2(1, 1);
Vector2 C1 = new Vector2(1, 0);
Vector2 C2 = new Vector2(0, 1);

Vector2? intersection = LineIntersection.GetIntersection(A, B, C1, C2);

if (intersection != null)
{
    Debug.Log("Intersection Point: " + intersection.Value);
}
else
{
    Debug.Log("No Intersection.");
}

这段代码会找到从点A沿着方向B与线段C的交点,并在控制台输出交点的坐标。如果没有交点,则输出“没有交点”。

标签:线段,从点,unity,交点,C2,C1,null,Vector2
From: https://www.cnblogs.com/zerozabuu/p/18358390

相关文章

  • 可持久化线段————主席树(洛谷p3834)
    洛谷P3834可持久化线段树2问题描述:给定n各整数构成的序列,求指定区间[L,R]内的第k小值(求升序排序后从左往右数第k个整数的数值)输入:第一行输入两个整数n,m,分别代表序列长度n和对序列的m次查询;第二行输入n个整数,表示序列的n个整数;之后的m行,每行输入3个整数L,R,k,表示查询......
  • Unity中利用遗传算法训练MLP
    Unity中利用遗传算法训练MLP梯度下降法训练神经网络通常需要我们给定训练的输入-输出数据,而用遗传算法会便捷很多,它不需要我们给定好数据,只需要随机化多个权重进行N次“繁衍进化”,就可以得出效果不错的网络。这种训练方式的好处就是不需要训练用的预期输出数据,适合那类可以简单......
  • 在Unity中开发MQTT客户端
    概述:        在Unity环境中使用MQTTnet库(一个流行的.NET库,用于实现MQTT客户端和服务器。它支持.NETCore和.NETFramework,并提供了灵活的API以及高性能的实现)搭建自己的MQTT客户端.我使用的版本:Version=4.3.6.1152        但是在开发客户端之前,你需要......
  • 线段树
    模板记得开4倍空间!!!Code#include<bits/stdc++.h>#definelllonglong#definepfprintf#definesfscanfusingnamespacestd;constintN=1e5+7;inttr[N*4];intf[N*4];inta[N];intn,q;intl,r,val;voidbuild(intu,intl,intr){ if(l==r){ tr[u]=a......
  • 【Unity精品插件】Odin Inspector and Serializer:提升开发效率的利器
    概述OdinInspectorandSerializer是UnityAssetStore上的一款备受好评的工具,专为Unity开发者设计,以提供更强大的属性检查器和序列化功能。自推出以来,它已经获得了超过11,000个五星级评价,并且被85,000多名客户所认可。功能特点1.轻松集成:Odin很容易操作,并且不会打......
  • unity2022.3.9+Pico更换渲染管线后打包,人物材质不可显示问题
    为了解决字体和场景闪烁问题吗,更换渲染管线旧项目管线是URP 新的项目管线是内置管线buildin()  内置管线需要设置两个地方,可以解决人物材质不显示问题1.PICO-StereoRenderingMode选择 MultiPass模式 2,Player-OtherSetting-AutoGraphicsAPI勾选(注:项目中有......
  • 【笔记】吉如一线段树
    【笔记】吉如一线段树吉如一论文(CQBZ内网,在PDF的103页1区间最值操作1.1区间取min(max),区间和当前应该修改值为\(x\);维护区间最大值\(mx\),最大值个数\(t\),严格次大值\(se\)。如果走到一个区间上,如果:\(x\gemx\),说明取min操作没用,直接return;\(mx>x>se\),打标......
  • 李超线段树板子
    点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+5;constintmod=1e9;constintp=39989;constdoubleeps=1e-9;intn,m;intans,ansid;inttcnt,rt;structlmy{ doublek,b;}a[N];structTree{ intls,rs,id;}tr[N];boolc......
  • 【笔记】传统势能线段树
    1引入传统线段树能够通过打标记实现区间修改的条件有两个:能够快速处理标记对区间询问结果的影响;能够快速实现标记的合并。有的区间修改不满足上面两个条件。但存在一些奇妙的性质,使得序列每个元素被修改的次数有一个上限。如果我们保证每暴力\(O(\logn)\)修改一次的时......
  • 线段树进阶 Part 1
    线段树是信息学竞赛最常见的数据结构。本篇笔记总结技巧和应用,不介绍基本线段树算法。1.常见技巧1.1信息设计用线段树解决问题,首先得考虑维护哪些信息。若不带修,任何满足结合律且封闭的信息(称为半群)都是可维护的。结合律一般都有,封闭性帮助我们设计信息。例如区间最大子段......