座標値の回転No.06029
W.Hiroshi さん 09/01/25 15:41
 
こんにちは、W.hiroshiです。いつもお世話になっています。

XYの座標値を入力したテキストがあります。
この座標値を、X0Y0の座標原点を中心に、90度回転させた数値に書き換えたいです。

本当は、任意の角度で回転させたいのですが、かなり複雑になってしまうと思われま
すので、とりあえず90度ずつ回転させる事としたいのです。
90度であれば、数字そのものは替えることなく、符号を替えれば済みそうかなと思う
のですが。
思いつきだけは、簡単にできそうな気がしたのですが、なかなかスマートなマクロ文
が思い浮かばないので、良いアイデアがありましたら教えてください。


やりたい事

範囲選択した範囲内で、(範囲選択がないときは、全文対象)
X0Y0の座標原点を中心に、90度回転させたい。

Xの数値が[+]、Yの数値が[+]の場合(実際には[+]の文字はない)
Yの数値に[-]符号が付いてXの値に、Xの数値は符号はそのままYの値に

Xaaaa.aaaYbbbb.bbb => X-bbbb.bbbYaaaa.aaa

Xの数値が[-]、Yの数値が[+]の場合(実際には[+]の文字はない)
Yの数値に[-]符号が付いてXの値に、Xの数値は符号はそのままYの値に

X-aaaa.aaaYbbbb.bbb => X-bbbb.bbbY-aaaa.aaa

Xの数値が[-]、Yの数値が[-]の場合
Yの数値は[-]符号が消えてXの値に、Xの数値は符号はそのままYの値に

X-aaaa.aaaY-bbbb.bbb => Xbbbb.bbbY-aaaa.aaa

Xの数値が[+]、Yの数値が[-]の場合(実際には[+]の文字はない)
Yの数値は[-]符号が消えてXの値に、Xの数値はそのままYの値に

Xaaaa.aaaY-bbbb.bbb => Xbbbb.bbbYaaaa.aaa

aaaa.aaa、bbbb.bbbの部分は、小数点以上4桁以下、小数点以下3桁以下の数字
実際のテキストの中には、XY以外の文字もありますが、XY以外の値は全て無視する物
とします。



又、
90度単位ではなく、任意の角度で回転させるような事が秀丸マクロで可能な物でしょ
うか。


Windows XP
秀丸統合版 7.10

[ ]
RE:06029 座標値の回転No.06030
Iranoan さん 09/01/25 16:10
 
 W.Hiroshi さん今日は、Iranoan です。
> XYの座標値を入力したテキストがあります。
> この座標値を、X0Y0の座標原点を中心に、90度回転させた数値に書き換えたいです。
 浮動小数点数版を使えば、HideMath.dll が同梱されており、これに三角関
数があるので、任意の角度で回転する事は簡単ですよ。
 変換式自体は、「回転による座標変換」で検索してくれば、沢山出てきます。

[ ]
RE:06030 座標値の回転No.06031
W.Hiroshi さん 09/01/25 19:41
 
Iranoan さんこんにちは、早速のコメント有り難うございます。

> 浮動小数点数版を使えば、HideMath.dll が同梱されており、これに三角関
>数があるので、任意の角度で回転する事は簡単ですよ。

そうなんですか?
以前ここで紹介して頂いたマクロを使うために、[秀丸 浮動小数点版統合版]を使
っていますが、使いこなしているとは言い難い状況です。

> 変換式自体は、「回転による座標変換」で検索してくれば、沢山出てきます。

変換に関しては、何となくイメージすることが出来ますが、なかなかマクロ文まで到
達できません。
もう少し時間を掛けて勉強してみます。

[ ]
RE:06031 座標値の回転No.06032
Iranoan さん 09/01/25 20:37
 
 W.Hiroshi さん今日は、Iranoan です。
