ラベル 三角関数 の投稿を表示しています。 すべての投稿を表示
ラベル 三角関数 の投稿を表示しています。 すべての投稿を表示

2012年11月7日水曜日

matrixと逆三角関数

「他人様の褌で相撲を取る」を座右の銘として、DTP業界コバンザメとして棲息してきたものの、さすがに限界。ここ3年はスポイルされ警備が本業です。

「やり残しのはじめの一歩」をDTPに必要な三角関数から入り、基礎から理解しようと挑戦をしたのですが、高校時代ろくに勉強をしなかった身としては投げ出さざるをえません。放置したままにするのもなんなので、ここまでのログ。

この件はあかねさんの「IllustratorでApplescript」にも書かれている

得られたmatrixは、わけわかめ。
{class:matrix, mvalue_a:0.707106649876, mvalue_b:-0.70710670948, mvalue_c:0.707106649876, mvalue_d:0.707106649876, mvalue_tx:316.75048828125, mvalue_ty:587.07666015625}
AppleScriptを使って、Illustratorに貼られた画像の拡大縮小率を得るにはで解決されたのだが、そこにはアフィン変換やらmatrixなどという難しい用語が登場する。

アフィン変換はアフィン変換 画像処理ソリューションが分かりやすい。

で、adobeのMatrixクラス - 変換行列でなんとなく理解できます。(あくまでも何となく)



a: 水平方向の伸縮率 = 変換後の幅/もとの幅
b: 垂直方向の傾斜率 = 垂直方向の傾斜/もとの幅
c: 水平方向の傾斜率 = 水平方向の傾斜/もとの高さ
d: 垂直方向の伸縮率 = 変換後の高さ/もとの高さ
tx: 水平方向の移動ピクセル数
ty: 垂直方向の移動ピクセル数



回転がかかった場合、アフィン変換 画像処理ソリューションの図を参考





 

mvalue_a:0.707106649876, mvalue_b:-0.70710670948, mvalue_c:0.707106649876, mvalue_d:0.707106649876, mvalue_tx:316.75048828125, mvalue_ty:587.07666015625

aとdは同じ数値ですから単純に回転がかかったものと判断できます。

TransformMatrix.swf 
に{class:matrix, mvalue_a:0.707106649876, mvalue_b:-0.70710670948, mvalue_c:0.707106649876, mvalue_d:0.707106649876, mvalue_tx:316.75048828125, mvalue_ty:587.07666015625}の数値を入力すると


はい、遊べます。
なんとなく分かった錯覚に陥ります。

でも角度は出てきません。
数値から角度を逆算する必要が出てきます。


逆三角関数(度)サイトで数値から角度が出てきます。こんな↓感じ。


