Bagaimana cara menggambar pohon yang rapi menggunakan CFtree?

Saya harus menggambar pohon yang rapi menggunakan CFTree. Anda dapat melihat di gambar

masukkan deskripsi gambar di sini

Hal ini harus memenuhi semua prinsip yang dinyatakan dalam tautan ini.

Prinsipnya adalah:

Prinsip 1: Tepian pohon tidak boleh saling bersilangan.

Prinsip 2: Semua titik pada kedalaman yang sama harus digambar pada garis horizontal yang sama. Ini membantu memperjelas struktur pohon.

Prinsip 3: Pohon harus digambar sesempit mungkin.

Prinsip 4: Orang tua harus terpusat pada anak-anaknya.

Prinsip 5: Sebuah subpohon harus digambar dengan cara yang sama tidak peduli di mana pun pohon itu berada.

Prinsip 6: Node anak dari node induk harus diberi jarak yang sama.

Bagaimana cara menghitung posisi X,Y setiap node?


person Ameet Dhas    schedule 03.12.2013    source sumber
comment
Apakah kamu menggambarnya? Jika demikian, bisakah Anda membimbing saya   -  person Dee    schedule 18.05.2017


Jawaban (2)


Anda dapat menyelesaikan masalah ini secara rekursif.

Tanpa diagram (yang akan sangat membantu!) Berikut adalah garis besar - Anda perlu mengisi detailnya! - dari satu algoritma untuk ini. Algoritma sedang diketik langsung ke dalam jawaban - mengharapkan kesalahan.

Pertama:

  • Kotak pembatas persegi panjang yang mengapit gambar (sub)pohon.
  • Jangkar sebagai titik di mana busur penghubung akan ditarik ke arah (bagian dari busur mungkin tertutup oleh gambar simpul) untuk terhubung ke (sub)pohon.
  • Jangkar akan menjadi titik asal koordinat kotak pembatas - jadi kotak pembatas adalah pengukuran relatif terhadap titik ini.
  • Kotak pembatas mungkin mempunyai anak - kotak pembatas untuk subpohon. Lokasi masing-masing anak relatif terhadap kotak jangkar.

Sekarang:

Pertimbangkan terlebih dahulu menggambar satu simpul tanpa anak. Berdasarkan ukuran yang Anda inginkan, Anda dapat menentukan kotak pembatas untuk simpul tunggal ini. Anda menggunakan lingkaran sehingga jangkarnya, koordinat asal (0,0) dari kotak pembatas berada di tengah dan kotak pembatas adalah +/- jari-jari relatif terhadap itu. Jadi Anda memiliki jangkar kotak pembatas, (0,0), dan ukurannya relatif terhadap itu - katakanlah (x minimum, x maksimum, y minimum, y maksimum) menjadi (-radius, +radius, -radius, +radius). Anda mungkin juga ingin menyimpan label simpul. Jadi misalnya untuk simpul "L" dalam diagram Anda secara total Anda memiliki representasi (yaitu dan objek) yang berisi: (0,0), (-radius, +radius, -radius, +radius) & "L".

Sekarang pertimbangkan menggambar sebuah simpul dengan satu anak. Dengan panggilan rekursif, tentukan kotak pembatas untuk anak tersebut. Buatlah kotak pembatas untuk mengapit anak dengan simpul Anda di tengah atas kotak ini dan kotak pembatas anak tepat di bawahnya. Jadi Anda memiliki jangkar kotak pembatas, ukurannya relatif terhadap itu, dan satu anak dengan offset dari jangkar. Jadi misalnya untuk node "H" di atas Anda memiliki: (0,0), (xmin, xmax, ymin, ymax), "H", 1 child di (xoffset, yoffset), child is (referensi ke objek ) (0,0), (-radius, +radius, -radius, +radius) & "L".

Sekarang pertimbangkan menggambar sebuah simpul dengan 2 anak, dll.

Sebuah traversal rekursif tunggal dari akar pohon Anda, pada setiap node menggabungkan informasi yang dikembalikan dari subpohon, menghasilkan struktur yang menggambarkan tata letak pohon Anda. Sekarang gambarlah!

HTH

person CRD    schedule 03.12.2013

Saya menyadari ini adalah utas lama, tetapi bagi siapa pun yang mencari CFTREE di Google dan menemukan gambar ini dan mencari diagram serupa, saya dapat merekomendasikan GraphViz sebagai solusi. Saya telah menggunakannya dan itu mudah dan kuat. Dari ColdFusion atau bahasa lainnya Anda dapat memanggilnya melalui baris perintah, membuatnya membuat gambar, menggunakan gambar itu, lalu menghapus gambar tersebut. Alasan saya menyebutkan software ini adalah karena terdapat ilmu utuh (algothrym) di balik cara membuat diagram seperti ini. Daripada menulisnya sendiri, gunakan saja software gratis ini.

Untuk mendapatkan data yang diurutkan berdasarkan orang tua/anak, di Oracle Anda dapat menggunakan pernyataan CONNECT BY.

Bangun string data Anda lalu panggil GraphViz - mis.,

Kemudian lihat gambarnya

Dan hapus:

person CFer    schedule 16.01.2015