Indexへ
(1853)//【1855】→(1858)
------------------------
【タイトル】楕円弧の始角、終角の意味
【記事番号】 1855 (*)
【 日時 】05/04/30 15:47
【 発言者 】ひでと

楕円弧の始角と終角の値ですが、楕円の中心からの角度とは違うようです。
JWC_TEMP.TXTの始角と終角の考えかたについて教えていただきたいのですが、
よろしくお願いします。


Indexへ
(1855)←【1858】→(1860)
------------------------
【タイトル】Re(1):楕円弧の始角、終角の意味
【記事番号】 1858 (1855)
【 日時 】05/04/30 16:05
【 発言者 】コジマ

▼ひでとさん:
>楕円弧の始角と終角の値ですが、楕円の中心からの角度とは違うようです。
>JWC_TEMP.TXTの始角と終角の考えかたについて教えていただきたいのですが、
>よろしくお願いします。

私の、個人的な感想ですが、始角と終角の角度は、
あくまでも、円弧時の値で、始角と終角の座標位置は、楕円の扁平率を乗じた位置のようです。

たとえば、扁平率0.6の場合、始角と終角のy座標位置は、円弧の時のy座標値に0.6を乗じた値。(よって、角度が変わります。)


以下は私の経験です。

線と円の交点で円を分割する外変を作成したのですが
楕円の時は、交点以外の位置で分割されます。(未だに解決していません)


Indexへ
(1858)←【1860】→(1872)
------------------------
【タイトル】Re(2):楕円弧の始角、終角の意味
【記事番号】 1860 (1858)
【 日時 】05/04/30 16:48
【 発言者 】ひでと

▼コジマさん:
>▼ひでとさん:
>>楕円弧の始角と終角の値ですが、楕円の中心からの角度とは違うようです。
>>JWC_TEMP.TXTの始角と終角の考えかたについて教えていただきたいのですが、
>>よろしくお願いします。
>
>私の、個人的な感想ですが、始角と終角の角度は、
>あくまでも、円弧時の値で、始角と終角の座標位置は、楕円の扁平率を乗じた位置のようです。
>
>たとえば、扁平率0.6の場合、始角と終角のy座標位置は、円弧の時のy座標値に0.6を乗じた値。(よって、角度が変わります。)
>
>
>以下は私の経験です。
>
>線と円の交点で円を分割する外変を作成したのですが
>楕円の時は、交点以外の位置で分割されます。(未だに解決していません)

早速に教えていただき、大変ありがとうございました。
楕円弧の長軸角度を0にして半径rの円を仮定したところうまくいきました。
 a=r
 b=扁平率*a
 x=r*cos(Ang/180*Pai)
 y=((1-x^2/a^2)*b^2)^0.5
 newAng=atn(y/x)*180/Pai

こんな感じで求める事ができました。ありがとうございました。


Indexへ
(1860)←【1872】→(1876)
------------------------
【タイトル】Re(2):楕円弧の始角、終角の意味
【記事番号】 1872 (1858)
【 日時 】05/05/06 10:08
【 発言者 】名無し

▼コジマさん:
>
>線と円の交点で円を分割する外変を作成したのですが
>楕円の時は、交点以外の位置で分割されます。(未だに解決していません)

楕円と直線の交点を求める場合、楕円を一旦真円に変換(短軸方向の距離を扁平率で割る)して、直線も同様に座標変換します
変換した円と線の交点を求め、その点座標を楕円の扁平率で再度楕円上の点に変換します

角度0の楕円の場合
中心座標0,0半径100扁平率0.5の楕円と、始点-115,-70終点0,80の直線の交点は
中心座標0,0半径100の真円と、始点-115,-35終点0,160の直線との交点を求め(この場合-95.241,30.482と-32.759,94.482)これを楕円の扁平率で座標変換して(-95.241,-15.241と-32.759,47.241)求められます


Indexへ
(1872)←【1876】→(1901)
------------------------
【タイトル】Re(3):アドバイス有難うがざいます。
【記事番号】 1876 (1872)
【 日時 】05/05/06 20:03
【 発言者 】コジマ

