〜 ナンバー 〜
2点間の距離を取得

ある点から真横や真上・真下にある点までの距離は、座標間の差分を求めれば得ることが出来ますが、
縦横共に異なっている場合はこの求め方では算出できません。
この場合に役立つのが三平方の定理(ピタゴラスの定理)と呼ばれるもので、
直角三角形の「縦辺を2乗した長さ」と「横辺を2乗した長さ」は「斜辺を2乗した長さ」と等しいことから
平方根の算出により斜線の長さを求めるサンプルを参考に載せておきます。
尚、ルートを求めるHSP3以降にあるsqrt関数がHSP2には実装されていないので、
コチラにあるニュートンラプソン法で求めています。
	

sqrt ルート
ルートルート値を指定する。
尚、2乗するとルート値になる元の値は整数の範囲でstatに返される。

getdiag X座標1, Y座標1, X座標2, Y座標2
X座標11つ目の座標のうちX座標を指定する。
尚、取得した斜線の長さはstatに返される。
内部でgetdiminfo命令を使用しているため、getdiag命令の前にgetdiminfo命令を定義すること!
Y座標11つ目の座標のうちY座標を指定する。
X座標22つ目の座標のうちX座標を指定する。
Y座標22つ目の座標のうちY座標を指定する。

 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
#module
#deffunc sqrt int
	mref value
	mref stt, 64
	if value >= 0x7FFFFFFF | (value <= 0) : stt = 0 : return
	i = value + 1 / 2
	repeat
		i.1 = i.0
		i.0 = value / i.0 + i.0 / 2
		if i >= i.1 : break
	loop
	stt = i - (i > i.1)
	return

#deffunc getdiag int, int, int, int
	mref x1, 0 : mref y1, 1 : mref x2, 2 : mref y2, 3
	mref stt, 64
	sqrt (x1 - x2) * (x1 - x2) + ((y1 - y2) * (y1 - y2))
	return
#global

	randomize
	repeat 15
		repeat 4 : rnd p.cnt, 400 : loop
		getdiag p, p.1, p.2, p.3
		pos  10, cnt * 30 : mes "(" + p + ", " + p.1 + ") (" + p.2 + ", " + p.3 + ")"
		pos 200, cnt * 30 : mes "斜辺の長さ=" + stat
	loop
	stop

斜線の長さ = getdiag(X座標1, Y座標1, X座標2, Y座標2)
斜線の長さ取得した斜線の長さの受取先を指定する。
X座標11つ目の座標のうちX座標を指定する。
Y座標11つ目の座標のうちY座標を指定する。
X座標22つ目の座標のうちX座標を指定する。
Y座標22つ目の座標のうちY座標を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
#define ctype getdiag(%1, %2, %3, %4) sqrt((%1 - %3) * (%1 - %3) + (%2 - %4) * (%2 - %4))

	randomize
	repeat 15
		repeat 4 : p.cnt = rnd(400) : loop
		pos  10, cnt * 30 : mes "(" + p + ", " + p.1 + ") (" + p.2 + ", " + p.3 + ")"
		pos 200, cnt * 30 : mes "斜辺の長さ=" + getdiag(p, p.1, p.2, p.3)
	loop