กราฟิกน้ำหนักบรรทุกบนคาน ตอนที่ 1
สรกานต์ ศรีตองอ่อน
ความนำ
ตอนนี้ว่าด้วยการสร้างกราฟิกน้ำหนักบรรทุกแผ่ (Uniform Load) เต็มช่วงคาน ซึ่งการสร้างจะต่อเนื่องจากบทความที่ 4 คือเซ็ตพิกัดตามนั้นและพล็อตกราฟิกคานขึ้นมาแล้ว
แนวคิด
กรณีน้ำหนักบรรทุก พิกัดแกน X จะเป็นระยะจริงคือหน่วยความยาวตามช่วงคาน ซึ่งเป็นหน่วยที่เซ็ตสเกลไว้
แต่แกน Y เป็นค่าน้ำหนักบรรทุก จะต้องมีการแปลงสเกลให้อยู่ในหน่วยความยาว ดังนี้
หาค่าสูงสุดของน้ำหนักบรรทุก (Wmax)
กำหนด Wmax = ค่าสูงสุดที่กำหนดขึ้น (MaxS) ของสเกลพิกัดจอภาพที่ใช้ เช่นตั้งว่า MaxS เท่ากับ 1 m
ค่าน้ำหนักบรรทุกใดๆ (W) ค่าได้จากการเทียบอัตราส่วน ดังนี้
เทียบ Wmax = MaxS
ดังนั้น W = W * MaxS / Wmax = kw * W
โดยที่ kw = MaxS / Wmax
เมื่อได้ค่า W*kw ซึ่งเป็นหน่วยตามสเกลในที่นี้คือหน่วย m แล้ว ก็นำไปรวมกับพิกัดแกน Y ซึ่งอ้างอิงจากพิกัดแนว FBD ของคาน ก็จะได้พิกัดแกน Y ของน้ำหนักบรรทุก
การสร้างกราฟิกน้ำหนักบรรทุกแผ่แต่ละช่วงคาน จะเป็นรูปสี่เหลี่ยม มีพิกัดมุมบนซ้ายและมุมล่างขวา ดังรูปที่ 1
รูปที่ 1 พิกัดของกราฟิกน้ำหนักบรรทุกแผ่
ซึ่งใช้คำสั่ง Line (X, Yw)-(X + L(I), Yr), QBColor(ค่าของสีทีใช้), B
โดยที่ X = ระยะวัดจากปลายซ้ายของคานช่วงที่พล็อต
Yr = พิกัดแกน Y อ้างอิงจากแนว FBD ของคาน
Yw = Yr + (kW * W)
การโปรแกรม
โปรแกรมจะต่อเนื่องจากบทความที่ 4 นะครับ โดยสิ่งที่เพิ่มเติมคือ
ตัวแปรเกี่ยวกับน้ำหนักบรรทุก
ข้อมูลที่สมมุติขึ้นสำหรับน้ำหนักบรรทุก (เพื่อแสดงการสร้างกราฟิก)
Sub PlotUniformLoad
เพื่อให้เห็นโปรแกรมทั้งหมด จึงยกส่วนของบทความที่ 4 มารวมด้วย โดยมีโค้ดทั้งหมดดังนี้
---------------------------------------------------------------------------------------------------
Option Explicit
Dim Xmin As Single: Dim Xmax As Single
Dim Ymin As Single: Dim Ymax As Single
Dim StepX As Single: Dim StepY As Single
Const N = 3 \' สมมุติจำนวนช่วงคานเท่ากับ 3
Dim L(0 To N + 1) As Single \' ความยาวแต่ละช่วงคาน
Dim SumL As Single \' ผลรวมความยาวของแต่ละช่วงคาน
\' รูปแบบคาน : 1 = ไม่มีช่วงยื่น, 2 = ปลายยื่นซ้าย
\' 3 = ปลายยื่นขวา, 4 = ปลายยื่นสองด้าน
Dim BeamType As Integer
Dim S As Integer \' ค่าเริ่มต้นของลูป
Dim E As Integer \' ค่าจบของลูป
Dim w(0 To N + 1) As Single \' น้ำหนักบรรทุกแผ่เต็มช่วง แต่ละช่วงคาน
----------------------------------------------------------------------------------------------------
Sub PlotUniformLoad()
Const MaxS = 1
Dim kw As Single
Dim Wmax As Single
Dim I As Integer
Dim X As Single
Dim Yw As Single
Dim Yr As Single
Dim strW As String
\' หาค่าน้ำหนักบรรทุกสูงสุด
Wmax = w(S)
For I = S + 1 To E
If Wmax < w(I) Then
Wmax = w(I)
End If
Next I
\' ถ้าไม่มี Uniform Load
If Wmax = 0 Then
Exit Sub
End If
\' แปลงสเกล
kw = MaxS / Wmax
\' พล็อต
DrawWidth = 1
X = 0: Yr = Ymax - 5 + 0.1
For I = S To E
If w(I) <> 0 Then
Yw = Yr + kw * w(I)
Line (X, Yw)-(X + L(I), Yr), QBColor(12), B
strW = Format(w(I), "0.000")
CurrentX = X + ((L(I) - TextWidth(strW)) / 2)
CurrentY = Yw - TextHeight("M")
Print strW
End If
X = X + L(I)
Next I
End Sub
---------------------------------------------------------------------------------------------------
Sub PlotBeam()
Dim I As Integer
Dim X As Single: Dim Y As Single
Dim d As String
\' สร้างกราฟิกคานแต่ละช่วง
X = 0: Y = Ymax - 5
For I = S To E
Line (X, Y + 0.1)-(X + L(I), Y), QBColor(1), B
X = X + L(I)
Next I
\' เส้นบอกความยาวแต่ละช่วง
X = 0: Y = Ymax - 7
Line (X, Y)-(X + SumL, Y), QBColor(4)
Line (X, Y + 0.5)-(X, Y - 0.5), QBColor(4)
For I = S To E
X = X + L(I)
Line (X, Y + 0.5)-(X, Y - 0.5), QBColor(4)
Next I
\' แสดงค่าความยาวแต่ละช่วง
X = 0: Y = Ymax - 7
For I = S To E
d = Format(L(I), "0.00")
CurrentX = X + (L(I) / 2) - (TextWidth(d) / 2)
CurrentY = Y - TextHeight(d)
Print d
X = X + L(I)
Next I
\' เส้นแรงปฏิกิริยา
X = 0: Y = Ymax - 5
Select Case BeamType
Case 2, 4 \' ปลายยื่นซ้าย, ปลายยื่นสองด้าน
X = X + L(0)
End Select
DrawWidth = 3
Line (X, Y)-(X, Y - 1), QBColor(1)
Line (X, Y)-(X - 0.1, Y - 0.1), QBColor(1)
Line (X, Y)-(X + 0.1, Y - 0.1), QBColor(1)
DrawWidth = 1
For I = 1 To N
X = X + L(I)
DrawWidth = 3
Line (X, Y)-(X, Y - 1), QBColor(1)
Line (X, Y)-(X - 0.1, Y - 0.1), QBColor(1)
Line (X, Y)-(X + 0.1, Y - 0.1), QBColor(1)
DrawWidth = 1
Next I
End Sub
---------------------------------------------------------------------------------------------------
Private Sub Form_Activate()
Dim Row As Integer: Dim Col As Integer
Dim NumX As Single: Dim NumY As Single
Dim X As Single: Dim Y As Single
Me.Scale (Xmin, Ymax)-(Xmax, Ymin) \' กำหนดสเกลการแสดงผล
NumX = (Abs(Xmax - Xmin) / StepX) + 1 \' หาจำนวนจุดกริดในแกน X
NumY = (Abs(Ymax - Ymin) / StepY) + 1 \' หาจำนวนจุดกริดในแกน Y
Cls \' เคลียร์หน้าจอ
\' พล็อตจุดกริด
X = Xmin: Y = Ymin
For Row = 1 To NumX
For Col = 1 To NumY
PSet (X, Y), QBColor(4)
Y = Y + StepY
Next Col
X = X + StepX: Y = Ymin
Next Row
\' ลากเส้นแกนอ้างอิงพิกัด (0,0)
Line (0, 0)-(1.5, 0), QBColor(4): Line (0, 0)-(0, 1.5), QBColor(4)
\' เรียกโปรแกรมย่อยสำหรับสร้างกราฟิกคาน
PlotBeam
\' เรียกโปรแกรมย่อยสำหรับสร้างกราฟิกน้ำหนักบรรทุกแผ่เต็มช่วง
PlotUniformLoad
End Sub
---------------------------------------------------------------------------------------------------
Sub FitScreen()
Dim I As Integer
\' หาค่าเริ่มต้นและค่าจบของลูป
Select Case BeamType
Case 1 \' ไม่มีช่วงยื่น
S = 1: E = N
Case 2 \' ปลายยื่นซ้าย
S = 0: E = N
Case 3 \' ปลายยื่นขวา
S = 1: E = N + 1
Case 4 \' ปลายยื่นสองด้าน
S = 0: E = N + 1
End Select
\' หาผลรวมความยาวของแต่ละช่วงคาน
SumL = 0
For I = S To E
SumL = SumL + L(I)
Next I
\' กำหนดสเกลหน้าจอแกน X เซ็ตขอบซ้ายที่ -2 m เสมอ
Xmin = -2: Xmax = SumL + 2
\' กำหนดสเกลหน้าจอแกน Y เท่ากับ 3/4 เท่าของแกน X โดยเซ็ตขอบล่างที่ -2 m เสมอ
Ymin = -2: Ymax = (3 * (Xmax + Abs(Xmin)) \\ 4) - Abs(Ymin)
End Sub
---------------------------------------------------------------------------------------------------
Private Sub Form_Load()
Dim I As Integer
Me.WindowState = 2 \' ขยายฟอร์มให้เต็มจอภาพ
Me.ScaleMode = 0 \' กำหนดสเกลหน้าจอเอง
Me.BackColor = vbWhite \' สีฉากหลังเป็นสีขาว
Me.AutoRedraw = True \' จัดเก็บการแสดงผลในหน่วยความจำ
\' ******************** ข้อมูลที่สมมุติขึ้น ************************
\' สมมุติคานปลายยื่นสองด้าน
BeamType = 4
L(0) = 2: L(1) = 6: L(2) = 5: L(N) = 8: L(N + 1) = 1.5 \' หน่วย m
w(0) = 1.234: w(1) = 0: w(2) = 3.456: w(N) = 2.345: w(N + 1) = 0.98 \' หน่วย T
\' *************************************************************
FitScreen
StepX = 1: StepY = 1 \' กำหนดระยะในการแสดงจุดกริด
Call Form_Activate \' ไปที่เหตุการณ์ Activate
End Sub
---------------------------------------------------------------------------------------------------
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
\' แสดงตำแหน่งพิกัดที่ StatusBar ทศนิยมหนึ่งตำแหน่ง
stbMain.SimpleText = "พิกัดแกน X = " & Format(X, "0.0")
End Sub
เมื่อแสดงผล จะเห็นน้ำหนักบรรทุกแผ่ และ FBD ของคาน ดังรูปที่ 2
รูปที่ 2 กราฟิกที่ได้จากการแสดงผล