ペンギンのメモ帖一個獲得

MMORPGラグナロクオンラインCHAOSサーバーで活動してます。 メインはチェイサーで、ネタをちょこちょこつけていこうと思います。

スポンサーサイト

--.--.--.--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

射線切りの法則

2009.11.22.Sun
○初めに
以下記事の内容は自分の頭の中で整理したものなので、全て憶測です。
検証件数が少ないので、間違いがあれば修正する予定です('▽'*)指摘マッテルー


○方角の考え方
射線に方角は重要になります。
以下、マップの方向(デフォルトの方向)で↑方向を北とします。


○セル(マス)の考え方
射線切り原理01

普段マスを枠で表現しますが、以下マスの見方は上の右図のように

マスとマスの間には隙間(ライン)がない

ものとして考えていただくとわかりやすいと思いますヽ(*'ω')ノニョッキ
「マスの左下」と表現した場合、A点の位置と解釈してください。


○射線切りを理解しにくい原因

射線切りを直感的にわかりにくくしている原因、それは

floor関数(床関数)

を使ってることに起因します。

「floor関数って何よ。」

ヨクワカランチンヽ(*'ω')ノ
ということで調べてみました。


○floor関数とは?

床関数と天井関数(Wikipedia)
簡単にいうと、条件によって切上げ切捨てをしてくれる関数であるらしい。

・floor関数図
射線切り原理09
<例>
1 → 1 -1 → -1
0.4 → 0 -0.4 → -1
0.8 → 0 -0.8 → -1
1.2 → 1 -1.2 → -2

floor関数のポイントは負の数での小数点以下の丸め方にあります。
正(x>0)では切捨て、負(x<0)では絶対値で見て切上げ(※1)していること。
これが射線切りを不思議ちゃんにさせる原因となるようだ('▽'*)フシギチャン

※1.負の数の丸め方について
負の数の切上げ切捨ては考え方によって表現が変わってくる。
端数処理(Wikipedia)
数値の丸めに関する質問


○射線特性その1
射線経路を導出する前にひとつ。

射線特性1.交換則
対象者、発動者の位置を交換しても射線の経路は変わらない。


どちらを基準においても射線の経路は変化しないことになります。


○射線経路の算出
実際、どんな計算をしているのか考えてみよう(*゜ω゜)zzZ

・基準
射線切り原理06
発動者、対象者どちらかを基準にとり、右方向x、上方向yを正とします。
ROのマップ座標(/where)と同じ軸のとりかたであると考えると理解しやすいかもしれません。
(左下に行くほど数値が小さくなる。)

・傾きa
対象者と発動者を結んだ直線の傾きをaとする。
水色緑色:自分と対象のセル(交換可)
射線切り原理07
左図傾き:a=3/5
右図傾き:a=(-3/-5)=3/5

・射線計算式
傾き|a|<1のとき、y(x) = floor(a * x) xは整数
傾き|a|>1のとき、x(y) = floor( (1/a) * y) yは整数

a=1のときはどちらの式でも可。
|a|>1のとき傾きはaの逆数1/aになる。
|a|はaの絶対値。

↑北
射線切り原理10
図中マス内の数値は射線座標を示す( x , y )

<例>左上図の場合
傾きa = 3/5、|a|は1より小さい。

y(x) = floor( 3/5 * x)

x = 1 のとき y(1) = floor(0.6) = 0 ( x , y ) = ( 1 , 0 )
x = 2 のとき y(2) = floor(1.2) = 1 ( x , y ) = ( 2 , 1 )
x = 3 のとき y(3) = floor(1.8) = 1 ( x , y ) = ( 3 , 1 )
x = 4 のとき y(4) = floor(2.4) = 2 ( x , y ) = ( 4 , 2 )

<例>右下図の場合
傾きa = 5/3、|a|は1より大きい。

x(y) = floor( -3/5 * y)

y = -1 のとき x(-1) = floor(-0.6) = -1 ( x , y ) = ( -1 , -1 )
y = -2 のとき x(-2) = floor(-1.2) = -2 ( x , y ) = ( -2 , -2 )
y = -3 のとき x(-3) = floor(-1.8) = -2 ( x , y ) = ( -2 , -3 )
y = -4 のとき x(-4) = floor(-2.4) = -3 ( x , y ) = ( -3 , -4 )

・射線切り定義
射線経路(灰色マス)に崖撃ち不可能な壁(進入不可領域)が存在するとき、射線切りとなる。
このとき対象者、対象セルにスキルを指定することができない、かつ発動したスキルが無効になる。


○射線を図から導出する方法
原理は説明しましたが、実戦でいざ使おうと思うとこれでは非常に不便である。


「もっと簡単なのないのー?」


デ、デスヨネ(*'ω')('ω';)ネー
ということで図を描くだけで射線経路が導出できる手段を考えてみました。

1.発動者と対象者のマス左下を直線で結ぶ
射線切り原理05

2.傾きの絶対値が1より小さい→マスの縦線に注目
  傾きの絶対値が1より大きい→マスの横線に注目

赤線:発動者と対象者のマス左下を結んだ線
水色緑色:発動者、対象者
灰色マス:直線が通るマス
灰色(薄):非射線経路マス
灰色(濃):本当の射線マス
黄色線:赤線が通る枠線()

傾きの絶対値が1より小さい→
直線が通るマス枠縦線(黄色)の右マスが射線経路マスとなる。

傾きの絶対値が1より大きい→
直線が通るマス枠横線(黄色)の上マスが射線経路マスとなる。

<例>傾きの絶対値が1より小さい(↑北)
射線切り原理08

射線切り原理02
<例>傾きの絶対値が1より大きい(↑北)
射線切り原理11
4つのマスで作られる交差点付近を通る赤線が結構シビアになりますが、
計算しないで済む分楽かもしれないヾ(´▽`;)ゝドウナンデショー


○同位置関係からの各壁と射線の関係(↑北)
射線切り原理03

上図からわかるように同位置関係にあっても、壁の配置が変わると
射線が切れたり切れなかったりします。


○近距離での各方向の壁による射線切り判定(↑北)
射線切り原理04

射線切り判定は左上から順に、

通 切 切 切
通 切 通 通

図で説明してもイマイチ感が拭えないぺんぎんであった。
ピョン ピョン ピョン γγγ彡ヽ(*'∀')ノ逃亡



君と僕とのニゲルナ (*'ω')人(;'∀')ノ ピタッ

コメント

コメントの投稿

トラックバック

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。