
C言語で空間上の四面体の体積を求めるプログラムを作りたいんですが、どうすればいいのかわかりません。
構造体を使って空間上(三次元)の4点A,B,C,Dの座標を定義するのですが。
四面体の求め方もわかりません。ヘロンの公式じゃ求められませんよね(^^;
空間上の三角形の面積を求めるプログラムを作ってみました。
少しでも参考になれば幸いです。
よろしくお願いします。
#include <stdio.h>
#include <math.h>
int main(void)
{
double AB, BC, CA, s, m;
struct zahyo
{
double x;
double y;
double z;
}A, B, C;
scanf("%lf %lf %lf",&A.x,&A.y,&A.z);
scanf("%lf %lf %lf",&B.x,&B.y,&B.z);
scanf("%lf %lf %lf",&C.x,&C.y,&C.z);
AB=sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)+(A.z-B.z)*(A.z-B.z));
BC=sqrt((B.x-C.x)*(B.x-C.x)+(B.y-C.y)*(B.y-C.y)+(B.z-C.z)*(B.z-C.z));
CA=sqrt((C.x-A.x)*(C.x-A.x)+(C.y-A.y)*(C.y-A.y)+(C.z-A.z)*(C.z-A.z));
printf("AB=%lf\nBC=%lf\nCA=%lf\n",AB,BC,CA);
s=(AB+BC+CA)/2;
m=sqrt(s*(s-AB)*(s-BC)*(s-CA));
printf("m=%lf\n",m);
return 0;
}
No.4ベストアンサー
- 回答日時:
> (1/6)*(AB*AC)*ADを率直に求めて実行したのですが、結果がでません。
#1 のはじめに少し書いたのですが(分かりにくかったかもしれません),
AB は A から B に向かうベクトルです。AC,AD についても同様です。
(AB×AC)・AD という風に '×' と '・' を使い分けているのには意味があります。
ベクトルの計算ですので C 言語でプログラムを書く場合,成分ごとに計算してやらないといけません。
今,AB の x 成分,y 成分,z 成分をそれぞれ,ABx, ABy, ABz としますと,
ABx = (B の x 座標) - (A の x 座標)
ABy = (B の y 座標) - (A の y 座標)
ABz = (B の z 座標) - (A の z 座標)
です。AC,AD についても同様です。
このとき,
(AB×AC)・AD = (ABy*ACz - ABz*ACy)*ADx
+ (ABz*ACx - ABx*ACz)*ADy
+ (ABx*ACy - ABy*ACx)*ADz
です。
これを使ってプログラムを書いてみてください。
再び回答ありがとうございます。
>ABx = (B の x 座標) - (A の x 座標)
ABy = (B の y 座標) - (A の y 座標)
ABz = (B の z 座標) - (A の z 座標)
のそれぞれの成分を出すのを忘れていました。
たぶんこのまま出来ると思います。
アドバイスありがとうございました。
No.3
- 回答日時:
別の方法の案です。
厳密解で無くても良いという条件で、せっかくコンピュータで計算するのなら、モンテカルロ法のような方法を使ってみては?
簡単化のため、ABCD点のxyzの範囲を0~1とします。
乱数を使って0~1の中の適当な点を決めます。
その点が立体ABCDの内側であるかどうか判定。
面BCDに対して、点Aと同じ側か?
面ACDに対して、点Bと同じ側か?
面ABDに対して、点Cと同じ側か?
面ABCに対して、点Dと同じ側か?
ならは、立体の内側であるとしてhit回数をカウント。
以上をtry回数だけ繰り返して、hit/tryを立体の体積の近似値とする。
ある程度の精度を期待するのなら、それなりの回数繰り返す必要がありますが、プログラムは作りやすいと思います。
最近のPCだと、かなりのマシンパワーが稼げるので…。
--
モンテカルロ法で円周率を求めよう
http://www.f.waseda.jp/takezawa/math/Pi/monte.html
参考URL:http://www.f.waseda.jp/takezawa/math/Pi/monte.html
回答ありがとうございます。
モンテカルロ法というのを初めて知りました。
参考URLを見てもちょっと難しいですね(汗)
余力があればこちらの方法を使ってプログラミングしてみたいと思います。
アドバイスありがとうございました。
No.2
- 回答日時:
少し補足です。
スカラー三重積を計算するときは,AB と AC の外積を計算してから,AD との内積を取るよりも,
AB, AC, AD の x, y, z 成分から直接,スカラー三重積を計算するほうがプログラムしやすいと思います。
http://www5.plala.or.jp/h-fuchi/math/vector/4.htm
参考URL:http://www5.plala.or.jp/h-fuchi/math/vector/4.htm
2回も回答して頂きありがとうございます。
(1/6)*(AB*AC)*ADを率直に求めて実行したのですが、結果がでません。
ちゃんとprintfはしてるんですが。
たぶん自分のしょーもいミスだと思うんですけど。
URLはとても参考になりました。
スカラー三重積なんてあるんですね。
知りませんでした。
回答ありがとうございました。
No.1
- 回答日時:
三角錐の体積なので,底面積×高さ÷3 で求められます。
以下,AB,AC,AD はベクトルを表しているものとします。
まず ABC を底面とすると底面積は,
(1/2)*|AB×AC|
で求められます。
ここで,AB×AC は AB と AC の外積です。
次に,面ABCの単位法線ベクトルを n とすると,
n = (AB×AC)/|AB×AC|
であり,三角錐の高さは,
n・AD (n と AD の内積)
で求められます。
以上をまとめると三角錐の体積は,
(1/6)*(AB×AC)・AD
で求められます。
要するに AB, AC, AD のスカラー三重積の 1/6 です。
http://spinman.phys.metro-u.ac.jp/lecture/Mech/V …
A,B,C,D の位置関係によってはマイナスがつくかもしれないのでそのときは絶対値をとってください。
以上を素直にプログラムすればいいと思います。
参考URL:http://spinman.phys.metro-u.ac.jp/lecture/Mech/V …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
プログラマー達は何故、プログ...
-
C言語の関数のextern宣言
-
卒業研究でよく分からないとこ...
-
C言語 関数、変数の宣言について
-
C言語について(初心者)
-
C言語のことです。写真(見にく...
-
Windows Formアプリからコンソ...
-
DNCL(共テ用プログラミング言語...
-
C言語について。
-
visual studio 2022でのC#プロ...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
C# で 数式文字列処理を処理す...
-
gccを行ってもexeファイルが生...
-
c言語
-
C言語 列挙型(enum型)変数について
-
C++でデスクトップGUIアプリ開...
-
c言語でイベントフラグを使った...
-
必ずyou bet と表示されます
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
DLLファイルの逆コンパイラにつ...
-
Windows Formアプリからコンソ...
-
大量のデータを読み込んで表示...
-
C言語の関数のextern宣言
-
VisualStudioでC++クラスを追加...
-
【C言語】全角文字の配列を、全...
-
VisualStudio2022でC言語プログ...
-
C++でデスクトップGUIアプリ開...
-
gccを行ってもexeファイルが生...
-
C#でTreeViewのCheckBoxのサイ...
-
C#でログファイルにファイルパ...
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
Notepad++の関数リスト表示の変...
-
C言語について。
-
Cのコンパイルでコメントアウト...
-
visual studio 2022でのC#プロ...
-
コンソールアプリを作成するの...
-
C言語 バッファについて。
おすすめ情報