> 変換に関しては、何となくイメージすることが出来ますが、なかなかマクロ文まで到
> 達できません。
 グローバル変数を使って末尾の要領では。
 なお HideMath.dll にどんな DLL 関数が含まれているかは、配布されてい
るソース http://hide.maruo.co.jp/software/bin/hidemath007.lzh
HideMath.txt を見れば解ります。
//------------------------------------------------------------
setfloatmode 1;
loaddll "HideMath.dll";
#x = 10;
#y = 10;
call rotate dllfunc( "Pi" ) / 2;
message str( #x );
message str( #y );
endmacro;

rotate://回転する角度を第一引数としてラジアンで受け取る
  ##tmpX = #x;
  ##tmpY = #y;
  #x = -##tmpX * dllfunc( "Sin", ##1 ) + ##tmpY * dllfunc( "Cos", ##1 );
  #y = ##tmpX * dllfunc( "Cos", ##1 ) + ##tmpY * dllfunc( "Sin", ##1 );
  return;

[ ]
RE:06032 座標値の回転No.06033
h-tom さん 09/01/25 20:57
 

h-tom です。

> なお HideMath.dll にどんな DLL 関数が含まれているかは、配布されてい
>るソース http://hide.maruo.co.jp/software/bin/hidemath007.lzh
>HideMath.txt を見れば解ります。
HideMath.dllの説明は、マクロヘルプに載ってますよ。
・目次− 浮動小数点数モード− HideMath.dll

[ ]
RE:06031 座標値の回転No.06034
山紫水明 さん 09/01/26 22:25
 
 W.Hiroshiさん,

 文系人間なので,三角関数とかラジアンとかは,ン十年前に勉強したきりで,
自信ありませんが,Iranoan さんのご示唆をもとに試みに作ってみました。
//----------------------------------------------------------------//
setfloatmode 1;
loaddll "HideMath.dll";
if( imestate ) imeswitch;
#angle = val(input("回転角(時計回り 単位:度)"));
#angle = -#angle * dllfunc( "Pi" ) / 180;
if( selecting ) {
    #start = seltoplineno;
    #end = selendlineno;
} else {
    #start = 1;
    #end = linecount2;
}
disabledraw;
movetolineno 1, #start;
while( 1 ) {
    $s = gettext2( 0, lineno, linelen2, lineno );
    #py = strstr($s, "Y");
    #x = val(midstr($s, 1, #py - 1));
    #y = val(midstr($s, #py + 1, 99));
    call Replace #x, #y;
    insert "X" + $x2 + "Y" + $y2;
    deleteafter;
    movetolineno 1, lineno + 1;
    if( lineno == #end ) break;
}
endmacro;

Replace:
##x2 = ##1 * dllfunc( "Cos", #angle ) - ##2 * dllfunc( "Sin", #angle );
##y2 = ##1 * dllfunc( "Sin", #angle ) + ##2 * dllfunc( "Cos", #angle );
$x2 = dllfuncstr( "Format", "%.3lf", ##x2 );
$y2 = dllfuncstr( "Format", "%.3lf", ##y2 );
return;
//----------------------------------------------------------------//

     では, (^^)/~
                                    山紫水明
                                    SANSHISUIMEI

[ ]
RE:06034 座標値の回転No.06035
W.Hiroshi さん 09/01/27 21:43
 
Iranoan さん h-tom さん 山紫水明 さん こんにちは
こちらから質問して、早速コメント頂きながら対応が遅くなってしまい申し訳ありま
せんでした。

山紫水明さんに作成頂きましたマクロで、ほぼ想定通りの動きをしているようです。
(まだ、90度ごとの回転でしか確認していないですけど)
山紫水明さんには、いつもお世話になってます。今回もぜひ使わせてください。


通常角度は、反時計回りを「+」としますのでそのようにしたいのですが、

5行目
#angle = -#angle * dllfunc( "Pi" ) / 180;


#angle = #angle * dllfunc( "Pi" ) / 180;
に、変更しただけで問題ないでしょうか。


[ ]
RE:06035 座標値の回転No.06036
山紫水明 さん 09/01/27 22:15
 
 W.Hiroshiさん,

>通常角度は、反時計回りを「+」としますのでそのようにしたいのですが、

 なるほど,それがこういう世界では常識でしたか。

>#angle = #angle * dllfunc( "Pi" ) / 180;
>に、変更しただけで問題ないでしょうか。

 それで問題ありませんが,マクロとしては若干補足すべきことがありますの
で,それも含めて再掲しておきます。
//----------------------------------------------------------------//
setfloatmode 1;
if( 1 / 2 == 0 ) {
    message "浮動小数点数版(統合版)を使ってください。";
    endmacro;
}
loaddll "HideMath.dll";
#ime = imestate;
if( #ime ) imeswitch;
#angle = val(input("回転角( 反時計回り  単位:度 )"));
if( #angle == 0 ) endmacro;
#angle = #angle * dllfunc( "Pi" ) / 180;
if( selecting ) {
    #start = seltoplineno;
    #end = selendlineno;
} else {
    #start = 1;
    #end = linecount2;
}
disabledraw;
movetolineno 1, #start;
while( 1 ) {
    $s = gettext2( 0, lineno, linelen2, lineno );
    #py = strstr($s, "Y");
    #x = val(midstr($s, 1, #py - 1));
    #y = val(midstr($s, #py + 1, 99));
    call Replace #x, #y;
    insert "X" + $x2 + "Y" + $y2;
    deleteafter;
    movetolineno 1, lineno + 1;
    if( lineno == #end ) break;
}
freedll;
if( #ime ) imeswitch;
endmacro;

Replace:
##x2 = ##1 * dllfunc( "Cos", #angle ) - ##2 * dllfunc( "Sin", #angle );
##y2 = ##1 * dllfunc( "Sin", #angle ) + ##2 * dllfunc( "Cos", #angle );
$x2 = dllfuncstr( "Format", "%.3lf", ##x2 );
$y2 = dllfuncstr( "Format", "%.3lf", ##y2 );
return;
//----------------------------------------------------------------//

     では, (^^)/~
                                    山紫水明
                                    SANSHISUIMEI

[ ]
RE:06035 座標値の回転No.06037
アルビレオ さん 09/01/27 22:24
 
ユーザーのアルビレオです。

>通常角度は、反時計回りを「+」としますのでそのようにしたいのですが、
>
>5行目
>#angle = -#angle * dllfunc( "Pi" ) / 180;
>を
>
>#angle = #angle * dllfunc( "Pi" ) / 180;
>に、変更しただけで問題ないでしょうか。

とりあえずはそれで問題はないと思いますが、この件は「回転をどちら回りにす
るか」というより「座標系をどう定義するか」という問題です。
通常数学のグラフなどでは「x座標は左が-、右が+。y座標は下が-、上が+」です
が、秀丸エディタに限らずコンピュータ画面の座標系は「x座標は左が-、右が+。
y座標は上が-、下が+」と上下が逆転しています。
三角関数は (sin0度,cos0度)=(1,0)、(sin90度,cos90度)=(0,1) と決まっている
ので、右回り左回りの違いはあくまで結果であって本質的な違いは座標系の定義
による違いです。

単に回転させるだけならそれほど気にしなくてもいいですが、そこからちょっと
でも複雑なことをしようととすると「単に回転角の符号を反転させればいい」と
いう考えでは意図した結果を得られなくなることは十分にあるので注意しましょ
う。

[ ]
RE:06036 座標値の回転No.06038
W.Hiroshi さん 09/01/28 22:56
 
山紫水明さんこんにちは、W.Hiroshiです。

> それで問題ありませんが,マクロとしては若干補足すべきことがありますの
>で,それも含めて再掲しておきます。

お世話になります。
秀丸の種類や、IMEのONOFFのチェックまで、
さすがにマクロを作り慣れてる人は芸が細かいですね。

普段マクロは、使うことが目的なので、必要に迫られたときになって勉強を始め、あ
る程度のことが何とか出来る様になると、またしばらくマクロ文に触れることがない
ので、忘れてしまって一向に上達しません。

今回のマクロも参考にさせて頂いて、もう少し勉強してみます。
また、つまらない質問をするかもしれませんが、気が向いたときにお付き合い頂けれ
ば有り難いです。

[ ]
RE:06037 座標値の回転No.06039
W.Hiroshi さん 09/01/28 23:02
 
アルビレオさんこんにちは、W.Hiroshiです。

>通常数学のグラフなどでは「x座標は左が-、右が+。y座標は下が-、上が+」です
>が、秀丸エディタに限らずコンピュータ画面の座標系は「x座標は左が-、右が+。
>y座標は上が-、下が+」と上下が逆転しています。

なるほど、そう言われてみればそうですね。
「普段私が使っている座標系では」と言う言葉が必要だったたようですね。

コンピュータ画面の座標系についてはよく分からないのですが、
そもそもなぜ、コンピュータ系はY座標を逆に取っているのでしょうか。
コンピューターが開発されていく当時、すでに数学系の座標の理論は確立されていた
だろうし、当時のエンジニアたちがそれを知らなかったわけではないと思うのですが、
何か特別の理由があるのでしょうか。

単純に、画面左上を基準点(X0Y0)とした為、
数学的には X+Y- の領域に当たるが、基準原点の反対側を表示する必要がない為 Y
 に「+-」の記号を付けて区別する必要がないので「-」記号を省略しただけ
ぐらいに認識していたのですが、

領域としてはともかく、回転などの方向を考えるときはマイナス向きの方向というの
があるので、ややこしいですね。

[ ]
RE:06039 座標値の回転No.06040
アルビレオ さん 09/01/29 01:31
 
アルビレオです。

>コンピュータ画面の座標系についてはよく分からないのですが、
>そもそもなぜ、コンピュータ系はY座標を逆に取っているのでしょうか。
>コンピューターが開発されていく当時、すでに数学系の座標の理論は確立されていた
>だろうし、当時のエンジニアたちがそれを知らなかったわけではないと思うのですが、
>何か特別の理由があるのでしょうか。

もともとコンピュータの画面はグラフを表示するためのものではなく、文字しか
表示できなかったことから来る歴史的理由です。
秀丸エディタを考えればわかると思いますが、テキストを表示するならその座標
系はテキストの開始位置である左上を原点に桁と行をそれぞれX,Yに対応させた
方が便利なんですよ。

のちに性能が上がってグラフィックを表示できるようになったときも、テキスト
とグラフィックでまったく違う座標系になるのは不便なのでテキストに合わせて
左上が原点になりました。
これが3Dになると画面の座標系と論理的な空間座標系の結びつきは弱い(カメラ
の位置しだいで大きく変わるので一致させる必要性が少ない)ために、上方向が
プラスになっていることが多いんですけどね。

[ ]
RE:06039 座標値の回転No.06041
K'zawa さん 09/01/29 01:32
 
W.Hiroshiさん、こんにちは。
K'zawaです。

>そもそもなぜ、コンピュータ系はY座標を逆に取っているのでしょうか。
>コンピューターが開発されていく当時、すでに数学系の座標の理論は確立されていた
>だろうし、当時のエンジニアたちがそれを知らなかったわけではないと思うのですが、
>何か特別の理由があるのでしょうか。

実際のところはわかりませんが、
横書き文章は左上から右そして下へと進みますからね。

[ ]
RE:06040 座標値の回転No.06042
W.Hiroshi さん 09/02/01 20:19
 
アルビレオさん、K'zawaさんこんにちは、W.Hiroshiです。

やはり、通常[Y-]の領域ではあるけれども、[+-]の区別をする必要がないので、[-]
記号を省略した。
と言う認識で、あながち間違いではないようですね。
有り難うございました。

[ ]