-
Notifications
You must be signed in to change notification settings - Fork 0
/
line segment
140 lines (132 loc) · 5.24 KB
/
line segment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/// <summary>
/// 判定某点是否在线段上
/// </summary>
/// <param name="lineStart"></param>
/// <param name="lineEnd"></param>
/// <param name="midPoint"></param>
/// <returns></returns>
public static bool IsPointOnLine(Vector3 lineStart,Vector3 lineEnd,Vector3 midPoint)
{
//if (midPoint.x == lineStart.x || midPoint.x == lineEnd.x)
//{
//}
//if (midPoint.x >= Mathf.Min(lineStart.x, lineEnd.x) && midPoint.x <= Mathf.Max(lineStart.x, lineEnd.x))
//{
// if ((midPoint.z - lineStart.z) / (midPoint.x - lineStart.x) == ((midPoint.z - lineEnd.z) / (midPoint.x - lineEnd.x)))
// {
// return true;
// }
//}
float StartToEnd =Mathf.Sqrt((lineEnd.x - lineStart.x) * (lineEnd.x - lineStart.x) + (lineEnd.z - lineStart.z)*(lineEnd.z - lineStart.z));
float StartToMid = Mathf.Sqrt((midPoint.x - lineStart.x) * (midPoint.x - lineStart.x) + (midPoint.z - lineStart.z) * (midPoint.z - lineStart.z));
float MidToEnd = Mathf.Sqrt((lineEnd.x - midPoint.x) * (lineEnd.x - midPoint.x) + (lineEnd.z - midPoint.z) * (lineEnd.z - midPoint.z));
if (StartToEnd == StartToMid + MidToEnd)
return true;
return false;
}
/// <summary>
/// 根据两条线段端点判断是否相交
/// </summary>
/// <param name="pointAStart"></param>
/// <param name="pointAEnd"></param>
/// <param name="pointBStart"></param>
/// <param name="pointBEnd"></param>
/// <returns></returns>
public static bool IsInterSect(Vector3 lineAStart,Vector3 lineAEnd,Vector3 lineBStart,Vector3 lineBEnd)
{
#region 特例太多
//求斜率 暴力点
float k1;
float k2;
float b1;
float b2;
//特殊情况 斜率正无穷
if (lineAEnd.x == lineAStart.x|| lineBEnd.x == lineBStart.x)
{
if (lineAEnd.x == lineAStart.x&&lineBEnd.x == lineBStart.x)//巧了,平行
{
if (lineAStart.x == lineBStart.x)//更巧了,直线重合
{
//判断线段是否重合
if ((Mathf.Max(lineAStart.z, lineAEnd.z) >= Mathf.Min(lineBStart.z, lineBEnd.z)) && (Mathf.Min(lineAStart.z, lineAEnd.z) <= Mathf.Max(lineBStart.z, lineBEnd.z)))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
if (lineAEnd.x == lineAStart.x)
{
k2 = (lineBEnd.z - lineBStart.z) / (lineBEnd.x - lineBStart.x);
b2 = lineBStart.z - k2 * lineBStart.x;
float z2 = k2 * lineAEnd.x + b2;
if (z2 < Mathf.Max(lineBStart.z, lineBEnd.z) && z2 > Mathf.Min(lineBStart.z, lineBEnd.z) && z2 < Mathf.Max(lineAStart.z, lineAEnd.z) && z2 > Mathf.Min(lineAStart.z, lineAEnd.z))
{
return true;
}
else
{
return false;
}
}else if (lineBEnd.x == lineBStart.x)
{
k1 = (lineAEnd.z - lineAStart.z) / (lineAEnd.x - lineAStart.x);
b1 = lineAStart.z - k1 * lineAStart.x;
float z1= k1 * lineBEnd.x + b1;
if (z1 < Mathf.Max(lineBStart.z, lineBEnd.z) && z1 > Mathf.Min(lineBStart.z, lineBEnd.z) && z1 < Mathf.Max(lineAStart.z, lineAEnd.z) && z1 > Mathf.Min(lineAStart.z, lineAEnd.z))
{
return true;
}
else
{
return false;
}
}
}
}
//斜率存在情况
k1 = (lineAEnd.z - lineAStart.z) / (lineAEnd.x - lineAStart.x);
k2 = (lineBEnd.z - lineBStart.z) / (lineBEnd.x - lineBStart.x);
b1 = lineAStart.z - k1 * lineAStart.x;
b2 = lineBStart.z - k2 * lineBStart.x;
if (k1 == k2)//平行
{
if (b1 != b2)
{
return false;//平行不重合
}
else
{
if (Mathf.Max(lineAStart.x, lineAEnd.x) >= Mathf.Min(lineBStart.x, lineBEnd.x) && Mathf.Min(lineAStart.x, lineAEnd.x) <= Mathf.Max(lineBStart.x, lineBEnd.x))
{
return true;//重合
}
else
{
return false;
}
}
}
else//有交点
{
float interSectX = (b2 - b1) / (k1 - k2);
if (interSectX <= Mathf.Max(lineAStart.x, lineAEnd.x) && interSectX >= Mathf.Min(lineAStart.x, lineAEnd.x)&&
interSectX<=Mathf.Max(lineBStart.x,lineBEnd.x)&&interSectX>=Mathf.Min(lineBStart.x,lineBEnd.x))//交点在线段上
{
return true;
}
else
{
return false;
}
}
}