▼名無しさん:
>▼コジマさん:
>>
>>線と円の交点で円を分割する外変を作成したのですが
>>楕円の時は、交点以外の位置で分割されます。(未だに解決していません)
>
>楕円と直線の交点を求める場合、楕円を一旦真円に変換(短軸方向の距離を扁平率で割る)して、直線も同様に座標変換します
>変換した円と線の交点を求め、その点座標を楕円の扁平率で再度楕円上の点に変換します
>
>角度0の楕円の場合
>中心座標0,0半径100扁平率0.5の楕円と、始点-115,-70終点0,80の直線の交点は
>中心座標0,0半径100の真円と、始点-115,-35終点0,160の直線との交点を求め(この場合-95.241,30.482と-32.759,94.482)これを楕円の扁平率で座標変換して(-95.241,-15.241と-32.759,47.241)求められます


的確なアドバイス有難うございます。

楕円中心から、線の始点及び終点のy座標値を扁平率で割った値にすればいいのですね。

多少バグは、残っているかも知れませんが、一応完成しました。

スクリプトが長すぎて、送信エラーになりましたので、分けることにしました。

◎バッチファイル(ファイル名 円分割.bat)

@REM 円を線との交点で分割する
@echo off
REM #jww
REM #cd
REM #ht10
REM #zz
REM #h1
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -Ks 円分割.rb temp.txt > jwc_temp.txt


Indexへ
(1876)←【1901】→(1888)
------------------------
【タイトル】Re(4):スクリプトファイル
【記事番号】 1901 (1876)
【 日時 】05/05/10 20:27
【 発言者 】コジマ

