プロが教えるわが家の防犯対策術!

楕円と円の交点を求める方法を教えてください。

A 回答 (2件)

もう少し付け加えると、交点が二つある、一つある(接点)、交わらない、場合に分けられますね。


いや違う交点が四つ、三つもあるんだった。(恥)
原点の周りに楕円を置き(-a,0)、(a,0)を二焦点とする式を作る。
半径rの円をその周りで動かしてみるというのが一番簡単な解き方でしょう。

この回答への補足

ご教示いただきありがとうございました。
下記の一般の楕円と円との交点を解析的に求めたいのですが、可能でしょうか?
ax^2 + bxy + cy^2 + dx + ey + f = 0
(x-p)^2 + (y-q)^2 = r
また、球面上の楕円と円の交点の求め方もお教えください。

補足日時:2008/03/27 07:50
    • good
    • 0

連立方程式を解く

    • good
    • 0
この回答へのお礼

ご教示いただきありがとうございました。

お礼日時:2008/03/27 07:57

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q2つの楕円の交点の求め方が分かりません。

x軸方向に長径がa、y軸方向に短径がbの楕円を描きます。・・・・(1)
この楕円を、x軸方向にcだけ(ただし、0<c<aとする。)、y軸方向にbだけ平行複写した楕円を描きます。・・・・(2)
(1)と(2)の交点P1、P2を求めたいです。

それぞれの楕円は次の式で表されると思います。
x*x/a/a + y*y/b/b=1 ・・・・(1)
(x-c)*(x-c)/a/a + (y-b)*(y-b)/b/b=1 ・・・・(2)

両式にa*a*b*bを掛け、差を取ると次のようになります。
b*c*(-2*x+c)+a*a*(-2*y+b)=0

これをxについて解くと
x=a*a*(-2*y+b*(1+c^2))/2b/c・・・・(3)
となります。

(3)を(1)に代入して整理すると
4*(a*a+c*c)*y*y -4*a*a*b*(1+c*c)*y +b*b*(a*a*(1+c*c)*(1+c*c)-4*c*c)=0・・・・(4)
---------- ================ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
となります。

