※タイトル	図形を回転したり座標を回転する機能

※作者		スクリプツ・ラボ有限会社

※ 改訂記録 ※
※ 2026.10.02	Mind9のguilubの拡張機能として作成
※		当面は本ソース単独で使います。アプリケーションからは
※		[ "rotate.src"を コンパイル。 ]
※		の形で利用してください。
※ 2026.10.10	「中心と半径と角度を指定し直線のIDを取得」を
※		test-rotate.src 内からこちらに移動した。
※ 改訂終り ※


	グローバル。

座標群を捨てるとは  (X1、Y1、X2、Y2 ・・、・・、座標数 → ・)
	(個数を) 二倍し イベント引数を捨てる
	。

透過的に多点座標をダンプとは (X1、Y1、X2、Y2 ・・、・・、座標数 → <同左>)
		_個数は	変数
		_位置は	変数
	複写し 二倍したものを _個数に 入れ
	_個数を _位置に 入れ		※←一番奥から処理する
	_個数が ゼロ?
		ならば 「なし」を 一行表示し
			終り
		つぎに
	_個数を 2で 割り
	回数指定し
	  (TOS=パラメータ1、パラメータ2、・・、座標数)
		回数が 1より 大きい
			ならば 「 | 」を 表示し
			つぎに
		_位置で 個数含みn番目のデータを得て 数値表示し
「,」を 表示し
		_位置から 一つ引き 個数含みn番目のデータを得て 数値表示し
		2だけ _位置を 減少し
	繰り返し
	改行し
	。

多点座標をダンプとは (X1、Y1、X2、Y2 ・・、・・、座標数 → ・)
	透過的に多点座標をダンプし
	座標群を捨てる
	。

座標変換最大は 数値 50。

	ローカル。

透過的に座標の個数をチェックとは 処理単語 .N (個数 → 個数、真偽)
	複写したものが 1から 座標変換最大の 範囲?。

このメッセージで透過的に座標の個数を検証とは 処理単語 NS XSW (個数 → 個数)
		ErrorMessageは 文字列
	ErrorMessageに 入れ
	透過的に座標の個数をチェックし 偽?
		ならば (個数を) 捨て
			ErrorMessageで 重大エラー
		つぎに
	。

ピクセル位置を検証とは (XまたはY → 真偽)
	※−−−−−−−−−−−−−−−−−−−−−−−−−−−※
	※ 注:呼び出し側では変数に代入する前にこれを呼ぶこと ※
	※   (文字列かも知れないという検査をおこなうため) ※
	※−−−−−−−−−−−−−−−−−−−−−−−−−−−※
	複写し バイト数フィールドが ゼロ以外
		ならば ※−−−−−−−−−※
			※ 文字列はエラー ※
			※−−−−−−−−−※
			捨て
			偽を 返し
			終り
		つぎに
	※−−−−※
	※ 整数 ※
	※−−−−※
	絶対値をとり 0から 画面縦横最高の 範囲?
		でなければ
			※−−−−−−−−−−−※
			※ サイズが過小・過大 ※
			※−−−−−−−−−−−※
			偽を 返し
			終り
		つぎに
	真を 返すこと。

透過的にX/Y位置を検証とは (X位置、Y位置 → [X位置、Y位置、真] | 偽)
  (TOS=Xsize、Ysize)
	交換し
  (TOS=Ysize、Xsize)
	複写し ピクセル位置を検証し 偽?
		ならば 二つ捨て
		  (TOS=空)
			偽を 返し
			終り
		つぎに
	交換し
  (TOS=Xsize、Ysize)
	複写し ピクセル位置を検証し 偽?
		ならば 二つ捨て
		  (TOS=空)
			偽を 返し
			終り
		つぎに
  (TOS=Xsize、Ysize)
	真を 返すこと
	。

一つの座標を回転とは (X、Y、中心X、中心Y、sin積、cos積 → X、Y)
		_X座標は	変数
		_Y座標は	変数
		_中心Xは	変数
		_中心Yは	変数
		_相対Xは	変数
		_相対Yは	変数
		_sin積は	小数変数
		_cos積は	小数変数
	_X座標と _Y座標と _中心Xと _中心Yと _sin積と _cos積に 入れ
	[_相対X := _X座標 − _中心X]
	[_相対Y := _Y座標 − _中心Y]

	[_相対X * _cos積 − _相対Y * _sin積 ]を 整数化し _中心Xを 加え
	[_相対X * _sin積 + _相対Y * _cos積 ]を 整数化し _中心Yを 加え
	。

	グローバル。

