個人事業主の方必見!確定申告のお悩み解決

円柱の表面と直線との交点を求める一般解を調べているのですが、わかりません。

よろしくお願いします。

A 回答 (2件)

前回のアドバイスで、後は機械的に出ると思いますが...。



直線の媒介変数方程式を円柱の方程式に代入します。
(前回は書き落としましたが、λ・μの少なくとも一方はゼロでないことを仮定します。)
(λt+x0)^2+(μt+y0)^2=r^2
(λ^2+μ^2)t^2+2(λx0+μy0)t+(x0^2+y0^2-r^2)=0
ここで、D=(λx0+μy0)^2-(λ^2+μ^2)(x0^2+y0^2-r^2)とすると、

D<0の時、解はなし。

D=0の時、t=-(λx0+μy0)/(λ^2+μ^2)より
 x=-λ(λx0+μy0)/(λ^2+μ^2)+x0
 y=-μ(λx0+μy0)/(λ^2+μ^2)+y0
 z=-ν(λx0+μy0)/(λ^2+μ^2)+z0

D>0の時、t=(-(λx0+μy0)±√D)/(λ^2+μ^2)
 x=λ(-(λx0+μy0)±√D)/(λ^2+μ^2)+x0
 y=λ(-(λx0+μy0)±√D)/(λ^2+μ^2)+y0
 z=λ(-(λx0+μy0)±√D)/(λ^2+μ^2)+z0

不注意な計算ミスが無ければこれで良いはずですが、ご自身で確認してみて下さい。
    • good
    • 0

円柱は適当に座標系をとれば


x^2+y^2=r^2
と表せます。
直線を、媒介変数を使って
x=λt+x0
y=μt+y0
z=νt+z0
と表し、上の式に代入すれば、単なる二次方程式になります。

この回答への補足

大変手数なのですが、ranxさんの回答の例を示していただけませんか? どうぞお願いいたします。

補足日時:2002/11/04 17:26
    • good
    • 0

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

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

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

Q円柱と円の方程式

円柱と円の方程式

円柱の方程式を調べてみたところ、

x^2+y^2=1

と分かりました。
しかし、これは、半径1の円の方程式ではないのでしょうか?

また、x^2+y^2=x というようなものも発見しました。
これも円柱の方程式なのでしょうか?

よろしくお願いします。

Aベストアンサー

こんばんわ。

x^2+ y^2= 1に加えて
・「z= 0」や「z= 1」や「xy平面上において」などとあれば、円になります。
・特に、何も書かれてなければ、zはなんでもよいことになるので、無限に長い円柱(円筒?)になります。
・「0≦ z≦ 5」などと書かれていれば、高さが 5の円柱になります。

空間図形を考えるときには、x, y, zの 3つの座標を考えることになりますから、何も書かれてなければ自由に値をとっていいことになります。

ただし、座標の値は実数ですから、x^2+ y^2+ z^2= 1(半径 1の球)といった場合には、何も書かれてなくても取り得る値に制限がかかります。
(実数であることがある意味制限ですね。)

Q球面と直線の交点

点P(Px,Py,Pz)から方向ベクトル(x,y,z)にのびた直線が、原点O(0,0,0)、半径rの球の表面と交わる点Qの座標を求めたいのですが、どなたか教えていただけないでしょうか。

O-P-Qの三角形を作ると、辺OPの長さ、辺OQの長さ(=r)と∠OPQの角度は求まるので、余弦定理から辺PQの長さが求まります。
辺PQの長さに方向ベクトル(x,y,z)を掛ければ、ベクトルPQが求まるので、ベクトルOP+ベクトルPQ=ベクトルOQが求まると思うのですが、間違っているでしょうか。

Aベストアンサー

なにやら難しいことをお考えのようですが、以下のようにやれば簡単です。

直線は、(X,Y,Z)=(Px,Py,Pz)+t(x,y,z)と表されるので、直線上の点(X,Y,Z)は、
 X=Px+tx
 Y=Py+ty
 Z=Pz+tz
である。(※)

これを球の方程式X^2+Y^2+Z^2=r^2に代入し、tの2次方程式を解いてtの値(2つ。ただし、接するなら1つ)を求め、※に代入すれば、Qの座標がわかる。

Q3次元座標2点からの直線式の求め方

お世話になります。

3次元座標2点からの直線式(ax+by+cz=0)の求め方を教えて下さい。

2次元座標であれば、1つの傾きから算出できるのですが、3次元座標になると、X-Y平面、Y-Z平面での傾きの使い方がこんがらかってしまいます。
基本的な質問で申し訳ありませんが、よろしくお願い致します。

座標1 = (x1,y1,z1)
座標2 = (x2,y2,z2)

以上

Aベストアンサー

> 直線式(ax+by+cz=0)の求め方を教えて下さい。
3次元座標では(ax+by+cz=0)は原点を通る平面になり、直線の式ではありません。ax+by+cz=dは平面の一般式です。

