質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

752閲覧

Buchheimのツリー描画アルゴリズムを理解したい。

simpleman

総合スコア17

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/04/09 05:36

Buchheim's Algorithm

Buchheimのアルゴリズムは、このツリー構造の描画アルゴリズムの進化の歴史についての文章によると、最も新しく(2002年)、描画の美しさ、オーダー(O(n))ともに優れたものらしいです。

pseudo codeはこの元論文のappendixにあり、また先ほどの文章のgithub repositoryにはこのpython実装があります。

JavaScriptで理解したい。。。

このアルゴリズムを理解したいのですが、手元で試せる実装がなく、またまだ理解していないので実装もできず困っています。

現在地

今は描画部分をVue.jsを用いてつくり、あとは各nodeのx座標をこのBuchheim's algorithmを用いて更新すればよいというところまでは来たのですが、肝心のアルゴリズムの中身を実装できていません。

お願いしたいこと

以下に描画部分を担当するVueのコードがあるので、空白になっている__Buchheim()__を実装していただけませんか?
それをもとに学ばせていただきたいと思います。

Vue code

TreeGUI.vue

Javascript

1<template> 2<div> 3 <svg x="0px" y="0px" width="1000px" height="1000px" viewBox="0 0 1000 1000"> 4 <NodeGUI 5 v-for="node in data.nodes" 6 :key="node.id" 7 :node="node" 8 @addChild="addNode" 9 /> 10 </svg> 11</div> 12</template> 13 14<script> 15import NodeGUI from './NodeGUI'; 16 17class Node { 18 constructor (parent) { 19 // Area of the whole node object, including the rectangle, add button and etc. 20 this.totalWidth = 100; 21 this.totalHeight = 80; 22 23 // (x, y) that will be caluclated 24 this.x = -1; 25 let spacer = 10; 26 this.y = (parent) ? parent.y + this.totalHeight + spacer: 0; 27 28 this.parent = parent; 29 this.children = []; 30 31 // 以下のpropertyは論文にそったつもりですが、間違っているかもしれません。 32 // ですので、変更頂いて一向にかまいません! 33 this.thread = null; 34 this.mod = 0; 35 this.ancestor = this; 36 this.shift = 0; 37 this.change = 0; 38 this._lmostSibling = null; 39 40 if (!parent) { 41 this.number = 1; 42 } 43 else { 44 this.number = this.parent.numOfChildren; 45 } 46 } 47} 48 49// +++++++++++++++++++++++++++++++++++++ 50// Tree Positioning Algorithm 51// This will update x-coordinate of each node 52// function buchheim(node) { 53// 54// } 55// +++++++++++++++++++++++++++++++++++++ 56 57export default { 58 name: 'TreeGUI', 59 60 components: { 61 NodeGUI 62 }, 63 64 data () { 65 return { 66 data: { 67 // Nodes of the tree 68 nodes: [ 69 new Node(null) 70 ] 71 } 72 } 73 }, 74 75 methods: { 76 addNode (parentNode) { 77 78 let newNode = new Node(parentNode); 79 80 parentNode.children.push(newNode); 81 this.data.nodes.push(newNode); 82 83 // Update positioning of each node, every time when new node is added 84 // buchheim(this.data.nodes[0]); 85 } 86 } 87} 88</script>

NodeGUI.vue

JavaScript

1<template> 2 <g 3 :transform="transform" 4 fill="none" stroke="#4B4B4B" :stroke-width="strokeWidth" 5 > 6 <rect 7 x="0" y="0" 8 :width="width" :height="height" 9 rx="10" ry="10" 10 /> 11 12 <line 13 :x1="width/2" :y1="height" 14 :x2="width/2" :y2="height+lineLength" 15 /> 16 17 <g @click="addChild"> 18 <circle 19 :cx="width/2" :cy="height+2*lineLength" :r="radius" 20 /> 21 <line 22 :x1="width/2-(radius/2)" :y1="height+2*lineLength" 23 :x2="width/2+(radius/2)" :y2="height+2*lineLength" 24 /> 25 <line 26 :x1="width/2" :y1="height+2*lineLength-(radius/2)" 27 :x2="width/2" :y2="height+2*lineLength+(radius/2)" 28 /> 29 </g> 30 </g> 31 32</template> 33 34<script> 35export default { 36 name: 'NodeGUI', 37 38 props: [ 39 'node' 40 ], 41 42 data () { 43 return { 44 strokeWidth: this.node.totalWidth/20, 45 width: this.node.totalWidth, 46 height: this.node.totalHeight-(3*this.node.totalWidth/10), 47 radius: this.node.totalWidth/10, 48 lineLength: this.node.totalWidth/10 49 } 50 }, 51 52 computed: { 53 transform () { 54 return `translate(${this.node.x},${this.node.y})`; 55 } 56 }, 57 58 methods: { 59 addChild () { 60 this.$emit('addChild', this.node); 61 } 62 } 63} 64</script>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問