วิธีการวาดต้นไม้เรียบร้อยโดยใช้ CFTree?

ฉันต้องวาดต้นไม้ที่ดูเรียบร้อยโดยใช้ CFTree คุณสามารถดูในภาพ

ป้อนคำอธิบายรูปภาพที่นี่

ควรเป็นไปตามหลักการทั้งหมดที่ระบุไว้ในลิงก์นี้

หลักการคือ:

หลักการที่ 1: ขอบของต้นไม้ไม่ควรตัดกัน

หลักการที่ 2: ควรวาดโหนดทั้งหมดที่มีความลึกเท่ากันบนเส้นแนวนอนเดียวกัน ช่วยให้โครงสร้างของต้นไม้ชัดเจน

หลักการที่ 3: ควรวาดต้นไม้ให้แคบที่สุด

หลักการที่ 4: พ่อแม่ควรให้ความสำคัญกับลูกเป็นหลัก

หลักการที่ 5: ต้นไม้ย่อยควรถูกวาดให้เหมือนกันไม่ว่าต้นไม้นั้นจะอยู่ที่ใดก็ตาม

หลักการที่ 6: โหนดย่อยของโหนดหลักควรมีระยะห่างเท่ากัน

ฉันจะคำนวณตำแหน่ง X,Y ของแต่ละโหนดได้อย่างไร


person Ameet Dhas    schedule 03.12.2013    source แหล่งที่มา
comment
คุณวาดมันเหรอ? ถ้าเป็นเช่นนั้นคุณช่วยแนะนำฉันได้ไหม   -  person Dee    schedule 18.05.2017


คำตอบ (2)


คุณสามารถแก้ไขปัญหานี้แบบวนซ้ำได้

หากไม่มีไดอะแกรม (ซึ่งจะช่วยได้มาก!) นี่คือโครงร่าง - คุณต้องกรอกรายละเอียด! - ของอัลกอริทึมหนึ่งสำหรับสิ่งนี้ กำลังพิมพ์อัลกอริทึมลงในคำตอบโดยตรง - คาดว่าจะเกิดข้อผิดพลาด

อันดับแรก:

  • กรอบล้อมรอบ สี่เหลี่ยมผืนผ้าล้อมรอบภาพวาดของต้นไม้ (ย่อย)
  • Anchor เป็นจุดที่การเชื่อมต่อส่วนโค้งจะดึง ไปทาง (ส่วนหนึ่งของส่วนโค้งอาจถูกบดบังด้วยการวาดโหนด) เพื่อเชื่อมต่อกับแผนผัง (ย่อย)
  • จุดยึดจะเป็นจุดกำเนิดพิกัดของกล่องขอบเขต ดังนั้นกล่องขอบเขตจึงเป็นหน่วยวัดที่สัมพันธ์กับจุดนี้
  • กล่องที่มีขอบเขตอาจมี ลูก - กล่องที่มีขอบเขตสำหรับทรีย่อย ตำแหน่งของเด็กแต่ละคนจะสัมพันธ์กับจุดยึดกล่อง

ตอนนี้:

ขั้นแรกให้พิจารณาวาดโหนดเดียวโดยไม่มีลูก ขึ้นอยู่กับขนาดที่คุณต้องการ คุณสามารถกำหนดขอบเขตกล่องสำหรับโหนดเดียวนี้ได้ คุณกำลังใช้วงกลม ดังนั้นจุดยึด จุดกำเนิดพิกัด (0,0) ของกล่องขอบเขตอยู่ที่กึ่งกลาง และกล่องขอบเขตคือ +/- รัศมีสัมพันธ์กับสิ่งนั้น ดังนั้นคุณจึงมีจุดยึดของกล่องขอบเขต (0,0) และขนาดของมันสัมพันธ์กับสิ่งนั้น - พูดว่า (x ขั้นต่ำ, x สูงสุด, y ขั้นต่ำ, y สูงสุด) เป็น (-รัศมี, +รัศมี, -รัศมี, +รัศมี) คุณอาจต้องการจัดเก็บเลเบลของโหนดด้วย ตัวอย่างเช่น สำหรับโหนด "L" ในไดอะแกรมของคุณโดยรวม คุณจะมีการแสดง (เช่น และวัตถุ) ที่มี: (0,0), (-radius, +radius, -radius, +radius) & "L"

ตอนนี้ให้ลองวาดโหนดที่มีลูกคนเดียว โดยการเรียกซ้ำกำหนดกรอบขอบเขตสำหรับเด็ก สร้างกล่องขอบเขตเพื่อล้อมรอบเด็กด้วยโหนดของคุณที่ตรงกลางด้านบนของกล่องนี้ และกล่องขอบเขตเด็กที่อยู่ด้านล่างโดยตรง ดังนั้นคุณจึงมีสมอของกล่องผูกซึ่งมีขนาดสัมพันธ์กับสิ่งนั้น และมีลูกหนึ่งลูกที่ออฟเซ็ตจากสมอ ตัวอย่างเช่นสำหรับโหนด "H" ด้านบนคุณมี: (0,0), (xmin, xmax, ymin, ymax), "H", 1 ลูกที่ (xoffset, yoffset), ลูกคือ (อ้างอิงถึงวัตถุ ) (0,0), (-รัศมี, +รัศมี, -รัศมี, +รัศมี) & "L"

ตอนนี้ให้ลองวาดโหนดที่มีลูก 2 คน ฯลฯ

การแวะเวียนแบบเรียกซ้ำครั้งเดียวจากรากของแผนผังของคุณ ที่แต่ละโหนดรวมข้อมูลที่ส่งคืนจากแผนผังย่อย จะสร้างโครงสร้างที่อธิบายโครงร่างของแผนผังของคุณ ตอนนี้วาดมัน!

person CRD    schedule 03.12.2013

ฉันรู้ว่านี่เป็นกระทู้เก่า แต่สำหรับใครก็ตามที่ Google CFTREE และพบภาพนี้และกำลังมองหาไดอะแกรมที่คล้ายกัน ฉันสามารถแนะนำ GraphViz ให้เป็นวิธีแก้ปัญหาได้ ฉันเคยใช้มันและมันง่ายและมีประสิทธิภาพ จาก ColdFusion หรือภาษาอื่นๆ คุณสามารถเรียกมันผ่านบรรทัดคำสั่ง ให้โปรแกรมสร้างภาพ ใช้ภาพนั้น จากนั้นลบภาพออก เหตุผลที่ฉันพูดถึงซอฟต์แวร์นี้ก็คือ มีวิทยาศาสตร์ทั้งหมด (อัลกอริธึม) ที่อยู่เบื้องหลังวิธีสร้างไดอะแกรมเช่นนี้ แทนที่จะเขียนด้วยตัวเอง เพียงใช้ซอฟต์แวร์ฟรีนี้

หากต้องการรับข้อมูลที่เรียงลำดับตามผู้ปกครอง/รอง ใน Oracle คุณสามารถใช้คำสั่ง CONNECT BY ได้

สร้างสตริงข้อมูลของคุณแล้วเรียก GraphViz - เช่น

จากนั้นอ้างอิงตามภาพ

และลบมัน:

person CFer    schedule 16.01.2015