- ベストアンサー
オートシェイプ円弧の中心点、半径の求め方について
既に記入済みのオートシェイプ円弧図形を選択し、現在の半径を表示し、中心点からスケールをかけるマクロを作成しているのですが、円弧図形の半径、中心点の算出方法がわからない為、行き詰ってしまいました。形状によっては、HeightやWidth、Sinなどで出すことが出来る場合もあるのですが、楕円弧を除く形状に汎用的に使える方法を探しています。 Adjustments.Item(1)と(2)を変更して、円にしてから算出する方法も考えたのですが、微妙に円の位置がずれる現象が出た為、断念しました。 ご存知の方がいらっしゃいましたら、ご教授お願い致します。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 『円弧』の存在自体も認識していませんでしたが、少し調べてみました。 おっしゃる通り、手動でも数回に分けて1周させてみると、元の位置に戻らずに、ずれてしまいますね。目視でわかる程度のずれなので、計算誤差とは思えません。 内部の計算処理がおかしいのか、単位を限定して切捨てなどをしているのか(例えば1/72インチ単位とか?)不明ですが、これだとTopやWidthなどから計算して求めても、その結果がエクセルが持っている値とずれる可能性がありますね。 それはさておき、調べて見ると 円弧はAdjustments(1)からAdjustments(2)へと右回りに描かれるようですね。またWidth、Heightは中心と円弧を含む領域として設定されるみたいです。Adjustments自体は通常のx軸から左回りに角度を取っているみたい。 Top、Left、Width、Height(添付図中、T、L、w、hで表記)などが正しい値だとして、理論上の計算値は、以下のようにして求められると思います。 まず、正円であることと、円弧の2点は重なっていないことを前提として… 簡単にするため、0<= Adjustments(1) <90の範囲で考えると、 Adjustments(2)の位置は90度単位で考えて4通りあり、(1),(2)が同じ範囲にあるときはどちらが大きいいかで結果が変わるので2通りに分かれるので、計5通りについて考えれば良いと思います。 (実際には、この4倍の20通りですが、対象形なので座標を回転して計算し、結果を逆変換すれば求められるので5通りで十分) これは、添付のような5通りになります。 ・が(1)側、→が(2側)、rは半径、xyは中心点の座標です。 どちらの点から求めるかで、式は他にも成立しますが、簡単そうなほうを列挙しています。 [1,3]の場合のみ、rを算出する際に0割りの可能性があるので注意が必要です。(2点が異なれば、どちらかの式で求めることが可能) 場合分けをうまくやれば、5通りに分けなくても算出できそうですね。 -------------------------------------------------- 以上を要約すると、おおむね以下の手順になるかと… 1)対象が円弧であることのチェック 2)正円で2点が重なっていないことのチェック 3)点1の位置が0~90にくるように回転角を算出し、T,L,w,hなどを変換 (90度単位の変換なので、基本的に加減算のみで可能) 4)上記の方法でr,x,yを算出 5)中心点の座標を3)の逆変換 -------------------------------------------------- *対象の円弧が回転(図形の回転)、反転などをしていないものと仮定していますが、それも考慮するなら、3)、5)の座標変換部分をまともなものにするだけで、同じ手順で可能だと思われます。 (図形を回転すると、その図形内のサブ座標軸ごと回転しているみたい)←このあたりきちんと確認していません *エクセルの座標系は通常の数学の座標系とはy軸方向が反転していますので、座標変換が通常と異なってくるはずなので注意が必要ですね。 *また、. Adjustments.Countをみてみると8が返ってくるので、想像するところ、残りのデータに中心座標や、半径が記録されているのではないかと思います。(引っ張り出す方法があれば簡単なんですが、プロパティとかあまりきちんと調べてないので…) 以上、取り急ぎ調べて見たので、きちんと確認までできていませんが、ヒントにでもなれば幸いです。
その他の回答 (8)
- fujillin
- ベストアンサー率61% (1594/2576)
- fujillin
- ベストアンサー率61% (1594/2576)
No6、No7です。 あれっ、全然見やすくなってないみたいですね。 同じデータですが、解像度を落として(画像を拡大して)送ってみます。 (400dpiだったのを、データ密度はそのままで96dpiにしたものをUPしてみます。) これでダメだと、部分ずつに分解するぐらいしかないけど、それもバカバカしいので、念のため以下に文章の部分だけ列挙しておきます。 [ 1 , 1 ] (as Θ1 > Θ2) r = w/cosΘ2 x = L y = T + h [ 1 , 1 ] (as Θ1 < Θ2) r = h/2 = w/2 x = L + r y = T + r [ 1 , 2 ] r = w/2 x = L + r y = T + h - r [ 1 , 3 ] r = h/(sinΘ1-sinΘ2) r = w/(cosΘ1-cosΘ2) x = L - rcosΘ2 y = T + rsinΘ1 [ 1 , 4 ] r = w x = L y = T + rsinΘ1
お礼
ご丁寧にテキストでアップして頂き、ありがとうございます。 なんとか頑張ってみたのですが、知識不足もあり[ 1 , 3 ]を上手く導き出すことができませんでした。 度々のお願いで申し訳ありませんが、可能でしたら解説をお願い出来ますでしょうか。
- fujillin
- ベストアンサー率61% (1594/2576)
No6です。 自分でUPした画像を再取得してみると、UPしたときよりもサイズが小さくなっているので、そのままのデータをDLできるのかどうか不明ですが、解像度を約4倍にしたものをUPします。(200Kの制限があるので、このくらいまで) 式は作成したのみで、実際の検証・確認を行っていませんので、ご自分でも確かめてください。(+、-符号などの間違えがあるかも) <以下、図の解説です> ・十字線は、円の中心を軸としたx,yのサブ座標軸を示しています ・赤線の円弧が対象オブジェクト。(・は始点、→は終点を示す) ・赤の点線は、Top、Left、Width、Heightの基準となると思われる枠線 ・[1,2]は始点、終点の位置の場合分け(点が何象限にあるか) ・Θ1、Θ2は弧端の中心からの回転角(=Adjustments) ・T、L、w、hはそれぞれTop、Left、Width、Heightを意味する ・rは円の半径、x、yは中心点の座標値の計算値
- DOUGLAS_
- ベストアンサー率74% (397/534)
#性懲りもなく、また登場してしまいました。 <(_ _)> >微妙に円の位置がずれる現象 について http://blog.goo.ne.jp/tenkasa/e/84ba84294d6a3ddb4a0227c53d434d3a をご覧ください。 ご参考になれば幸いです。 <(_ _)>
お礼
追加詳細情報ありがとうございます。 非常に解かりやすい形で解説頂き、ずれのメカニズムが何となく理解できてきました。もしかして単純なミスをしているのかと心配になっていました。 当初はこの位置ズレがおきない図形で偶々テストをしていたので、円に変更して算出すればOKなどと簡単に考えていたのですが、この問題が発生してからは迷宮入りしてしまいここにご相談を持ち掛けさせて頂いた状態です。 今回ご質問させて頂いた内容とは別になるかもしれませんが、この現象もなんとかしないと、図形がらみのコマンドでは他にも何か出そうな気がしますので、引き続き調査して私の方でも何か分かりましたらご報告させて頂きます。
- redfox63
- ベストアンサー率71% (1325/1856)
すみません #3ですが m(__)m 回答の後半部分の半径の求め方ですがこれは間違ってますね 始点が X/Y軸上にある場合にしか適用できないようです 円弧が第1象限内始点終点があるなら 左下が中心なように思います 同様に第2(X-/Y+)なら右下、第3(X-/Y-)なら右上、第4(X+/Y-)なら左上 描画済みの円弧からの情報では中心/半径を正確に求めるのは困難なように思います
お礼
補足情報ありがとうございます。 確かに円弧からの情報だけで、正解を導き出すのは非常に難しそうですね。。。スケール程度簡単などと侮っていたら、恐ろしく面倒で泣きが入っています。 円弧⇒円の形状変更時に位置がずれるのをどうにか防止できるか、もしくは#6さんの算術で割り出すかを試してみたいと思います。
- redfox63
- ベストアンサー率71% (1325/1856)
ShapeのHightやWidth、Top、Leftなどから 円弧の始点、終点を求めることが不能なのではないでしょうか 始点、終点の座標がわかっていて開き角がわかっているなら その2点の距離の半分と開き角の半分のSINから半径は求めることが出来ます x1,y1が始点、x2,y2が終点 開き角がAngle(度)とするなら w = x1 - x2 h = y1 - y2 l = sqr( w * w + h * h ) / 2 ' 円周率の算出 pi = atn(1) * 4 r = l / sin( Angle * pi / ( 180 * 2 ) ) といった具合に算出できます 中心の計算は 始点(または終点)に対して x1 + r * cos(開始角度) y1 + r * sin(開始角度) といった具合で求められそうです ... +-の符号などは考慮する必要がありそうですが Arcの場合開きが90度以下なら WidthまたはHightのどちらか大きいほうが半径 90度超えて180度未満なら 短いほうが半径 180度を超えて270度未満なら長いほうの半分が半径 270度を超えた場合は Width,Heightともに同じなのでこの半分 といった具合だろうと思います
お礼
ご回答ありがとうございます。 始点、終点の開き角はAdjustmentsで参照出来たのですが、残りの情報はtop、Left、height、widthしか分からない状態となっております。 ご指摘の通り始点終点座標が分かれば三角関数の組み合わせで算出出来るかと思うのですが、図形情報から始点終点座標を導き出す方法を見つける事が出来ておりません。 よろしくお願い致します。
- DOUGLAS_
- ベストアンサー率74% (397/534)
[回答番号:No.1] の DOUGLAS_ です。 先ず、お詫びから。。。 >というようなコトなら、私にでも割り出せます とんでもない思い上がりでした。 Sub Macro1() Dim myDeg As Single ActiveSheet.Shapes.AddShape(msoShapeArc, 100#, 100#, 100#, 100#).Select For myDeg = 1 To 360 Selection.ShapeRange.Adjustments.Item(1) = myDeg Application.ScreenUpdating = True If myDeg Mod 90 = 0 Then Application.Wait (Now + TimeValue("0:00:2")) Next End Sub 新規ブックで上記のマクロをお試しいただけるとお分かりになるかと存じますが、myDeg が 90℃ ごとに円弧の位置がずれていきます。 当然、「既に記入済みのオートシェイプ円弧図形」には、IncrementRotation メソッドで回転もかけられているものもあろうかと存じますので、「円弧図形の半径、中心点の算出方法」は簡単ではない、ということに今頃気が付いた次第です。お恥ずかしい。。。 ちょっと私には荷が重すぎますので、ご参考になりそうなものをご紹介して、とりあえずこの場から逃げさせていただきます。ご要望にお応えできなくて申し訳ございませんでした。 指定された2点を通る円弧を描くVBAです。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1320207633 #私自身が検証して、「円弧図形の半径、中心点の算出方法」を考えればよいのでしょうが、時間がかかりそうですので、ご紹介だけにさせていただきます。ご参考になるとよいのですが。。。 <(_ _)>
お礼
ご回答ありがとうございます。 >先ず、お詫びから。。。 とんでもないです。貴重なお時間の中アドバイス頂き感謝しております。ご紹介頂いたページを参考に再度悩んでみたいと思います。
- DOUGLAS_
- ベストアンサー率74% (397/534)
#回答ではありません。回答が全然付かないようですので、恐る恐る書いてみますね。 (笑 (^凹^) ご質問のカテゴリが >プログラミング > Visual Basic とのコトですが、プログラム言語とかバージョンとかをお示しになった方が回答が付きやすいのかなぁ、と感じました。 あと、CG関係かなと存じますが、 >中心点からスケールをかける とは、どういう意味でしょうか? 例えば、エクセルのVBAで、ワークシート内に配置された >既に記入済みのオートシェイプ円弧図形を選択し >円弧図形の半径、中心点の算出方法 というようなコトなら、私にでも割り出せますし、それでもご参考に供せるようでしたら、試してはみますが。。。
お礼
ご指摘ご意見ありがとうございます。言語はExcel2003のVBAで作成しています。 スケールとは、円弧を選択して倍率を指定すると選択した円弧の中心を基準点に図形を縮小拡大することを意味していました。半径はその際に現在の大きさの目安となるように表示させます。 処理としては選択円弧を削除して、中心点から円弧を書き直すつもりです。 可能でしたらお教え頂ければと思います。よろしくお願い致します。
お礼
詳細な事例でのご回答ありがとうございます。 まさに今、紹介頂いているような方法で算出できないかと考えていたのですが、どうにも頭で整理がつかずに大変だな、と思うばかりで全く考えが纏まらない迷宮状態でした。しかし、添付資料で頂いたまとめを見て少し光が見えてきました。実際コーティングしていく際に行き詰る可能性もありますが、チャレンジしてみようと思います。 また、大変申し訳ありませんが、添付が若干滲んで見えづらい個所がありましたので、もし可能でしたら少し解像度の高いものを参照させて頂けますでしょうか。 よろしくお願い致します。