2点を通る直線の式には公式があります。
以下のように簡単に導けます。
点(x1,y1,z1)を通り方向ベクトル(x2-x1,y2-y1,z2-z1)の直線ですから
媒介変数形式で
(x,y,z)=(x1,y1,z1)+t(x2-x1,y2-y1,z2-z1)
と成ります。
これを変形してすれば
(x-x1)/(x2-x1)=(y-y1)/(y2-y1)=(z-z1)/(z2-z1)
と3次元座標の直線の式となります。

Q空間上の円の方程式について

空間上にある、3点P1(x1,y1,z1),P2(x2,y2,z2)
P3(x3,y3,z3)を通る円の方程式を求めよ。

平面の方程式は、法線ベクトルにより
求められる所までは分かっています。
空間における円の方程式は、球と平面の
交線で表せるというのは、わかったのですが、
この後、どーすれば良いのかが分かりません。

どなたか、よろしくお願いします。

Aベストアンサー

3点を通る円の方程式でしょ?球じゃなくて。
適当な座標変換
(X,Y,Z)' = A (x,y,z)'
('は転置、Aは実数値の3×3行列で、AA' = I (単位行列))を使って、与えられた3点が
(X1,Y1,0), (X2,Y2,0), (X3,Y3,0)
に変換されるようにすれば、(このようなAは何通りもあります。)
Z=0の平面上の3点を通る円を決める問題になります。

 円の方程式
(X-B)^2 + (Y-C)^2 = R^2
は、3次元で見るとZが出てこない訳ですから、(球ではなく)軸がZ軸と平行な円柱を表しています。この方程式(つまりB,C,Rの値)が得られたら、これと、方程式
(X,Y,0)' = A (x,y,z)'
(Z=0の平面を表します。)とを連立させれば、X,Yが直ちに消去でき、x,y,zを含む2本の方程式が得られます。

Q円柱表面上における接線について

例えば、1枚の用紙(平面Π)の上に円を書いて、その円を C、C の中心をO、Cの円周上の任意の点をP、Pにおける円Cの接線をLとします。

そして、中心O から平面Πの法線ベクトル方向に円を積み重ねていくと(同じ円を書いた用紙を積み重ねていくイメージ)、底面を円Cとした円柱ができると思います。

この時、接線Lは円柱の表面上Pにおける一つの接線だと思うのですが、このLを 直線OP(Oを基点にPを通って、無限彼方へ伸びる直線)を中心に360°任意に回転してもそれは全て円柱の表面における、点Pを通る接線と呼べるのでしょうか?

(これが、円柱ではなく 球表面における任意の点Pを通る接線なら、そのLを球の中心OからPを通る直線を中心に360°、どのように回転しても接線と呼べると思うのですが、円柱の場合イメージができません)

Aベストアンサー

断面(のエッジ)を数式的に求めてもいいのですが、
視覚的には、円筒部分を持つ酒瓶などに半分くらい水を入れて、それを傾け、その水面の形状をご覧になれば直感的に理解しやすいかもしれません。

Q3D座標上のベクトルをを2D平面に投影・・・

まず、3次元座標上のあるベクトル(例:(x、y、z)=(1,1,1))をx-z平面上に投影します。
その投影された、ベクトルとx軸の成す角度を、ラジアンか角度で算出したいのですが、C++でどう書いていいのかわかりません。

アルゴリズムがわかっていても、C++でかけないという初心者です。
誰か、算出の方法を教えてください。お願いします。

Aベストアンサー

ベクトル、転置を~および ' で表します。3次元ベクトル p~=(a,b,c)' を x-z 平面に投影すれば ベクトル q~=(a,0,c)' が得られます。これと x 軸方向の単位ベクトル e~=(1,0,0)'とのなす角度をθとすれば |e~|=1 なので

cos(θ)
= (q~,e~)/|q~| 
= a/√(a^2+c^2) ------------------- (1)

から

θ = arccos(a/√(a^2+c^2)) ---------- (2)

が得られます。私は C++ ではなく C 言語のレベルですが、この計算は C言語では下記のようになります。()はプログラムではなく説明文です。

//変数定義
double a,b,c;
double theta;
:::::
:::::
//実行段階
(ここで a,b,c に値を入れる)
:::::
theta = acos(a/sqrt(a*a+c*c));
:::::
(ここで答え theta を表示、出力、あるいは利用する)

ベクトル、転置を~および ' で表します。3次元ベクトル p~=(a,b,c)' を x-z 平面に投影すれば ベクトル q~=(a,0,c)' が得られます。これと x 軸方向の単位ベクトル e~=(1,0,0)'とのなす角度をθとすれば |e~|=1 なので

cos(θ)
= (q~,e~)/|q~| 
= a/√(a^2+c^2) ------------------- (1)

から

θ = arccos(a/√(a^2+c^2)) ---------- (2)

が得られます。私は C++ ではなく C 言語のレベルですが、この計算は C言語では下記のようになります。()はプログラムではなく説明文です。

//変数定義
doub...続きを読む

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&Aランキング