'[]-------------------------[]
'|本模块包含数学的各种函数
'[]-------------------------[]
'[]-------------------------[]
'|/*********************************************************/
'[]-------------------------[]
Global Const PI = 3.14159265358979
'[]-------------------------[]
'|数学中的π
'[]-------------------------[]
'/*********************************************************/
'[]-------------------------[]
'|本函数还考虑一个矢量的辅角的特殊问题
'[]-------------------------[]
Public Function Angle(ByVal P1X As Double, ByVal P1Y As Double, ByVal P2X As Double, ByVal P2Y As Double) As Double
Dim temp As Double
If P1X = P2X Then
If P2Y > P1Y Then
temp = PI / 2
Else
temp = PI * 3 / 2
End If
Else
temp = MyAtn((P2Y - P1Y), (P2X - P1X + 0.0000001))
End If
If P1Y = P2Y Then
If P2X > P1X Then
temp = 0
Else
temp = PI
End If
Else
temp = MyAtn((P2Y - P1Y), (P2X - P1X + 0.0000001))
End If
Angle = temp
End Function
'/*********************************************************/
'[]-------------------------[]
'|本函数能正确计算两个矢量的夹角
'[]-------------------------[]
Public Function Angle_TT12(ByVal TT1 As Double, ByVal TT2 As Double) As Double
Dim tempt2 As Double
Dim temp As Double
tempt2 = TT2 - TT1
If tempt2 < 0 Then tempt2 = tempt2 + 2 * PI
If tempt2 > 2 * PI Then tempt2 = tempt2 - 2 * PI
If tempt2 > 0 And tempt2 < PI Then
temp = PI - tempt2
End If
If tempt2 > PI And tempt2 < 2 * PI Then
temp = tempt2 - PI
End If
Angle_TT12 = temp
End Function
'/*********************************************************/
'[]-------------------------[]
'|本函数能正确计算两个矢量的夹角
'[]-------------------------[]
Public Function Angle_TT23(ByVal TT2 As Double, ByVal TT3 As Double) As Double
Dim tempt3 As Double
Dim temp As Double
tempt3 = TT3 - TT2
If tempt3 < 0 Then tempt3 = tempt3 + 2 * PI
If tempt3 > 2 * PI Then tempt3 = tempt3 - 2 * PI
If tempt3 > PI And tempt3 < 2 * PI Then
temp = 2 * PI - tempt3
End If
If tempt3 > 0 And tempt3 < PI Then
temp = tempt3
End If
Angle_TT23 = temp
End Function
Public Function Angle_TT13(ByVal TT1 As Double, ByVal TT3 As Double) As Double
Dim tempt3 As Double
Dim temp As Double
tempt3 = TT3 - TT1
If tempt3 < 0 Then tempt3 = tempt3 + 2 * PI
If tempt3 > 2 * PI Then tempt3 = tempt3 - 2 * PI
If tempt3 > 0 And tempt3 < PI Then
temp = tempt3
End If
If tempt3 > PI And tempt3 < 2 * PI Then
temp = 2 * PI - tempt3
End If
Angle_TT13 = temp
End Function
AB,AC,BC是CLine,有起点(CPoint),角度,和长度(对于计算机必须有一个特定的长度,可以假设他很大)
For i = 0 To 1 // for( i = 0; i < 1; i++ )
AC.Angle = l1.Angle + i * PI //考虑到了正反方向+/-180度
For j = -1 To 1 Step 2 // for( j = -1; j < 2; j++ )
BC.Angle = l1.Angle + j * PI / 2 // BC垂直于AB,同样有两个方向
Angle1 = Angle_TT13(AB.Angle, AC.Angle)//求出夹角
Angle2 = Angle_TT12(AB.Angle, BC.Angle)
Angle3 = Angle_TT23(BC.Angle, AC.Angle)
If Abs((Angle1 + Angle2 + Angle3) - PI) < 0.01 Then
Exit For//得到圆心,直线起点,垂足的直角三角形
End If
Next j
If Abs((Angle1 + Angle2 + Angle3) - PI) < 0.01 Then
Exit For//得到圆心B,直线起点A,垂足C的直角三角形,因为是多层循环,所以又调用了一次
End If
Next i
BC.Length = AB.Length * Sin(Angle1) / Sin(Angle3)//得到垂线长度
If BC.Length > c1.r Then
temp = 0
End If
If abs( BC.Length - c1.r ) < 0.0001 Then
temp = 1
End If
If BC.Length < c1.r Then
temp = 2
End If
Preview_CL = temp
根据长度判断是否具有焦点
AB,AC,BC是CLine,有起点(CPoint),角度,和长度(对于计算机必须有一个特定的长度,可以假设他很大)
For i = 0 To 1 // for( i = 0; i < 1; i++ )
AC.Angle = l1.Angle + i * PI //考虑到了正反方向+/-180度
For j = -1 To 1 Step 2 // for( j = -1; j < 2; j++ )
BC.Angle = l1.Angle + j * PI / 2 // BC垂直于AB,同样有两个方向
Angle1 = Angle_TT13(AB.Angle, AC.Angle)//求出夹角
Angle2 = Angle_TT12(AB.Angle, BC.Angle)
Angle3 = Angle_TT23(BC.Angle, AC.Angle)
If Abs((Angle1 + Angle2 + Angle3) - PI) < 0.01 Then
Exit For//得到圆心,直线起点,垂足的直角三角形
End If
Next j
If Abs((Angle1 + Angle2 + Angle3) - PI) < 0.01 Then
Exit For//得到圆心B,直线起点A,垂足C的直角三角形,因为是多层循环,所以又调用了一次
End If
Next i
BC.Length = AB.Length * Sin(Angle1) / Sin(Angle3)//得到垂线长度
If BC.Length > c1.r Then
temp = 0
End If
If abs( BC.Length - c1.r ) < 0.0001 Then
temp = 1
End If
If BC.Length < c1.r Then
temp = 2
End If
Preview_CL = temp
根据长度判断是否具有焦点
这是我以前写的vb的程序
//这个求直线和圆的焦点
Public Function Circle_Line_Dot(ByVal c1 As CCIRCLE, ByVal l1 As CLINE, WhichOne As Boolean) As CPOINT
Dim i As Integer, j As Integer
Dim AB As New CLINE, AC As New CLINE, BC As New CLINE
Dim Angle1 As Double, Angle2 As Double, Angle3 As Double
Dim R1 As Double, R2 As Double
Dim JT As Double
Dim temp As New CPOINT
AB.Angle = Angle(c1.CX, c1.CY, l1.X, l1.Y)
AB.Length = Length(c1.CX, c1.CY, l1.X, l1.Y)
l1.Angle = l1.Angle - Int(l1.Angle / 2 / PI) * 2 * PI
If l1.Angle < 0 Then l1.Angle = l1.Angle + 2 * PI
If l1.Angle >= 2 * PI Then l1.Angle = l1.Angle - 2 * PI
If l1.Angle > PI Then l1.Angle = l1.Angle - PI
For i = 0 To 1
AC.Angle = l1.Angle + i * PI
For j = -1 To 1 Step 2
BC.Angle = l1.Angle + j * PI / 2
Angle1 = Angle_TT13(AB.Angle, AC.Angle)
Angle2 = Angle_TT12(AB.Angle, BC.Angle)
Angle3 = Angle_TT23(BC.Angle, AC.Angle)
If Abs((Angle1 + Angle2 + Angle3) - PI) < 0.01 Then
Exit For
End If
Next j
If Abs((Angle1 + Angle2 + Angle3) - PI) < 0.01 Then
Exit For
End If
Next i
BC.Length = AB.Length * Sin(Angle1) / Sin(Angle3)
R1 = BC.Length
R2 = Sqr(c1.r ^ 2 - R1 ^ 2)
If R1 > 0 Then
JT = Atn(R2 / R1)
ElseIf R1 = 0 Then
JT = PI / 2
End If
If WhichOne Then
temp.X = c1.CX + c1.r * Cos(BC.Angle - JT + PI)
temp.Y = c1.CY + c1.r * Sin(BC.Angle - JT + PI)
Else
temp.X = c1.CX + c1.r * Cos(BC.Angle + JT - PI)
temp.Y = c1.CY + c1.r * Sin(BC.Angle + JT - PI)
End If
Set Circle_Line_Dot = temp
End Function
//这个求直线与圆相交部分的中点
Public Function Circle_Line_Inter(c1 As CCIRCLE, l1 As CLINE) As CPOINT
Dim i As Integer, j As Integer
Dim AB As New CLINE, AC As New CLINE, BC As New CLINE
Dim Angle1 As Double, Angle2 As Double, Angle3 As Double
Dim temp As New CPOINT
AB.Angle = Angle(c1.CX, c1.CY, l1.X, l1.Y)
AB.Length = Length(c1.CX, c1.CY, l1.X, l1.Y)
If l1.Angle < 0 Then l1.Angle = l1.Angle + 2 * PI
If l1.Angle >= 2 * PI Then l1.Angle = l1.Angle - 2 * PI
If l1.Angle > PI Then l1.Angle = l1.Angle - PI
For i = 0 To 1
AC.Angle = l1.Angle + i * PI
For j = -1 To 1 Step 2
BC.Angle = l1.Angle + j * PI / 2
Angle1 = Angle_TT13(AB.Angle, AC.Angle)
Angle2 = Angle_TT12(AB.Angle, BC.Angle)
Angle3 = Angle_TT23(BC.Angle, AC.Angle)
If Abs((Angle1 + Angle2 + Angle3) - PI) < 0.01 Then
Exit For
End If
Next j
If Abs((Angle1 + Angle2 + Angle3) - PI) < 0.01 Then
Exit For
End If
Next i
BC.Length = AB.Length * Sin(Angle1) / Sin(Angle3)
temp.X = c1.CX + BC.Length * Cos(BC.Angle + PI)
temp.Y = c1.CY + BC.Length * Sin(BC.Angle + PI)
Set Circle_Line_Inter = temp
End Function
//这个预览直线和圆有几个焦点
Public Function Preview_CL(ByVal c1 As CCIRCLE, ByVal l1 As CLINE) As Integer
Dim i As Integer, j As Integer
Dim AB As New CLINE, AC As New CLINE, BC As New CLINE
Dim Angle1 As Double, Angle2 As Double, Angle3 As Double
Dim temp As Integer
For i = 0 To 1
AC.Angle = l1.Angle + i * PI
For j = -1 To 1 Step 2
BC.Angle = l1.Angle + j * PI / 2
Angle1 = Angle_TT13(AB.Angle, AC.Angle)
Angle2 = Angle_TT12(AB.Angle, BC.Angle)
Angle3 = Angle_TT23(BC.Angle, AC.Angle)
If Abs((Angle1 + Angle2 + Angle3) - PI) < 0.01 Then
Exit For
End If
Next j
If Abs((Angle1 + Angle2 + Angle3) - PI) < 0.01 Then
Exit For
End If
Next i
BC.Length = AB.Length * Sin(Angle1) / Sin(Angle3)
If BC.Length > c1.r Then
temp = 0
End If
If BC.Length = c1.r Then
temp = 1
End If
If BC.Length < c1.r Then
temp = 2
End If
Preview_CL = temp
End Function