何とかここまでは達しましたけど逆三角関数が分かりませんので、それを使ったスクリプトなんぞ、とてもとても。。。です。
理解できずに「他人様の褌で相撲を取る」のはコバンザメのプライドが傷つきますが、この件に関しては仕方ありません。もっとも今後、使う機会があるかどうかも(ry

でもTransformMatrix.swfだけでなく角度とラジアンでも図がいじって遊べるのが嬉しい^^



んで全然、話は違うけど、最近やたら気になること。
せうぞーさんのブログが更新されてない。もう4ヶ月にもなります。


2012年10月15日月曜日

DTPに必要な三角関数

以下の図を作成するとき、どうしてますか?
人によってやり方は様々ですが、自分は今まで角度40を作成してから、半径25の円を眼見当で線分に接してました(恥
別なやり方として「三角関数」を使ってキッチリ作成する方法があります。
角度20で高さ25の直角三角形の幅を求めればいいわけです。

角度と高さから底辺と斜辺を計算サイトで求められます。

a=b/tan20 で、答えは68.68693548636。

印刷物にしてしまえば小数点第2位以下の誤差は分かりません。けれどデータを作成する上で眼見当で作成したのか、三角関数を使って作成したのかで、後で大きく違ってきます。


Illustratorに貼り込まれた画像のサイズをリスト化する処理が必要となり、先週末からいろいろとトライしている。オブジェクトのプロパティからは幅と高さが参照できるのだが、どうやら回転がかかった場合は回転がかかった時の幅と高さになる模様。つまりオブジェクトの本来の幅と高さではなく、相対的な幅と高さということになる。対応策としては「回転を外した状態にしてから幅と高さを求める」というのが素直な考えだが、残念ながら回転の値が存在しない。IllustratorのオブジェクトはInDesignやQuarkXPressのようにボックスの左上を基準とした座標値や回転値などから場所を割り出すのではなく、6つのマトリックスを用いた方法で表現しているようで、ここらへんになってくるとお手上げだった。

上図で20°の角度が分からないから幅a'と高さb'が算出できないということ。
しかし角度が分かったとしても三角関数が理解できていないとa'とb'は出てこない。
35年前に高校を卒業してから一度も使ったことのない三角関数の復習をさせていただきました。
blogに書きながらの三角関数の復習です。


赤線の三角形は相似形なので角度は同じ。三角形の各辺の長さを求める公式は下図の場合

a=b/tanΘ もしくは a=c*cosΘ
b=a/tanΘ もしくは b=c*sinΘ
c=a/cosΘ もしくは c=b/sinΘ

これらの公式から
1. 79=a'*cos20+b'*sin20
2. 64=b'*cos20+a'*sin20

ここまででaとa'、bとb'とやったために分かりにくくなったな。。。と反省。
でもこのままいく。

要は上記の2つの式からb'を消せば、a'が導き出せる。
ここで中学で習った連立方程式がでてくる。

1. の両辺にcos20をかける  2. の両辺にsin20をかける

1. 79*cos20=a'*cos20*cos20+b'*sin20*cos20
2. 64*sin20=b'*cos20*sin20+a'*sin20*cos20

1. の式から2. の式を引き算すればb'が消える。

79*cos20-64*sin20=a'*cos20*cos20-a'*sin20*sin20

整理すると
a'=(79*cos20-64*sin20)/(cos20*cos20-sin20*sin20)

同様のやり方で
b'=(79*sin20-64*cos20)/(sin20*sin20-cos20*cos20)

この辺は計算がやっかいなので
wolframalpha.com がお薦め

よってa'=68.333、b'=43.236となる。基礎学力の大切さを改めて痛感した次第。。。


2012年10月12日金曜日

やり残しのはじめの一歩

DTPに戻れるはずなどなく、かといって警備で骨を埋める覚悟もできず、相変わらず宙ぶらりんな日々を過ごしてます。

CLさんがDTPから離れたのを機に諦めがつきましたが、それでもここへきてやり残したことがいくつかあったので。

最初に見たときから能力的に無理と放置してた事例が、ほぼ5年前のネタ

掲示板に神の啓示  
Illustratorに貼り込まれた画像のサイズをリスト化する処理が必要となり、先週末からいろいろとトライしている。オブジェクトのプロパティからは幅と高さが参照できるのだが、どうやら回転がかかった場合は回転がかかった時の幅と高さになる模様。つまりオブジェクトの本来の幅と高さではなく、相対的な幅と高さということになる。
対応策としては「回転を外した状態にしてから幅と高さを求める」というのが素直な考えだが、残念ながら回転の値が存在しない。IllustratorのオブジェクトはInDesignやQuarkXPressのようにボックスの左上を基準とした座標値や回転値などから場所を割り出すのではなく、6つのマトリックスを用いた方法で表現しているようで、ここらへんになってくるとお手上げだった。
答えは
(DTPtechNote:1750) Re: Illustratorのオブジェクト情報

かと思いきや、イケッチさんのBBSで修正されているのでメモ

13 イラストレータ変形率を返すルーチン

投稿者:イケッチ 投稿日:2008/03/03(Mon) 23:31
せいぞーさんのBBSに書き込んだ者に誤りがあったので修正

on get_henkei_of_link_info(thePlacedItem)
tell application “Adobe Illustrator”
set theClass to class of thePlacedItem
if theClass is not placed item and theClass is not raster item then return 0
set theMatrix to matrix of thePlacedItem
set _a to mvalue_a of theMatrix
set _b to mvalue_b of theMatrix
set _c to mvalue_c of theMatrix
set _d to mvalue_d of theMatrix
set theRad to do javascript “Math.atan2(” & _b & “,” & _a & “);”
set tateRad to do javascript “Math.atan2(” & _d & “,” & _c & “);”
set tateRatio to do javascript “Math.cos(” & theRad - tateRad - 0.5 * pi & “);”
if tateRatio < 0 then
set tateRatio to -tateRatio
end if
set tateRatio to ((tateRatio * ((_c ^ 2 + _d ^ 2) ^ 0.5) + 5.0E-6) div 1.0E-5) * 1.0E-3
set yokoRatio to (((_a ^ 2 + _b ^ 2) ^ 0.5 + 5.0E-6) div 1.0E-5) * 1.0E-3
set theAngle to theRad * 180 / pi
if theAngle < 0 then
set theAngle to -((theAngle - 5.0E-4) div 1.0E-3) * 1.0E-3
else
set theAngle to -((theAngle + 5.0E-4) div 1.0E-3) * 1.0E-3
end if
return {yoko:yokoRatio, tate:tateRatio, kaiten:-theAngle}
end tell
end get_henkei_of_link_info

tell application “Adobe Illustrator”
my get_henkei_of_link_info(item 1 of selection of document 1)
end tell


三角関数の復習と理解から始めなくてはなりませんので苦労してます(^^;

しばらく三角関数の入門メモ書きが続きますので分かる人は無視してください。

といっても、このblogを読んでる人は7人くらいのもので断る必要もないのですが。。。