高速で球を生成する方法

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.306454)

高速で球を生成する方法

投稿記事by 初心者デベロッパー » 2017年8月17日(木) 21:44

自分は最近新しく追加された浮遊ポーションを使って、宇宙ワールドを生成するプラグインを作ろうかと考えているのですが、そのためには惑星の生成が必要です。
惑星は球ですが、球を生成するために必要な距離の計算に非常に時間をとるので、自作で球を生成する仕組みを作り、改善したいと考えています。

そこで僕が考えたのが以下のコードです(コードは長いのでリンク先に貼ってあります。2つリンクがありますが、どちらも同じものです。読みやすいと思う方でどうぞ)
https://pastebin.com/jWbe48cN
https://hastebin.com/azilurohef.java

自分はまだ高校一年生で、数学はあまり難解な部分はわからないので、できれば優しく教えた貰いたいお思っています。
よろしくお願いします。
初心者デベロッパー
ID:6ba2a770
 

  • (PostNo.306455)

Re: 高速で球を生成する方法

投稿記事by 初心者デベロッパー » 2017年8月17日(木) 21:46

何をやってもらいたいのかという一番重要な部分が抜けていました。すいません。
やってもらいたいのは、このコードを更に高速に走らせるためにはどうしたらいいのかという指導、もしくは、違う考え方で早く実行させる方法です。
初心者デベロッパー
ID:6ba2a770
 

  • (PostNo.306456)

Re: 高速で球を生成する方法

投稿記事by 初心者デベロッパー » 2017年8月17日(木) 21:50

過去の自分「自分は最近新しく追加された浮遊ポーションを使って、宇宙ワールドを生成するプラグインを作ろうかと考えているのですが」
浮遊ポーションではプラグインはできませんね。。。
浮遊ポーションを使って空に漂うことが可能なので、それを利用してまるで宇宙にいるかのような感覚を作り出すという意味です
初心者デベロッパー
ID:6ba2a770
 

  • (PostNo.306459)

Re: 高速で球を生成する方法

投稿記事by 初心者デベロッパー » 2017年8月17日(木) 22:36

ソースコードのコメントが理解しづらいことに気づいたので、補足します。
まず、球を生成する原点をOとして、そこからx,y,z軸が伸びていると仮定します。
ここで球全体を考えてしまうと、無駄が出てしまうので、まず最初に、x,y,z座標がすべて正の場合に置かれるブロックの場所を考えます。
座標(x, y, z)と原点との距離をaとした時、a=√(x^2+y^2+z^2)となりますがそれを式変形すると、x=√(a^2-y^2-z^2)となります。つまり、yとz、そして距離aが分かっているとき、xを出すことができます。

for文で0<y<a 0<z<aの時のy,zをすべて列挙し、それぞれのxを求めてから、x軸の反対方向に向かって原点までブロックを設置してけば、球の8分の1の部分を作ることができます。
あとは、それをx軸に対して反対にしたものと、y軸に対して反対にしたものと、z軸に対して反対にしたものと、x,y軸に対して反対にしたものと、x,z軸に対して反対にしたものと、y,z軸に対して反対にしたものた、x,y,z軸に対して反対にしたものとをくっつければ完成します。

ただしこのx,y,z座標は球を生成する原点を(0,0,0)とおいたときのものなので、実際はこれに本物の座標を足さなければなりません。
初心者デベロッパー
ID:f98581b7
 

  • (PostNo.306461)

Re: 高速で球を生成する方法

投稿記事by 初心者デベロッパー » 2017年8月17日(木) 23:22

0<y<a, 0<z<aではなく0<y<半径、0<z<半径でしたね……
ミス多くてすいません
初心者デベロッパー
ID:f98581b7
 

  • (PostNo.306608)

Re: 高速で球を生成する方法

投稿記事by 初心者デベロッパー » 2017年8月21日(月) 00:06

最終的に、この課題は、いくつかの方法によって解決できると気付きました。

1. 平方根のキャッシュ 同じものを複数回生成する場合、平方根をHashMapを利用して保存しておくと、計算量を減らすことができます。
2. Locationクラスの未使用。LocationクラスのsetTypeは非常に時間を取り、ラグを発生させます。1ブロックごとの光量の計算と、プレイヤーへのパケットの送信が主な理由です。これを解決するため、チャンクにブロックを設置したあと、チャンクごと更新します。
ただどちらも検証段階であり、現段階ではどのぐらいの影響があるのかわかっていません
初心者デベロッパー
ID:6ba2a770
 


Return to 質問:開発・制作関連

x