座標群を回転とは 処理単語 NN XSW (X1、Y1、X2、Y2 ・・ 座標数、中心X、中心Y、角度 → X1、Y1、X2、Y2、個数)
		_個数は	変数
		_中心Xは	変数
		_中心Yは	変数
		_角度は	変数
		_角度小数は	小数変数
		_θは		小数変数
		_sin積は	小数変数
		_cos積は	小数変数
		_座標位置は	変数
		_元のXは	変数
		_元のYは	変数

		変換後Xは 座標変換最大の 変数
		変換後Yは 座標変換最大の 変数
	※
  文言個数は 「座標群を回転に与える座標個数が誤りです」
	※
  文言座標は 「座標群を回転に与える座標が誤りです」
	※
  文言IDは 「座標群を回転に与える図形IDが誤りです」
	※
  本体とは
 (TOS=X1、Y1、X2、Y2 ・・、個数、中心X、中心Y、角度)
	_中心Xと _中心Yと _角度に 入れ
 (TOS=X1、Y1、X2、Y2 ・・、個数)
	文言個数で このメッセージで透過的に座標の個数を検証し
	複写し _個数に 入れ
	(個数を) 捨て
	※
	_角度を 小数化し _角度小数に 入れ

	radian(_角度小数)を _θに 入れ

	0.0から sin(_θ)を f引き _sin積に 入れ  ※←数学とはY軸が逆なので補正
	cos(_θ)を _cos積に 入れ

 (TOS=X1、Y1、X2、Y2 ・・)
	_個数を _座標位置に 入れ
	_個数を
	回数指定し
		透過的にX/Y位置を検証し 偽?
			ならば 文言座標で 重大エラー
			つぎに
		_元のXと _元のYに 入れ

		_元のXと _元のYをつみ
		 _中心Xと _中心Yをつみ
		  _sin積と _cos積をつみ
		   一つの座標を回転し
		    変換後X(_座標位置)と 変換後Y(_座標位置)に 入れ

		_座標位置を 一つ減少し
	繰り返し
	※
 (TOS=空)
	_個数を
	回数指定し
		変換後X(回数)と 変換後Y(回数)をつみ
	繰り返し
	_個数といっしょに 返す
	。

透過的に多点座標の中心を計算とは 処理単語 NN XSW (X1、Y1、X2、Y2、・・、座標数 → X1、Y1、X2、Y2、・・、座標数)
		_座標数は	変数
		_Xは		変数
		_Yは		変数
		_累積Xは	変数
		_累積Yは	変数
		_位置は	変数
	※
  文言個数は 「透過的に多点座標の中心を計算に与える座標個数が誤りです」
	※
  文言座標は 「透過的に多点座標の中心を計算に与える座標が誤りです」
	※
  文言IDは 「透過的に多点座標の中心を計算に与える図形IDが誤りです」
	※
  本体とは
 (TOS=X1、Y1、X2、Y2、・・、座標数)
	文言個数で このメッセージで透過的に座標の個数を検証し
	複写し _座標数に 入れ
	※
 (TOS=X1、Y1、X2、Y2、・・、座標数)
	_累積Xを クリアし
	_累積Yを クリアし
	_座標数を 二倍し _位置に 入れ		※←一番奥から処理する
	_座標数を
	回数指定し
	 (TOS=X1、Y1、X2、Y2、・・、座標数)
		_位置で      個数含みn番目のデータを得て _Xに 入れ
		_位置を 一つ引き 個数含みn番目のデータを得て _Yに 入れ

		_Xと _Yをつみ 透過的にX/Y位置を検証し 偽?
			ならば 文言座標で 重大エラー
			つぎに
		(スタックのXとYを) 二つ捨て

		_累積Xに _Xを 加え _累積Xに 入れ
		_累積Yに _Yを 加え _累積Yに 入れ

		2だけ _位置を 減少し
	繰り返し
	※
 (TOS=X1、Y1、X2、Y2 ・・、座標数)
	_累積Xをつみ _座標数で 割り
	 _累積Yをつみ _座標数で 割り
 (TOS=X1、Y1、X2、Y2 ・・、座標数、中心X、中心Y)
	。


極座標を直交座標に変換とは (原点X、原点Y、距離、角度 → X、Y)
		原点Xは	変数
		原点Yは	変数
		距離は		変数
		角度は		変数

	原点Xと 原点Yと 距離と 角度に 入れ
	「極座標を直交座標に変換との入口」で このメッセージでスタック検査し
	※/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\※
	[原点X + 距離] [ 原点Y ]と
	 1個をつみ
	  原点X、原点Y
	   角度で
	    座標群を回転し
	※\_____________/※
 (TOS=X,Y、個数)
	(個数を) 捨て
 (TOS=X,Y)
	。


※/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\※
※		直線の中央座標と半径(長さの半分)を	  ※
※		指定するような描画のための処理単語     ※

中心と半径と角度を指定し直線のIDを取得とは (キャンバスID、中心X、中心Y、半径、角度 → 図形ID)
		_キャンバスは	変数
		中心Xは	変数
		中心Yは	変数
		半径1は	変数
		角度は		変数
		_左端Xは 変数  _左端Yは	変数
		_右端Xは 変数  _右端Yは	変数

	_キャンバスと 中心Xと 中心Yと 半径1と 角度に 入れ
	「中心と半径と角度を指定し直線のIDを取得の入口」で このメッセージでスタック検査し

	_キャンバスをつみ
	※/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\※
	 中心Xから 半径1を 引き
	  中心Yをつみ
	   中心Xに 半径1を 加え、
	    中心Yをつみ
		 2個をつみ
		  中心Xと 中心Yと
		   角度で
		    座標群を回転し
	※\_____________/※

 (TOS=キャンバス、X1,Y1,X2,Y2、個数)
	(個数を) 捨て
 (TOS=キャンバス、X1,Y1,X2,Y2)
	直線のIDを取得すること
	。
※							※
※\_________________________/※


※ 終り(rotate.src) ※