縁の下の力持ち関数1
取得系の命令・関数には、大きく2タイプに分類できると思います。
基となるデータ(変数やイベント)から、情報の抽出、そのデータの位置やサイズを知るためのもの。
もう1つは、指定した一定の値や範囲から、ある一定の法則に従い、計算されるもの。
参考までに後者の例を挙げますと、rnd関数のようなものです。
今回は、この後者の演算された値を取得するタイプの紹介でございまして、
ものによっては、取得された結果値を参照しても、正しいのか正しくないのかが分かりにくいのもあります。
今章については、見てすぐに分かるものだけのはずですが、
分からないもので、なんでそんな結果となるのか、と不思議に思う命令・関数が出てきたときは、
そういうものだと割り切って考える必要もあるのではないでしょうか。
尚、今章と次章は、全てHSP3から新規に追加されたものばかりです。


下記は、指定された数値を、任意の範囲内に丸めたい時に使用する関数です。
結果 = limit(対象値, 最小値, 最大値)
結果丸められた整数値の受け取り先。
対象値丸め対象とする整数値または、変数を指定する。
最小値丸めたい下限値を指定する。
最大値丸めたい上限値を指定する。
第1パラメータの値が第2パラメータよりも小さい場合は、第2パラメータの値に、 第3パラメータよりも大きい場合は、第3パラメータの値を結果として返します。 例えば、「after = limit(before, 1, 99)」とした場合、
 1
 2
 3
 4
 5
 6
 7
 8
 9
	if before < 1 {
		after = 1
	} else {
		if before > 99 {
			after = 99
		} else {
			after = before
		}
	}
と、書いたことと同じ意味になります。 主に、利用者に入力してもらった値やデータファイルから読み込んだ値を、 必要範囲内の値で処理したいという場合に活用いただけますね。 尚、第2パラメータより第3パラメータに指定した値の方が小さく設定した場合に、 対象値が第2パラメータより小さい場合は第2パラメータと同値を返し、 第3パラメータより大きい場合、第3パラメータの値を返します。 下記を実行して確認してみてください。
 1
 2
 3
	mes "最小値100 < 対象値-50 < 最大値0 を丸めると 結果値" + limit(-50, 100, 0)
	mes "最小値100 < 対象値 50 < 最大値0 を丸めると 結果値" + limit( 50, 100, 0)
	mes "最小値100 < 対象値150 < 最大値0 を丸めると 結果値" + limit(150, 100, 0)
整数値ではなく、実数値を指定範囲内に収めたい場合は、次の関数をどうぞ。
結果 = limitf(対象値, 最小値, 最大値)
結果丸められた実数値の受け取り先。
対象値丸め対象とする実数値または、変数を指定する。
最小値丸めたい下限値を指定する。
最大値丸めたい上限値を指定する。
設定方法などはlimit関数と同じです。 limit関数と異なるのは、絞れる範囲と結果値が実数値になるということだけです。 尚、limit関数で、対象値や最大・最小値を実数にしても、 エラーにはならずに小数点以下は切り捨てられて処理されます。 逆に、limitf関数で対象値や最大・最小値を整数にしても実数値で処理されます。 今回に試して初めてわかったことなのですが、limit関数同様に第2、3パラメータを入れ替え、 第2パラメータの方が第3パラメータよりも大きい値を設定しても、 limit関数と動作が異なり、第3パラメータの値が返るようです。
 1
 2
 3
	mes "最小値100.0 < 対象値-50.0 < 最大値0.0 を丸めると 結果値" + limitf(-50.0, 100.0, 0.0)
	mes "最小値100.0 < 対象値 50.0 < 最大値0.0 を丸めると 結果値" + limitf( 50.0, 100.0, 0.0)
	mes "最小値100.0 < 対象値150.0 < 最大値0.0 を丸めると 結果値" + limitf(150.0, 100.0, 0.0)
続きまして、0からの絶対的な大きさを取得する関数の紹介です。
絶対値 = abs(対象値)
絶対値対象値を絶対値に変換した値の受け取り先。
対象値絶対値に変換したい整数値。
絶対値とは、「マイナス符号を考慮しない数値そのものの大きさ」のことです。 例えば、「−5」「」では「」が大きいですが、絶対値的には「−5」の方が大きい、となります。 符号のありなしだけの違いである「−2」「」では、絶対値的に同じ大きさであるといえます。 この絶対値を得るabs関数は、ABSoluteの略で、簡単に言うと、 パラメータの値にマイナス符号がある場合に、符号だけを除去する関数だと思ってもよいでしょう。 つまり、「after = abs(before)」とした場合、
 1
 2
 3
 4
 5
	if before < 1 {
		after = before * -1
	} else {
		after = before
	}