(4)のうち、---部をA、===部をB、^^^部をC とすると、解の公式より
y=(-B±√(B*B-4*A*C)/2/A
で解けると思いました。

ためしにa=50, b=30, c=10として計算してみたところ、
√の中が
マイナスとなってしまいます。
つまり、解なし、ということらしいです。

どうやったら交点が求まるのでしょうか。
教えてください。よろしくお願いします。

x軸方向に長径がa、y軸方向に短径がbの楕円を描きます。・・・・(1)
この楕円を、x軸方向にcだけ(ただし、0<c<aとする。)、y軸方向にbだけ平行複写した楕円を描きます。・・・・(2)
(1)と(2)の交点P1、P2を求めたいです。

それぞれの楕円は次の式で表されると思います。
x*x/a/a + y*y/b/b=1 ・・・・(1)
(x-c)*(x-c)/a/a + (y-b)*(y-b)/b/b=1 ・・・・(2)

両式にa*a*b*bを掛け、差を取ると次のようになります。
b*c*(-2*x+c)+a*a*(-2*y+b)=0

これをxについて解くと
x=a*a*(-2*y+b*(1+c^2))/2b/c・...続きを読む

Aベストアンサー

別の解法を。

X=x/a
Y=y/b
C=c/a
とおけば、
X^2 + Y^2 = 1
(X-C)^2 + (Y-1)^2 = 1
となり、計算が簡単になります。

Q楕円と直線の交点を求めるには

<楕円>
原点座標:(DX,DY)
X軸の半径:a
Y軸の半径:b
 角度:なし
<直線>
始点座標:(SX,SY)
終点座標:(EX,EY)

 この2つの図形が交わるかどうか、また交わる場合にはその交点の座標を知りたいのです。
 「楕円の方程式」「直線の方程式」「解の公式」を使用して手で計算することはできるのですが、
計算式として表すことができません。(中学レベル程度の知識なので・・・)
EXCELで数式を設定したいので、上の変数名を使用した具体的な計算式を教えていただければありがたいです。
よろしくお願いいたします。

Aベストアンサー

手で計算できるなら、Excelで計算することは十分可能と思われますが・・・
ポイントは、解の式を、いきなり与えられた文字で表そうとするのではなく、
・線分の式の係数
・線分の式を楕円の式に代入してできる2次方程式の係数
をそれぞれ算出するようにすれば、無理はないのではないでしょうか?

具体的には、
線分の式をy=mx+nとすれば、m=(EY-SY)/(EX-SX), n=SY-m*SX
楕円に代入すると、(x-DX)^2/a^2+(mx+n-DY)^2/b^2=1
これを整理して、px^2-2qx+r=0とすれば、
p=(1/a^2)+(m^2/b^2)
q=(DX/a^2)+((DY-n)/b^2)
r=(DX^2/a^2)+((DY-n)^2/b^2)-1
解は、x=(q±√(q^2-pr))/p

このm,n,p,q,r,(2つの)xをEXCELで書くのはなんとでもなりませんか?
あとは、SX<=x<=EXに含まれるかを判定すればよいでしょう。
もちろん、q^2-pr<0の場合は、即「交点なし」です。

手で計算するのと、ほんと同じでしょう?

手で計算できるなら、Excelで計算することは十分可能と思われますが・・・
ポイントは、解の式を、いきなり与えられた文字で表そうとするのではなく、
・線分の式の係数
・線分の式を楕円の式に代入してできる2次方程式の係数
をそれぞれ算出するようにすれば、無理はないのではないでしょうか?

具体的には、
線分の式をy=mx+nとすれば、m=(EY-SY)/(EX-SX), n=SY-m*SX
楕円に代入すると、(x-DX)^2/a^2+(mx+n-DY)^2/b^2=1
これを整理して、px^2-2qx+r=0とすれば、
p=(1/a^2)+(m^2/b^2)
q=(DX/a^2)+((...続きを読む

Q楕円の円周&円弧長

仕事で楕円を連続的な直線に直して描画するプログラムを組んでいます。
そこで、楕円の円周&円弧長を求めたいのですが、方法がわかりません。どなたか助けてください。。。

Aベストアンサー

#1さんのご指摘の通り楕円の弧長を求める式は第2種の楕円積分∫Sqrt(1-k^2)dφ=E(φ,p)(ここで積分範囲は下限0、上限φ、kはパラメータ・・・詳しいことは楕円積分のテキストを参照してください)となり、これは初等関数では求まりません。そこで近似法を用いることになるわけですが、s:楕円の周長、p=b/a:楕円の短長比として、近似式を求められたURLがありますので、一度覗かれてはいかがでしょうか。

参考URL:http://www.shaku8.com/seika/tsubushi1.htm

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Q円柱をある角度で切断時の楕円形状算式

Ф70の円柱がX軸20度、Y軸10度傾いた状態で切断すると楕円になると思いますが、その場合の楕円の中心軸の傾きと断面形状の計算式はどの様になるのでしょうか。

Aベストアンサー

円柱の軸は初めはZ軸に平行で、そこからX軸周りに20度、Y軸周りに10度、この順で傾ければいいんでしょうか?

だとすれば、Z軸に平行な単位ベクトルez=(0,0,1)をX軸周りに20度まわすと (0、sin20°、cos20°)
これを更にY軸周りに10度まわすと (cos20°sin10°、sin20°、cos20°cos10°)
これが軸の方向ベクトル(pとします)。小数で示すとだいたい (0.1632,0.3420,0.9254)

Z軸とのなす角をθとすると ezとpの内積は 1・1・cosθ=0+0+cos20°cos10°
  θ≒arccos(0.9254)≒22.27°
XY平面との断面形状は 長径が70/cos22.27°≒75.64
短径は70の楕円。
 計算違いがあったらゴメンなさい。

Q円→楕円への写像

単位円 x^2+y^2=1
楕円  (x/a)^2+(y/b)^2=1
があって,原点から半直線を引くと,円と楕円それぞれに交点が出来ますよね?
このとき,円との交点に楕円との交点を対応させる写像はどう書けますか?

Aベストアンサー

#1です。
返答が遅くなってしまって、すみません。

>やりたいことは,勝手に単位円と楕円が与えられたときに,
>その間の写像を構成したいのです.
>なので,短辺,長辺が単位円の半径と一致しているとは限りませんよね.
そうですね。
先の添付のような位置関係は、ある意味まれですよね。
逆に、そこまで「持っていけばいい」と考えてみると

1) 単位円に対して、軸方向に対する拡大・縮小変換:Sx(a) or Sy(a)をおこない、
2) 回転変換:R(θ)で回転させて、軸を回し、
3) その後、平行移動する。

1)や 2)は、1次変換の行列として表すことができますね。
・x軸方向に a倍:Sx(a)= ( a, 0; 0, 1 )
・y軸方向に a倍:Sy(a)= ( 1, 0; 0, a )
・回転変換:R(θ)= ( cosθ, -sinθ; sinθ, cosθ )

最後の平行移動は、単純に (x, y)→ (x-p, y-q)と表すことができます。

といったところだと思います。


人気Q&Aランキング