กราฟิกน้ำหนักบรรทุกบนคาน ตอนที่ 1 อ่าน 3,700

กราฟิกน้ำหนักบรรทุกบนคาน ตอนที่ 1

สรกานต์  ศรีตองอ่อน 

ความนำ

     ตอนนี้ว่าด้วยการสร้างกราฟิกน้ำหนักบรรทุกแผ่ (Uniform Load) เต็มช่วงคาน ซึ่งการสร้างจะต่อเนื่องจากบทความที่ 4 คือเซ็ตพิกัดตามนั้นและพล็อตกราฟิกคานขึ้นมาแล้ว

 

แนวคิด

  • กรณีน้ำหนักบรรทุก พิกัดแกน X จะเป็นระยะจริงคือหน่วยความยาวตามช่วงคาน ซึ่งเป็นหน่วยที่เซ็ตสเกลไว้

  • แต่แกน Y เป็นค่าน้ำหนักบรรทุก จะต้องมีการแปลงสเกลให้อยู่ในหน่วยความยาว ดังนี้

    1. หาค่าสูงสุดของน้ำหนักบรรทุก (Wmax)

    2. กำหนด  Wmax = ค่าสูงสุดที่กำหนดขึ้น (MaxS) ของสเกลพิกัดจอภาพที่ใช้ เช่นตั้งว่า MaxS เท่ากับ 1 m 

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

 

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