◎スクリプトファイル(ファイル名 円分割.rb)
kankaku=1
sen=[];by=[]
include Math
while ARGF.gets
    xy=split
    if xy[0]=~/^hs/
        xy[1..-1].each{|item|by<    end
    if xy[0]=~/^lg/
        lg=xy[0][2,1];zusun=by[lg.hex]
    end
    if xy[0]=~/^[0-9]/ or xy[0]=~/^-/
        xy.collect!{|item|item.to_f}
        if xy[2]            xy[2],xy[0],xy[3],xy[1]=xy[0],xy[2],xy[1],xy[3]
        elsif xy[2]==xy[0]
            if xy[3]                xy[3],xy[1]=xy[1],xy[3]
            end
        end
        sen<    end
end
puts "hd"
open("temp.txt","r"){|f|
    while line=f.gets
        xy=line.split
        if xy[0]=~/^hq/
        elsif xy[0]=~/^ci/
            kakudo=[]
            xy.collect!{|item|item.to_f}

            if xy.size==4
                x=xy[1]
                y=xy[2]
                r=xy[3]
                xy[4]=0
                xy[5]=0
                xy[6]=1
                xy[7]=0
            else
                x=xy[1]
                y=xy[2]
                r=xy[3]
            end

            hen=xy[6]
            ziku=xy[7]
            ziku_arg=ziku*2*PI/360

            sen.each{|item|
                sen_x=item[2]-item[0]
                sen_y=item[3]-item[1]
                sen_kakudo1=atan2(sen_y,sen_x)

                en_x1=x-item[0]
                en_y1=y-item[1]
                en_x2=item[2]-x
                en_y2=item[3]-y
                en_xy1=sqrt(en_x1**2+en_y1**2)
                en_xy2=sqrt(en_x2**2+en_y2**2)
                en_kakudo1=atan2(en_y1,en_x1)
                en_kakudo2=atan2(en_y2,en_x2)

                sen_x1=x-en_xy1*cos(en_kakudo1-ziku_arg)
                sen_y1=y-en_xy1*sin(en_kakudo1-ziku_arg)/hen
                sen_x2=x+en_xy2*cos(en_kakudo2-ziku_arg)
                sen_y2=y+en_xy2*sin(en_kakudo2-ziku_arg)/hen
                senx=(sen_x2-sen_x1)
                seny=(sen_y2-sen_y1)
                sen_kakudo2=atan2(seny,senx)

                en_kakudo2_1=atan2((y-sen_y1),x-sen_x1)
                en_xy2_1=sqrt((y-sen_y1)**2+(x-sen_x1)**2)
                en_xy2_2=sqrt((sen_y2-y)**2+(sen_x2-x)**2)
                henkaku=sen_kakudo2-en_kakudo2_1
                y1=en_xy2_1*sin(henkaku)

                if r>y1.abs

                    x1=sqrt(r**2-y1**2)
                    kakudo1=atan2(y1,-x1)
                    kakudo2=atan2(y1,x1)

                    if en_xy2_1>r &&
                            (sen_x1                        cos(kakudo1+sen_kakudo2) &&
                            sen_x2>xy[1]+r*
                        cos(kakudo1+sen_kakudo2) or
                            sen_y1                        sin(kakudo1+sen_kakudo2) &&
                            sen_y2>xy[2]+r*
                        sin(kakudo1+sen_kakudo2))

                        kakudo<<
                    (kakudo1+sen_kakudo2)*360/(2*PI)
                    end

                    if en_xy2_2>r &&
                            (sen_x2>xy[1]+r*
                        cos(kakudo2+sen_kakudo2) &&
                            sen_x1                        cos(kakudo2+sen_kakudo2) or
                            sen_y2>xy[2]+r*
                        sin(kakudo2+sen_kakudo2) &&
                            sen_y1                        sin(kakudo2+sen_kakudo2))

                        kakudo<<
                    (kakudo2+sen_kakudo2)*360/(2*PI)
                    end
                end}

                if kakudo.size!=0
                    darg=(zusun*kankaku/r)*360/(2*PI)

                    kakudo.collect!{|item|if item<0
                                360+item
                            else
                                item
                            end}
                    kakudo.sort!

                    kakudo.delete_if{|item|
                    if xy[4]                        xy[4]>item && xy[5]>item or
                        xy[4]                    elsif xy[4]>xy[5]
                        xy[4]>item && xy[5]                    end}
                end
                if kakudo.size!=0
                    kakudo_1=kakudo.select{|item|
                            xy[4]                    kakudo_2=kakudo.select{|item|
                            xy[5]>item}
                    if kakudo_1.size!=0
                        kakudo_3=kakudo-kakudo_1
                        kakudo_4=kakudo_1+kakudo_3
                    else
                        kakudo_4=kakudo
                    end
                    if kakudo_2.size!=0
                        kakudo_5=kakudo_4-kakudo_2
                        kakudo6=kakudo_5+kakudo_2
                    else
                        kakudo6=kakudo_4
                    end

                        if xy[4]==xy[5]
                        printf("ci %.10f %.10f %.10f %.10f %.10f %.10f %.10f\n",xy[1],xy[2],xy[3],kakudo6[-1]+darg,kakudo6[0]-darg,xy[6],ziku)
                        else
                        printf("ci %.10f %.10f %.10f %.10f %.10f %.10f %.10f\n",xy[1],xy[2],xy[3],xy[4],kakudo6[0]-darg,xy[6],ziku)
                        printf("ci %.10f %.10f %.10f %.10f %.10f %.10f %.10f\n",xy[1],xy[2],xy[3],kakudo6[-1]+darg,xy[5],xy[6],ziku)
                        end

                        0.upto(kakudo6.size-2){|n|
                        printf("ci %.10f %.10f %.10f %.10f %.10f %.10f %.10f\n",xy[1],xy[2],xy[3],kakudo6[n]+darg,kakudo6[n+1]-darg,xy[6],ziku)}

                else
                    print line
                end
        else
            print $_
        end
    end
}


Indexへ
(1901)←【1888】→(1890)
------------------------
【タイトル】Re(2):楕円弧の始角、終角の意味
【記事番号】 1888 (1858)
【 日時 】05/05/09 18:45
【 発言者 】ひでと

コジマ様、その節はありがとうございました。
教えていただいた楕円の角度の算出を利用して、
多角形に切り取りする外変を作成しました。指示点を数点選択すると
それを結ぶ多角形の内部を切り取り、または他の線種、線色に変換してくれます。
線分、円、円弧、楕円、楕円弧の処理ができます。
ただ、VisualBasicを使用していますので、こちらでは残念ながら載せられません。
いつか、なんとかしたいと思っています。
改めて、ありがとうございました。


Indexへ
(1888)←【1890】//(1857)
------------------------
【タイトル】Re(3):ライブラリへの登録
【記事番号】 1890 (1888)
【 日時 】05/05/09 21:45
【 発言者 】コジマ

▼ひでとさん:
>ただ、VisualBasicを使用していますので、こちらでは残念ながら載せられません。
>いつか、なんとかしたいと思っています。

実行ファイルや、長いスクリプトなどは、オープンライブラリへの登録をお奨めします。

私のお奨めは以下のサイト(nifty建築フォーラム)です。

http://forum.nifty.com/farchi/

この掲示板でおなじみの、スター様やKITI様も、数点登録されています。
(私は、3点登録しています)