スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    視心と90度視円錐を基準に透視図法の消失点の位置を求める手順

    ツイッターで3点透視図の消失点の位置を求める手順を質問され,本を見て思い出したりしたので忘れる前に記事にしておこうと思います.

    本記事では視心と90度の視円錐を基準にして消失点の位置を求める手順を説明します.

    参考文献:パース!マンガでわかる遠近法(マール社)

    一点透視図
    二点透視図
    三点透視図

    前提知識

    以下では「視心(透視図ののまんなか)」と「視円錐」が何であるかを知っていないと記事の内容を理解するのは難しいかもしれません.
    toushizuVP01.jpg

    極端な広角または望遠設定でない場合はキャンパスは40度~60度程度の視円錐の範囲で設定することになるので,90度の視円錐とキャンパスとの関係を比較すると以下のようになります.作図で消失点を求めるにはかなり大きな机が必要になることがわかります.
    toushizuVP02.jpg



    一点透視図
    一点透視では視心が消失点の位置になります.
    toushizuVP1-1.jpg



    二点透視図
    まず最初の消失点は任意の場所に設定できます(この消失点をVP1とします).
    toushizuVP2-1.jpg

    次にVP1から視心に向かって直線を引きます.この直線が地平線になります.
    toushizuVP2-2.jpg

    次に視心を起点として,地平線に直角に直線を引きます(上でも下でもどちらでもOK).
    toushizuVP2-3.jpg

    さらにVP1から先ほど引いた直線と視円錐の交点(Gとします)に向かって直線を引きます.
    toushizuVP2-4.jpg

    最後にGを起点として先ほど引いた直線に直角に,地平線に向かって直線を引きます.この直線と地平線との交点がもう一方の消失点になります.
    toushizuVP2-5.jpg

    二点透視図の場合,二つの消失点の位置している視円錐の角度の和が180になる(たとえばVP1が100度の位置ならVP2
    は80度の位置)ので,作図しなくても大雑把に位置がわかってしまいます.



    三点透視図
    3点透視図の消失点VP1,VP2,,VP3の位置ですが,最初の手順は二点透視と同じ手順を踏みます.

    最初の消失点は二点透視図と同様に任意の位置に設定できます.
    toushizuVP3-1.jpg

    二点透視図のときと同じ要領で以下のように作図します
    1)VP1から視心へ直線を引く
    2)視心を起点にしてこの直線と直角に直線を引く(視円錐との交点をGとする)
    3)VP1からGに向かって直線を引く
    4)Gを起点にこの直線と直角に直線を引く
    toushizuVP3-2.jpg

    次に二点透視図ではもう一方の消失点の位置だった場所(直線1と直線3の交点)に直線1と直角な直線(直線5)を引きます.3点透視図の残りの消失点VP2とVP3はこの直線上に存在することになります.
    toushizuVP3-3.jpg

    直線5上の任意の位置に二番目の消失点VP2を設定し,VP2から視心に向かって直線(直線6)を引きます.
    toushizuVP3-4.jpg

    最後にVP1を通りかつ先ほどの直線6に直角な直線(直線7)を引きます.この直線と直線5との交点が三つ目の消失点VP3になります.
    toushizuVP3-5.jpg

    さすがに3点透視図の作図は複雑ですね.

    3点透視図の作図は,三つの消失点を結んでできる三角形と視心との関係(視心が三角形の垂心の位置にある)を使っています.この性質を利用することで,三つの消失点から視心の位置を求めたりすることも可能です.
    toushizuVP03.jpg
    スポンサーサイト

    tag : 透視図法 消失点

    テキストの内容を比較するアルゴリズム

    diffツールでおなじみの二つのテキストの内容を比較するアルゴリズム,おもしろそうだと思いつつ難しいんだろうなと漠然と思っていて今まで調べることがなかったのですが,近いうちにちょっと必要になりそうだったのでどんなものかと思って今週少し調べたりしていました.

    続きを読む

    テーマ : ソフトウェア開発
    ジャンル : コンピュータ

    tag : アルゴリズム O(NP) テキスト比較

    メモ: postgresql unable to write inside temp の対処

    postgresqlをインストールしようとしてちょっと躓いたのでメモ

    windows7環境でpostgresのインストーラを実行しようとすると「postgresql unable to write inside temp」とダイアログが表示されてインストーラが終わってしまう現象に.ちょっとググって見ると英語の質問(ちょっと古め)が出るのみで,そこを見ると「vbscriptが動いてないと思うよ」の回答があるも,普通にvbscriptうごくよなぁ・・・と困ったりしていました.

    で,テンポラリに展開されたファイルを覗くとこちらにもvbscriptが見つからない,のようなログが残っているのでそちら方面からもう少し調べると,どうもMacafeeの入れなおしなどをするとvbscriptが動かなくなる現象があるようで,そちらの情報を頼りに対処したところ無事にインストーラが動いてくれました.

    Macafee入っている環境でpostgresのインストーラが上記のメッセージだして進まない現象の場合は以下を試すともしかするとうまくいくかもしれません(記事の作者様に感謝).

    マカフィーセキュリティ製品をアンインストールまたは再インストールした場合 VBSの利用が出来なくなる。

    レジストリエディタで値の変更を保存する時に「編集エラー」が出る場合は,上位の項目を右クリックして出るメニューから「アクセス許可」でいったん権限をいじってから保存する必要があります.設定値を保存した後は,アクセス許可を元に戻したほうがいいかも?

    テーマ : ソフトウェア開発
    ジャンル : コンピュータ

    tag : postgresql vbscript

    vb.netからExcelのグラフを作成する&COM参照解放の一工夫

    今回はExcelのグラフをvb.netから作成する基本です.

    VisualStudioとExcelがインストールされている環境で開発を行い,VSTOは使用せずにCOM相互運用で操作をします.

    「これ,苦労したよなぁ」と思ってまとめていたのですが,苦労したのはグラフの作成部分ではなくてそのグラフの整形やら何やらで,プログラムでグラフを作成する場合の特有の問題ではなかったので,その点はまた別の記事にまとめます.結局今回の記事はまとめる必要もあったかなぁ,というレベルの,基本的な話になってしまいました.

    簡単すぎることだけをまとめるのも何なので,最後にCOMオブジェクトの参照を解放するコードについて少し工夫をしてみたのでそれも紹介します.

    続きを読む

    テーマ : ソフトウェア開発
    ジャンル : コンピュータ

    tag : Excel franework .net プログラム

    Excelの列名を列番号から取得する関数

    前回ちょこっと記述しましたが,表計算ソフトのワークシート列名を列番号から作成する関数を作ってみました.

    かかりはじめの時はなかなかきれいにまとまらないのでもやもやしていましたが,再帰を使って記述するとすっきりして,そこからループに展開した非再帰版も作ってみました.

    できあがってみるとなかなかきれいな処理です.再帰処理版と言っても,Integerの最大値2の32乗を渡しても6回までしか再帰呼び出しは発生しない(列名が7桁の文字列になる場合)ので,たいしたコストはかかりません.

    以下,VisualStudio2010で組んだVB.NETのソースですが,他の言語への移植も容易です.

    ' アルファベット文字数(number of alphabet characters
    Private Const NoAC As Integer = 26

    ''' <summary>
    ''' 表計算ワークシート列名作成
    ''' </summary>
    ''' <param name="column">1以上の列番号</param>
    ''' <returns>列名</returns>
    ''' <remarks></remarks>
    Public Function ColumnName(column As Integer) As String
        Dim name As String = String.Empty
        Dim v = column
        Do
            name = Chr(Asc("A"c) + (v - 1) Mod NoAC) & name
            If v <= NoAC Then
                Exit Do
            Else
                v = CInt(Math.Ceiling((v - NoAC) / NoAC))
            End If
        Loop
        Return name
    End Function

    ''' <summary>
    ''' 表計算ワークシート列名作成(再帰処理版)
    ''' </summary>
    ''' <param name="column">1以上の列番号</param>
    ''' <returns>列名</returns>
    ''' <remarks></remarks>
    Public Function ColumnNameR(column As Integer) As String
        Dim name As String = Chr(Asc("A"c) + (column - 1) Mod NoAC)
        If column <= NoAC Then
            Return name
        Else
            Return ColumnNameR(CInt(Math.Ceiling((column - NoAC) / NoAC))) & name
        End If
    End Function


    収束の早い再帰処理を組めるとなんかうれしくなっちゃいますね.

    続きを読む

    テーマ : ソフトウェア開発
    ジャンル : コンピュータ

    tag : Excel franework .net プログラム

    プロフィール

    eikun

    Author:eikun
    なかなかやるきがでない人です

    えいくんち

    twitter

    pixiv

    最新記事
    最新コメント
    最新トラックバック
    月別アーカイブ
    カテゴリ
    検索フォーム
    RSSリンクの表示
    リンク
    ブロとも申請フォーム

    この人とブロともになる

    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。