On Dec 19, 11:36 pm, "James A. Fortune"
wrote:
boolSuccess = GetXY(dblA, dblB, CDbl(Theta + DeltaTheta), dblCurX,
dblCurY)
X2 = dblCurX
Y2 = dblCurY
dblRefAngle = GetReferenceAngle(CDbl(Theta + DeltaTheta), dblCurX,
dblCurY, dblA, dblB)
thePiecewiseCurve.Curves(NSeg).Beta = GetBezierAngle(CDbl(Theta +
DeltaTheta), dblRefAngle, "Beta")
It would probably be nice to show code for the following also:
GetXY()
GetReferenceAngle()
GetBezierAngle()
Public Function GetXY(dblA As Double, dblB As Double, dblTheta As
Double, ByRef dblX As Double, ByRef dblY As Double) As Boolean
Dim dblDenom As Double
Dim dblAbsX As Double
Dim dblAbsY As Double
Const DegToRad = 0.0174532925
GetXY = True
If dblTheta = -90 Or dblTheta = 90 Then
dblX = 0
dblY = Sgn(dblTheta) * dblB
Exit Function
End If
If dblTheta = 0 Then
dblX = dblA
dblY = 0
Exit Function
End If
If dblTheta = 180 Then
dblX = -dblA
dblY = 0
Exit Function
End If
dblDenom = dblB * dblB + dblA * dblA * Tan(dblTheta * DegToRad) * Tan
(dblTheta * DegToRad)
'calculate the absolute value of x and y
dblAbsX = (dblA * dblB) / Sqr(dblDenom)
dblAbsY = dblAbsX * Abs(Tan(dblTheta * DegToRad))
Select Case dblTheta
Case Is 90#:
dblX = dblAbsX
dblY = dblAbsY
Case Is 180#:
dblX = -dblAbsX
dblY = dblAbsY
Case Is 270#:
dblX = -dblAbsX
dblY = -dblAbsY
Case Else
dblX = dblAbsX
dblY = -dblAbsY
End Select
End Function
Public Function GetReferenceAngle(dblTheta As Double, dblX As Double,
dblY As Double, dblA As Double, dblB As Double) As Double
Dim dblReferenceAngle As Double
Const DegToRad = 0.0174532925
GetReferenceAngle = 0
If dblTheta = 0 Or dblTheta = 360 Then
GetReferenceAngle = 90
Exit Function
End If
If dblTheta = 180 Then
GetReferenceAngle = -90
Exit Function
End If
GetReferenceAngle = Atn(dydx(dblA, dblB, dblX, dblY)) / DegToRad
End Function
Public Function dydx(dblA As Double, dblB As Double, dblCurX As
Double, dblCurY As Double) As Double
dydx = -dblB * dblB * dblCurX / (dblA * dblA * dblCurY)
End Function
Public Function GetBezierAngle(dblTheta As Double, dblReferenceAngle
As Double, strAlphaBeta As String) As Double
GetBezierAngle = 0
If dblTheta 360 Then dblTheta = dblTheta - 360
If strAlphaBeta = "Alpha" Then
Select Case dblTheta
Case Is 180:
GetBezierAngle = dblReferenceAngle + 180#
Case Else
GetBezierAngle = dblReferenceAngle
End Select
Else
Select Case dblTheta
Case Is 180:
GetBezierAngle = dblReferenceAngle + 180#
Case Else
GetBezierAngle = dblReferenceAngle
End Select
End If
End Function
Note: It turned out not to be necessary to get the "Alpha" Bezier
angles, so strAlphaBeta and it's code can be removed for the "Alpha"
case.
James A. Fortune