C# 计算两条线段交点的位置

本文介绍了如何通过两点式直线方程来确定两条线段的交点,并提供了具体的数学推导过程及判断交点是否在线段范围内的方法。

 

线段A,和线段B,直接求得AB的交点坐标,然后再判断该交点坐标是否在定长线段B的内部就可以了啊 

    AB本身就是两条直线,知道两端点就可以知道其直线方程,B也是一样,两个方程联立,
    得到一个坐标,再看该坐标是否在B的定义域内就可以啊 

 

首先,我们指定直线方程都有:

 

1:一般式:Ax+By+C=0(A、B不同时为0)【适用于所有直线】

A1/A2=B1/B2≠C1/C2←→两直线平行

A1/A2=B1/B2=C1/C2←→两直线重合

横截距a=-C/A

纵截距b=-C/B
 

2:点斜式:y-y0=k(x-x0) 【适用于不垂直于x轴的直线

表示斜率为k,且过(x0,y0)的直线
 

3:截距式:x/a+y/b=1【适用于不过原点或不垂直于x轴、y轴的直线】

表示与x轴、y轴相交,且x轴截距为a,y轴截距为b的直线
 

4:斜截式:y=kx+b【适用于不垂直于x轴的直线
 

表示斜率为k且y轴截距为b的直线

5:两点式:【适用于不垂直于x轴、y轴的直线】

表示过(x1,y1)和(x2,y2)的直线 

两点式两点式

(y-y1)/(y2-y1)=(x-x1)/(x2-x1) (x1≠x2,y1≠y2)
 

6:交点式:f1(x,y) *m+f2(x,y)=0 【适用于任何直线】

表示过直线f1(x,y)=0与直线f2(x,y)=0的交点的直线
 

7:点平式:f(x,y) -f(x0,y0)=0【适用于任何直线】

表示过点(x0,y0)且与直线f(x,y)=0平行的直线
 

法线式法线式

8:法线式:x·cosα+ysinα-p=0【适用于不平行于坐标轴的直线】

过原点向直线做一条的垂线段,该垂线段所在直线的倾斜角为α,p是该线段的长度
 

9:点向式(x-x0)/u=(y-y0)/v (u≠0,v≠0)【适用于任何直线】

表示过点(x0,y0)且方向向量为(u,v )的直线
 

10:法向式:a(x-x0)+b(y-y0)=0【适用于任何直线】

表示过点(x0,y0)且与向量(a,b)垂直的直线


 

此处我们使用的是两点式:

 

    A的两点为(x1,y1),(x2,y2)
    则A的直线方程为l1:y-y1=(y2-y1)(x-x1)/(x2-x1)

    B的两点为(x3,y3),(x4,y4)
    则B的直线方程为l2:y-y3=(y4-y3)(x-x3)/(x4-x3)

    
    联立解出交点坐标为的横坐标为:
    x=(k2x3-y3-k1x1+y1)/(k2-k1)
    其中k1=(y2-y1)/(x2-x1)
          k2=(y4-y3)/(x4-x3)    
    可以推导出来
    x = ((x2 - x1) * (x3 - x4) * (y3 - y1) - 
            x3 * (x2 - x1) * (y3 - y4) + x1 * (y2 - y1) * (x3 - x4)) / 
            ((y2 - y1) * (x3 - x4) - (x2 - x1) * (y3 - y4));

    同理也可以推导出y的值:

    y = ((y2 - y1) * (y3 - y4) * (x3 - x1) - 
            y3 * (y2 - y1) * (x3 - x4) + y1 * (x2 - x1) * (y3 - y4)) / 
            ((y2 - y1) * (y3 - y4) - (y2 - y1) * (x3 - x4));

 

