กราฟิกน้ำหนักบรรทุกบนคาน ตอนที่ 2
สรกานต์ ศรีตองอ่อน
ความนำ
ต่อมาเป็นการสร้างกราฟิกน้ำหนักบรรทุกแบบจุด (Point Load) ซึ่งโค้ดของโปรแกรมจะต่อเนื่องจากบทความที่ 6 คือ โค้ดเดิมจะนำมาใช้ในบทความตอนนี้ด้วย
แนวคิด
กรณีน้ำหนักบรรทุก พิกัดแกน X จะเป็นระยะจริงคือหน่วยความยาวตามช่วงคาน ซึ่งเป็นหน่วยที่เซ็ตสเกลไว้
แกน Y เป็นค่าน้ำหนักบรรทุก จะต้องมีการแปลงสเกลให้อยู่ในหน่วยความยาว ในทำนองเดียวกับน้ำหนักบรรทุกแผ่ในบทความที่ 6 โดยให้ MaxP เท่ากับ 2 m เพื่อให้ดูสูงกว่าน้ำหนักบรรทุกแผ่
กรณีน้ำหนักบรรทุกแบบจุดในแต่ละช่วงคาน สามารถมีได้มากกว่า 1 จุด (หรือไม่มีก็ได้) ซึ่งในแต่ละช่วงคานก็อาจมีจำนวนเท่ากันหรือไม่เท่ากันก็ได้ ในที่นี้จะสมมุติว่าแต่ละช่วงคานมีจำนวนได้ไม่เกิน 2 จุด การป้อนข้อมูลต้องระบุทั้งค่าน้ำหนักบรรทุก (P) และระยะวัดจากปลายซ้ายของช่วงคาน (d) ดังรูปที่ 1
รูปที่ 1 การระบุกราฟิกน้ำหนักบรรทุกแบบจุด
หมายเหตุ : ปัญหานี้ในการโปรแกรมถือเป็นเรื่องซับซ้อนเรื่องหนึ่งวิธีการสามารถทำได้หลายแบบ แต่แนะนำให้กำหนดโครงสร้างข้อมูลเป็นแบบแถวลำดับ (array) ซึ่งมีคำถามต่อมาอีกว่าจะใช้แบบ static array คือกำหนดขีดจำกัดของจำนวนล่วงหน้า หรือ dynamic array คือไม่กำหนดขีดจำกัดของจำนวนล่วงหน้า โดยทั่วไปแล้ว dynamic array มีประสิทธิภาพกว่า แต่ก็เขียนโปรแกรมซับซ้อนกว่าด้วย
การสร้างกราฟิกน้ำหนักบรรทุกแบบจุด จะเป็นรูปลูกศร มีค่าแต่ละพิกัด ดังรูปที่ 2
รูปที่ 2 พิกัดของกราฟิกน้ำหนักบรรทุกแบบจุด
ซึ่งใช้คำสั่ง Line ลากเส้นมาเชื่อมต่อกัน 3 เส้น
โดยที่ X = ระยะปลายซ้ายของคานช่วงที่พล็อต
Yr = พิกัดแกน Y อ้างอิงจากแนว FBD ของคาน
d = ระยะวัดจาก X ถึงตำแหน่งน้ำหนักบรรทุก
k*P = สเกลการแปลงพิกัดจากหน่วยน้ำหนักเป็นหน่วยความยาว
a = ค่าคงที่ในการสร้างปลายลูกศร (ในที่นี้กำหนดเท่ากับ 0.2 m)
กราฟิกน้ำหนัก P นี้ ควรแสดงระยะของ P ด้วยซึ่งโปรแกรมนี้จะใช้การแสดงระยะต่อเนื่องกันไป คือไม่แสดงระยะของแต่ละ d (เพราะจะต้องเผื่อช่วงลากเส้นระยะไว้มากเกินไป) วิธีการดูได้จากโค้ด
การโปรแกรม
โปรแกรมจะต่อเนื่องจากบทความที่ 6 นะครับ โดยสิ่งที่เพิ่มเติมคือ
ตัวแปรเกี่ยวกับน้ำหนักบรรทุก ที่ General Declarations ดังนี้
Private Type PLoad_Type
P As Single
d As Single
End Type
Dim PLoad(0 To N + 1, 1 To 2) As PLoad_Type
Dim NumP(0 To N + 1) As Integer
Sub PlotPointLoad มีโค้ดดังนี้
Sub PlotPointload()
Const MaxS = 2: Const cw = 9
Const a = 0.2: Const b = 0.3
Dim kP As Single: Dim MaxP As Single
Dim Xdp As Single: Dim Ydp As Single
Dim StrP As String: Dim strD As String
Dim X As Single: Dim Yr As Single
Dim I As Integer: Dim J As Integer
\' หาค่า P สูงสุด
MaxP = 0
For I = S To E
For J = 1 To NumP(I)
If MaxP < PLoad(I, J).P Then
MaxP = PLoad(I, J).P
End If
Next J
Next I
If MaxP = 0 Then
Exit Sub
End If
\' ค่าคงที่ในการแปลงสเกล
kP = MaxS / MaxP
\' พล็อต
X = 0: Yr = Ymax - 5 + 0.1: Ydp = (Ymax - 5) - 1
For I = S To E
If NumP(I) <> 0 Then
For J = 1 To NumP(I)
\' รูปลูกศร
Line (X + PLoad(I, J).d, Yr + kP * PLoad(I, J).P)-(X + PLoad(I, J).d, Yr), QBColor(cw)
Line (X + PLoad(I, J).d - a, Yr + a)-(X + PLoad(I, J).d, Yr), QBColor(cw)
Line (X + PLoad(I, J).d + a, Yr + a)-(X + PLoad(I, J).d, Yr), QBColor(cw)
\' ค่า P
StrP = Format(PLoad(I, J).P, "0.000")
CurrentX = X + PLoad(I, J).d + 0.1
CurrentY = Yr + kP * PLoad(I, J).P - TextHeight("M")
Print StrP
\' เส้นระยะและค่า d
If (I = 0) And (PLoad(I, J).d <> 0) Then \' Case Left Overhang
\' ถ้าอยู่ในช่วงปลายยื่นซ้าย และ d = 0 ไม่ต้องบอกระยะและค่า d
Else
If (PLoad(I, J).d <> 0) Then
Xdp = X + PLoad(I, J).d
\' เส้นระยะ
Line (X, Ydp - b)-(X, Ydp + b)
Line (X, Ydp)-(Xdp, Ydp)
Line (Xdp, Ydp - b)-(Xdp, Ydp + b)
\' ค่า d
If J = 1 Then \' ถ้าเป็นค่า P แรก แสดงระยะ d วัดจากปลายซ้ายของช่วงคานนั้น
strD = Format(PLoad(I, J).d, "0.00")
CurrentX = X + ((Xdp - X - TextWidth(strD)) / 2)
Else \' แต่ถ้าเป็นค่า P ถัดมา (ถ้ามี) แสดงระยะ d ที่ลบจากระยะ d ก่อนหน้านั้นด้วย
strD = Format(PLoad(I, J).d - PLoad(I, J - 1).d, "0.00")
CurrentX = X + PLoad(I, J - 1).d + ((PLoad(I, J).d - PLoad(I, J - 1).d - TextWidth(strD)) / 2)
End If
CurrentY = Ydp - TextHeight("M")
Print strD
End If
End If
Next J
End If
X = X + L(I)
Next I
End Sub
เรียกใช้ Sub PlotPointLoad ที่เหตุการณ์ Form_Activate ต่อจากโค้ดเดิมดังนี้
Private Sub Form_Activate()
Dim Row As Integer: Dim Col As Integer
|
|
|
\' เรียกโปรแกรมย่อยสำหรับสร้างกราฟิกน้ำหนักบรรทุกแผ่เต็มช่วง
PlotUniformLoad
\' เรียกโปรแกรมย่อยสำหรับสร้างกราฟิกน้ำหนักแบบจุด
PlotPointload
End Sub
ข้อมูลที่สมมุติขึ้นสำหรับน้ำหนักบรรทุกแบบจุด (เพื่อแสดงการสร้างกราฟิก) ที่เหตุการณ์ Load ต่อจากโค้ดเดิมดังนี้
Private Sub Form_Load()
Dim I As Integer
|
|
|
\' ******************** ข้อมูลที่สมมุติขึ้น ************************
\' สมมุติคานปลายยื่นสองด้าน
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/m
NumP(0) = 1
PLoad(0, 1).P = 1: PLoad(0, 1).d = 0
NumP(1) = 2
PLoad(1, 1).P = 0.5: PLoad(1, 1).d = 2
PLoad(1, 2).P = 1.5: PLoad(1, 2).d = 4
NumP(2) = 0
NumP(N) = 1
PLoad(N, 1).P = 2: PLoad(N, 1).d = 5
NumP(N + 1) = 2
PLoad(N + 1, 1).P = 0.8: PLoad(N + 1, 1).d = 1
PLoad(N + 1, 2).P = 1.5: PLoad(N + 1, 2).d = 1.5
\' *************************************************************
FitScreen
StepX = 1: StepY = 1 \' กำหนดระยะในการแสดงจุดกริด
Call Form_Activate \' ไปที่เหตุการณ์ Activate
End Sub
เมื่อแสดงผล จะเห็นน้ำหนักบรรทุกแบบจุด น้ำหนักบรรทุกแผ่ และ FBD ของคาน ดังรูปที่ 3
รูปที่ 3 กราฟิกที่ได้จากการแสดงผล