การสร้างกราฟิกโครงข้อหมุน ตอนที่ 3
สรกานต์ ศรีตองอ่อน
ความนำ
สำหรับตอนนี้ จะอธิบายถึงการสร้างที่รองรับ (support) นะครับ แล้วตอนต่อไปจะกลับไปที่การสร้างรูปแบบหน้าจอทั่วไปของโปรแกรม ที่พร้อมจะแสดงผลทางกราฟิกใน 2 มิติ
แนวคิด
สำหรับที่รองรับของโครงข้อหมุน สามารถเป็นไปได้ 3 รูปแบบคือ แบบบานพับ (hinge) แบบล้อเลื่อน (roller) ในแนวราบ และแบบล้อเลื่อนในแนวดิ่ง ซึ่งพิกัดที่เราทราบคือพิกัด (X,Y) ของแต่ละจุดต่อ ดังรูปที่ 1
รูปที่ 1 ที่รองรับแต่ละแบบ
ในการวิเคราะห์โดยวิธีสติฟเนสนั้น จะพิจารณาที่รองรับว่ามีการยึดรั้งในแนวแกนใดบ้าง ซึ่งโดยปกติ แต่ละจุดต่อถ้าไม่มีที่รองรับนั่นคือไม่มีการยึดรั้ง โดยถ้าให้ไม่มีการยึดรั้งเท่ากับ 0 และมีการยึดรั้งเท่ากับ 1 จะได้ว่า
ที่รองรับแบบบานพับ แกน X = 1 แกน Y = 1
ที่รองรับแบบล้อเลื่อนในแนวราบ แกน X = 0 แกน Y = 1
ที่รองรับแบบล้อเลื่อนในดิ่ง แกน X = 1 แกน Y = 0
จุดต่อที่ไม่มีที่รองรับ แกน X = 0 แกน Y = 0
ดังนั้น หากจุดต่อใดมีที่รองรับ ก็ป้อนข้อมูลว่ามีการยึดรั้งในแนวแกนใดบ้าง แล้วจึงแปลงเป็นกราฟิกในภายหลัง
การสร้างกราฟิก อาศัยจุด (X,Y) นั้นเป็นจุดอ้างอิงของพิกัดที่เหลือ
การโปรแกรม
อ้างอิงโค้ดจากบทความที่ 11 นะครับ โดยมีการแก้ไขเพิ่มเติมดังนี้
กำหนดตัวแปรเพิ่มเติมที่ Gerneral Declarations
Option Explicit
\' ตัวแปรที่ใช้ในการเก็บข้อมูลของโครงข้อหมุน
|
|
|
Private Type Bound_Type
X As Integer
Y As Integer
End Type
Dim Bound(1 To 50) As Bound_Type \' สมมุติกำหนดให้ที่รองรับสูงสุดเท่ากับจำนวนจุดต่อสูงสุด
สร้างโปรแกรมย่อยสำหรับพล็อตกราฟิกแต่ละรูปแบบของที่รองรับ
Sub HingeSup(X, Y)
Const c = 13 \' Light Magenta
Dim a As Single
a = 0.08
Line (X - 4 * a, Y - 3 * a)-(X + 4 * a, Y - 3 * a), QBColor(c)
Line (X - 3 * a, Y - 3 * a)-(X, Y), QBColor(c)
Line (X + 3 * a, Y - 3 * a)-(X, Y), QBColor(c)
Line (X - 5 * a, Y - 4.5 * a)-(X - 4 * a, Y - 3 * a), QBColor(c)
Line (X - 1 * a, Y - 4.5 * a)-(X, Y - 3 * a), QBColor(c)
Line (X + 3 * a, Y - 4.5 * a)-(X + 4 * a, Y - 3 * a), QBColor(c)
End Sub
Sub RollerSup(X, Y)
Const c = 13 \' Light Magenta
Dim a As Single
a = 0.08
Line (X - 4 * a, Y - 3 * a)-(X + 4 * a, Y - 3 * a), QBColor(c)
Line (X - 2 * a, Y - 2 * a)-(X, Y), QBColor(c)
Line (X + 2 * a, Y - 2 * a)-(X, Y), QBColor(c)
Line (X - 2 * a, Y - 2 * a)-(X + 2 * a, Y - 2 * a), QBColor(c)
Circle (X - 1.5 * a, Y - 2.5 * a), 0.5 * a, QBColor(c)
Circle (X + 1.5 * a, Y - 2.5 * a), 0.5 * a, QBColor(c)
Line (X - 5 * a, Y - 4.5 * a)-(X - 4 * a, Y - 3 * a), QBColor(c)
Line (X - 1 * a, Y - 4.5 * a)-(X, Y - 3 * a), QBColor(c)
Line (X + 3 * a, Y - 4.5 * a)-(X + 4 * a, Y - 3 * a), QBColor(c)
End Sub
Sub VRollerSup(X, Y)
Const c = 13 \' Light Magenta
Dim a As Single
a = 0.08
Line (X - 3 * a, Y + 4 * a)-(X - 3 * a, Y - 4 * a), QBColor(c)
Line (X - 2 * a, Y + 2 * a)-(X, Y), QBColor(c)
Line (X - 2 * a, Y - 2 * a)-(X, Y), QBColor(c)
Line (X - 2 * a, Y + 2 * a)-(X - 2 * a, Y - 2 * a), QBColor(c)
Circle (X - 2.5 * a, Y + 1.5 * a), 0.5 * a, QBColor(c)
Circle (X - 2.5 * a, Y - 1.5 * a), 0.5 * a, QBColor(c)
Line (X - 4.5 * a, Y + 5.5 * a)-(X - 3 * a, Y + 4 * a), QBColor(c)
Line (X - 4.5 * a, Y + 1.5 * a)-(X - 3 * a, Y ), QBColor(c)
Line (X - 4.5 * a, Y - 2.5 * a)-(X - 3 * a, Y - 4 * a), QBColor(c)
End Sub
เพิ่มโค้ดในโปรแกรมย่อย PlotTrussGeometry
Sub PlotTrussGeometry()
|
|
|
\' Nodal Restrainst
For I = 1 To N
If (Bound(I).X = 0) And (Bound(I).Y = 1) Then \' Roller
Call RollerSup(Node(I).X, Node(I).Y)
ElseIf (Bound(I).X = 1) And (Bound(I).Y = 0) Then \' Vertical Roller
Call VRollerSup(Node(I).X, Node(I).Y)
ElseIf (Bound(I).X = 1) And (Bound(I).Y = 1) Then \' Hinge
Call HingeSup(Node(I).X, Node(I).Y)
End If
Next I
End Sub
กำหนดข้อมูลตัวอย่างของโครงข้อหมุนรูปทรงใหม่ ที่เหตุการณ์ Form_Load
Private Sub Form_Load()
|
|
|
\' ข้อมูลตัวอย่างของโครงข้อหมุน
\' Node
N = 6
Node(1).X = 0: Node(1).Y = 0
Node(2).X = 0: Node(2).Y = 4
Node(3).X = 0: Node(3).Y = 8
Node(4).X = 4: Node(4).Y = 2
Node(5).X = 4: Node(5).Y = 6
Node(6).X = 8: Node(6).Y = 4
\' Element
E = 9
Elem(1).H = 1: Elem(1).T = 2
Elem(2).H = 2: Elem(2).T = 3
Elem(3).H = 4: Elem(3).T = 5
Elem(4).H = 1: Elem(4).T = 4
Elem(5).H = 4: Elem(5).T = 6
Elem(6).H = 3: Elem(6).T = 5
Elem(7).H = 5: Elem(7).T = 6
Elem(8).H = 2: Elem(8).T = 4
Elem(9).H = 2: Elem(9).T = 5
\' Nodal Restrainst
Bound(1).X = 1: Bound(1).Y = 1 \' Hinge
Bound(3).X = 1: Bound(3).Y = 0 \' Vertical Roller
Bound(6).X = 0: Bound(6).Y = 1 \' Roller
Call Form_Activate \' ไปที่เหตุการณ์ Activate
End Sub
เมื่อแสดงผล จะเห็นกราฟิกโครงข้อหมุนตามข้อมูลที่กำหนดขึ้น โดยมีกราฟิกที่รองรับด้วย ดังรูปที่ 2
รูปที่ 2 กราฟิกโครงข้อหมุนตามข้อมูลที่กำหนด