此处即是计算角点的程序:

 

 /// <summary>
    /// 计算多边形的边与直线之间是否相交。相交则碰撞
    /// </summary>
    /// <param name="a">/线段A为的起点</param>
    /// <param name="b">线段A为的终点</param>
    /// <param name="c">线段B的起点</param>
    /// <param name="d">线段B的终点</param>
    /// 
    void IntersectionPoint(Vector3 a,Vector3 b, Vector3 c, Vector3 d)
    {
        if ( ( (c.x < orthogon_B_x && d.x > orthogon_A_x) || (d.x < orthogon_B_x && c.x > orthogon_A_x ) )  &&  ((c.y < orthogon_B_y && d.y > orthogon_A_y) || (d.y < orthogon_B_y && c.y > orthogon_A_y)) )
        {
            Vector3 Intersection = new Vector3();
            Intersection.x = ((a.x - b.x) * (c.x * d.z - d.x * c.z) - (c.x - d.x) * (a.x * b.z - b.x * a.z)) / ((c.x - d.x) * (a.z - b.z) - (a.x - b.x) * (c.z - d.z));

            Intersection.z = ((a.z - b.z) * (c.x * d.z - d.x * c.z) - (c.z - d.z) * (a.x * b.z - b.x * a.z)) / ((c.x - d.x) * (a.z - b.z) - (a.x - b.x) * (c.z - d.z));

            Intersection.y = orthogon_B.y;

            if (Intersection.z < orthogon_A_z && Intersection.z >= orthogon_B_z)   //一重判断,如何目标对象的Z轴在两个基站之间
            {
               
                middleObj.transform.position = Intersection;
                Debug.Log(Intersection);
                 
            }
        }
    }

 

 

 

 

 

C#计算两条直线交点处的角度需要一些几何知识和数学运算。为了简化说明,我们假设这两条线段已经相交,并且我们知道它们的位置以及方向向量。 ### 步骤概述 1. **找到两直线的方向向量** 如果你知道两点确定一条直线,则可以很容易地通过减去这两个点得到一个方向向量 \( \vec{v} = P_2 - P_1 \) ,其中\(P_1\) 和 \(P_2\) 分别代表直线上任意两个连续的点。 2. **标准化向量(单位化)** 将每个方向向量转换成长度为1的单位向量,以便于后续角度计算。公式如下: \[ \hat{\mathbf v_i}= {\frac { \mathbf v_{i}}{| \mathbf v| }}\] 这里 |\(\mathbf v|\)| 表示取模长即解该矢量的距离值。 3. **应用内积公式获取夹角余弦** 利用向量之间的内积(点乘),我们可以获得两者之间夹角θ 的余弦值得出其大小范围从0到π弧度;然后将其转化为实际角度表示形式: 设\(\theta=\arccos (\hat{\mathbf u}\cdot \hat{\mathbf v})\) 4. **将结果调整至 [0°, 180°] 区间** 注意上述方法仅能提供锐角部分的结果,在某些情况下你需要根据实际情况判断是否应该补充剩余的部分构成钝角。 5. **编写相应代码实现此功能** 下面是一个简单的例子用于演示如何基于以上步骤创建这样一个函数来返回给定输入数据后的输出: ```csharp using System; public class LineIntersectionAngle { public static double GetAngle(Vector aDirVec, Vector bDirVec){ // Normalize vectors first. var normA = new Vector(aDirVec.X / Math.Sqrt(Math.Pow(aDirVec.X, 2)+Math.Pow(aDirVec.Y, 2)), aDirVec.Y / Math.Sqrt(Math.Pow(aDirVec.X, 2)+Math.Pow(aDirVec.Y, 2))); var normB = new Vector(bDirVec.X / Math.Sqrt(Math.Pow(bDirVec.X, 2)+Math.Pow(bDirVec.Y, 2)), bDirVec.Y / Math.Sqrt(Math.Pow(bDirVec.X, 2)+Math.Pow(bDirVec.Y, 2))); // Calculate the dot product between normalized direction vectors. double dotProduct = (normA.X * normB.X + normA.Y * normB.Y); if(dotProduct > 1) dotProduct = 1; else if(dotProduct < -1) dotProduct = -1; return ToDegrees(Math.Acos(dotProduct)); } private static double ToDegrees(double angleRadians){ return angleRadians*(180/Math.PI); } } ``` 请注意这只是一个基础版本的功能实现,具体使用时还需要考虑更多边界条件如平行线等特殊情况处理逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值