Private Sub Form_Load() Dim tLongs() As Long Dim tIndex As Long tLongs() = PipeLong(150, 60, 15) Text1.Text = "" For tIndex = 0 To 14 Text1.Text = Text1.Text & String(tLongs(tIndex), "A") & vbCrLf Next End SubPublic Function PipeLong(ByVal pPipeMax As Long, ByVal pPipeMin As Long, ByVal pCount As Long, Optional ByVal pUnValue As Boolean = False) As Long() 'PipeLong函数 '语法:[tOutValues()] = PipeLong(pPipeMax, pPipeMin, pCount[, pUnValue]) As Long() '功能:产生椭圆曲线管组长度数据。 '参数: long pPipeMax 必要参数,管最长值。 ' long pPipeMin 必要参数,管最短值。 ' long pCount 必要参数,管数量。 ' boolean pUnValue 可选参数,反向曲线。 '输出: long tOutValues()管长数组,数组元素从0到pCount - 1 Dim tOutValues() As Long '输出数组 Dim tOutValues_Length As Long '输出数组逻辑数 Dim tOutValues_Index As Long '输出数组逻辑数
tOutValues_Length = pCount - 1
ReDim tOutValues(tOutValues_Length)
Dim tPipeAbs As Long '管组相对长度 tPipeAbs = Abs(pPipeMax - pPipeMin)
For tOutValues_Index = 0 To tOutValues_Length
If pUnValue Then tOutValues(tOutValues_Index) = pPipeMin + EllipseY(tOutValues_Index, tPipeAbs, tOutValues_Length) Else tOutValues(tOutValues_Index) = pPipeMax - EllipseY(tOutValues_Index, tPipeAbs, tOutValues_Length) End If
Next
PipeLong = tOutValues() End FunctionPublic Function EllipseY(ByVal pX As Long, ByVal pA As Long, ByVal pB As Long) EllipseY = (pA ^ 2 * (1 - (pX ^ 2) / (pB ^ 2))) ^ 0.5 End Function
PipeLong(51, 1, 15),测试程序输出的字符串:A A AA AA AAA AAAA AAAAAA AAAAAAAA AAAAAAAAAA AAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
假设列表间隔为 50MM, 第一根为150MM,最后一根为60MM,总共有15根塑料管(包括最大最小两根).
其实不难,数学问题。比如你利用椭圆曲线,其短半轴是最长和最短塑料管的长度差,长半轴是它们之间的距离。1 得到椭圆曲线公式。
2 算出每根塑管与最长管的距离 X, 带入公式,求得 Y。
3 Y + 短管长度就是这根管的长度。
Private Sub Form_Load()
Dim tLongs() As Long
Dim tIndex As Long
tLongs() = PipeLong(150, 60, 15)
Text1.Text = ""
For tIndex = 0 To 14
Text1.Text = Text1.Text & String(tLongs(tIndex), "A") & vbCrLf
Next
End SubPublic Function PipeLong(ByVal pPipeMax As Long, ByVal pPipeMin As Long, ByVal pCount As Long, Optional ByVal pUnValue As Boolean = False) As Long()
'PipeLong函数
'语法:[tOutValues()] = PipeLong(pPipeMax, pPipeMin, pCount[, pUnValue]) As Long()
'功能:产生椭圆曲线管组长度数据。
'参数: long pPipeMax 必要参数,管最长值。
' long pPipeMin 必要参数,管最短值。
' long pCount 必要参数,管数量。
' boolean pUnValue 可选参数,反向曲线。
'输出: long tOutValues()管长数组,数组元素从0到pCount - 1
Dim tOutValues() As Long '输出数组
Dim tOutValues_Length As Long '输出数组逻辑数
Dim tOutValues_Index As Long '输出数组逻辑数
tOutValues_Length = pCount - 1
ReDim tOutValues(tOutValues_Length)
Dim tPipeAbs As Long '管组相对长度 tPipeAbs = Abs(pPipeMax - pPipeMin)
For tOutValues_Index = 0 To tOutValues_Length
If pUnValue Then
tOutValues(tOutValues_Index) = pPipeMin + EllipseY(tOutValues_Index, tPipeAbs, tOutValues_Length)
Else
tOutValues(tOutValues_Index) = pPipeMax - EllipseY(tOutValues_Index, tPipeAbs, tOutValues_Length)
End If
Next
PipeLong = tOutValues()
End FunctionPublic Function EllipseY(ByVal pX As Long, ByVal pA As Long, ByVal pB As Long)
EllipseY = (pA ^ 2 * (1 - (pX ^ 2) / (pB ^ 2))) ^ 0.5
End Function
PipeLong(51, 1, 15),测试程序输出的字符串:A
A
AA
AA
AAA
AAAA
AAAAAA
AAAAAAAA
AAAAAAAAAA
AAAAAAAAAAAAA
AAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
公式推导:任何一本数学手册、课本、Wiki、百度都能查到的椭圆方程(适用于题目所指情况):
x^2/b^2+y^2/a^2=1 (a>b>0)公式变换(初中数学知识):y^2/a^2=1-x^2/b^2y^2=a^2*(1-x^2/b^2)y=(a^2*(1-x^2/b^2))^0.5