กราฟิกน้ำหนักบรรทุกบนคาน ตอนที่ 2 อ่าน 4,379

กราฟิกน้ำหนักบรรทุกบนคาน ตอนที่ 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  กราฟิกที่ได้จากการแสดงผล

 

คะแนน:
ร่วมแสดงความคิดเห็น (Post Comment)