アプリ版:「スタンプのみでお礼する」機能のリリースについて

直線と傾きのある楕円の交点を求めたい

http://www17.ocn.ne.jp/~lite/pro97doc.html#TOP

こちらを参考にさせて頂き、直線と楕円の交点を求める関数を作成しております。
傾きを持たない楕円と直線の交点はこれで求められたのですが、
楕円に傾きがある場合、うまく交点を求められません。
どなたか足りない計算、誤っている箇所等お教え願えないでしょうか。

pt1:線の始点
pt2:線の終点
center:楕円の中心座標
radius:楕円の半径
angle:楕円の角度(傾き)
henpei:楕円の扁平率

'直線の勾配を求める
Dim m As Single = (pt2.Y - pt1.Y) / (pt2.X - pt1.X)

'扁平率(ここはかならず長辺/短編?)
Dim w As Double = henpei / 100

'楕円の傾き(ラジアン)
Dim radian As Single = angle * (Math.PI / 180)

'参考元のaとbの長さを求める?
Dim a1 As Single = center.X'原点Xからの中心Xまでの距離
Dim b1 As Single = center.Y'原点Yからの中心Yまでの距離

Dim A As Double = CDbl((m ^ 2) + (w ^ 2))
Dim B As Double = CDbl(-2 * (m ^ 2) * pt1.X + 2 * m * (pt1.Y - b1) - 2 * a1 * (w ^ 2))
Dim C As Double = CDbl((m ^ 2) * (pt1.X ^ 2) - 2 * m * (pt1.Y - b1) * pt1.X + ((pt1.Y - b1) ^ 2) - (radius * w) ^ 2 + (a1 * w) ^ 2)
Dim D As Double = CDbl((B ^ 2) - (4 * A * C))

'交点無し
If D < 0 Then Return crossPoints

'2点を求める
Dim x1 As Single = CSng((-B + Math.Sqrt(D)) / (2 * A))
Dim y1 As Single = pt1.Y + m * (x1 - pt1.X)
Dim x2 As Single = CSng((-B - Math.Sqrt(D)) / (2 * A))
Dim y2 As Single = pt1.Y + m * (x2 - pt1.X)

A 回答 (1件)

参考にしたサイトの「直線と楕円との交点を求める」解法は、


座標系を回転させ、傾きのない楕円にしてから交点を求めています。

楕円の傾きがθの場合は、
・直線と楕円を-θ回転する。(傾きのない楕円になる)
・交点の座標を求める。
・交点の座標をθ回転する。

回転の計算は、
座標(x,y)のθ回転=(x*cosθ-y*sinθ,x*sinθ+y*cosθ)
    • good
    • 1
この回答へのお礼

ご返信、誠にありがとう御座います。
お教え頂きました内容を反映致しましたところ無事、交点を求める事が出来ました。

本当に、本当に有難う御座いました。

お礼日時:2010/08/08 15:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!