と、書いたことと同じ意味になります。
 1
 2
 3
 4
	values = -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5
	foreach values
		mes "[" + values.cnt + "]の絶対値は[" + abs(values.cnt) + "]である。"
	loop
整数値はlimit関数、実数値はlimitf関数、と分かれていたのと同じ様に、 abs関数に実数値をパラメータ設定してもエラーにはなりませんが、整数値を返します。 実数値版の絶対値取得関数は下記をお使いください。
絶対値 = absf(対象値)
絶対値対象値を絶対値に変換した値の受け取り先。
対象値絶対値に変換したい実数値。
絶対値の説明については、abs関数側を参照してください。 absf関数の概要・使い方もabs関数と同じなので、あえて説明するまでもないですね。 「マイナス符号が付いてる時だけ−1倍するよ」ってことです。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
	// メモリサイズの決定
	wx = ginfo_winx : wy = ginfo_winy
	unit = wy / 20

*initialize
	redraw 0
	// マウス位置
	px = double(mousex - (wx / 2)) / unit
	py = double(mousey - (wy / 2)) / unit
	color 255, 255, 255 : boxf : color , , 255
	circle wx / 2 - px * unit, wy / 2 - py * unit, wx / 2 + px * unit, wy / 2 + py * unit, 1
	// 横方向メモリ描画
	color 255
	line wx, wy / 2, 0, wy / 2
	repeat wx / unit / 2 + 1
		if cnt \ 5 = 0 : size = 2 : else : size = 1
		line wx / 2 - (unit * cnt), wy / 2 - (size * 10), wx / 2 - (unit * cnt), wy / 2 + (size * 10)
		line wx / 2 + (unit * cnt), wy / 2 - (size * 10), wx / 2 + (unit * cnt), wy / 2 + (size * 10)
	loop
	// 縦方向メモリ描画
	line wx / 2, wy, wx / 2, 0
	repeat wy / unit / 2 + 1
		if cnt \ 5 = 0 : size = 2 : else : size = 1
		line wx / 2 - (size * 10), wy / 2 - (unit * cnt), wx / 2 + (size * 10), wy / 2 - (unit * cnt)
		line wx / 2 - (size * 10), wy / 2 + (unit * cnt), wx / 2 + (size * 10), wy / 2 + (unit * cnt)
	loop
	title "中心からの距離:" + absf(px) + " , " + absf(py) // 絶対値に置き換える
	redraw

*get_position
	// マウス座標を取得
	mx = mousex : my = mousey 
	wait 10
	if mx ! mousex || my ! mousey : goto *initialize
	goto *get_position
最後に紹介するのは、平方根を取得する関数です。
平方根 = sqrt(求める値)
平方根パラメータ値の平方根を返す。
求める値ルート元の値を指定する。
値Xを二乗した時にYになる、この値XのことをYの平方根(ルートX)と呼んでいます。 ルート2は、1.41421356…(一夜一夜に人見ごろ)、 ルート3は、1.7320508…(人並みに奢れや)、 ルート5は、2.2360679…(富士山麓、オウム鳴く)と語呂合わせで習いましたね。 SQareRooTの略である(と思われる)sqrt関数のパラメータに、例えば2を指定すると、 上で書いた1.41421356…の小数点以下第7位を四捨五入した「1.41421」を返します。 この平方根がどんな時に使えるか。 例えば、拙作の距離計測ツールは、三平方の定理を用いて長さを求めています。 三平方(ピタゴラス)の定理は、直角三角形の斜辺の長さを求める時に使うもので、 斜辺の長さを二乗したものは、残り二辺をそれぞれ二乗して加算したものと同じというものですね。 斜辺以外の二辺から、斜辺を二乗した長さを求め、今回のsqrt関数で平方根、即ち元の斜辺を求めるのです。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
	dim hen, 2
	bgscr 0, ginfo_dispx, ginfo_dispy, , 0, 0
	pos  10, 10 : mes "辺A"
	pos  50, 10 : input hen.0, 50, 20, 3
	pos 150, 10 : mes "辺B"
	pos 190, 10 : input hen.1, 50, 20, 3
	pos 300, 10 : button gosub "計算", *calc
	pos 400, 10 : button gosub "終了", *exit
	stop

*calc
	color 255, 255, 255 : boxf 0, 30
	color 255
	line 50, 50, hen.0 + 50, 50
	pos hen.0 / 2 + 30, 30 : mes "辺A:" + hen.0
	color , 255
	line 50, 50, 50, hen.1 + 50
	pos 10, hen.1 / 2 + 30 : mes "辺B:" + hen.1
	color , , 255
	line hen.0 + 50, 50, 50, hen.1 + 50
	pos hen.0 / 2 + 50, hen.1 / 2 + 50 : mes "斜辺:" + sqrt(hen * hen + hen.1 * hen.1) // 斜辺求める
	stop

*exit
	end