![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- デスクトップパソコン 自作PC 4 2022/07/21 21:16
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- 数学 0 a b a b 0 A= b 0 c B= b 0 c c a 0 0 c a を使って | a 2 2023/06/08 08:48
- 数学 交代式と整数問題 17 2023/03/06 16:52
- 飛行機・空港 【民間旅客用航空機メーカー勤務の方に質問です】飛行機の座席のエコノミークラスの記号表記がLF-Yなの 2 2022/07/23 08:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
多角形の内部かどうか判定する方法
-
エクセルである点からの距離で...
-
座標を持った平面範囲に座標を...
-
回転する四角や円で当たり判定...
-
3次元空間上の2つの座標から...
-
図形が重なりあっているかどうか
-
このアルゴリズムは分かりますか?
-
ASP.NET フォーム上でp...
-
ワード上Shapeの位置情報を統一...
-
直線上にある点の座標の求め方
-
VBA 図形○を入れる座標の取り方
-
Fortranで直交座標から極座標変...
-
空間上の四面体の体積
-
矩形同士の当たり判定 C#
-
運動のプログラムをおしえてく...
-
GoogleMapで始点からルート上の...
-
シューティングゲームの当たり判定
-
VBで、開いているExcelシートの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
3次元空間上の2つの座標から...
-
エクセルである点からの距離で...
-
始点、終点の二つの座標と半径...
-
エクセルで回転する座標の出し方
-
閉図形の座標の配列が右回りか...
-
ワード上Shapeの位置情報を統一...
-
以下のプログラムは重心を求め...
-
C言語 配列で座標
-
ダイアログ内コントロールの位...
-
ガウシアンフィルタのCプログラム
-
空間上の二点を結ぶ直線上に任...
-
エクセルシート上のマウスポイ...
-
シーケンサー(PLC?)で制...
-
VB6のPrinter.ScaleWidth に対...
-
多角形の内部かどうか判定する方法
-
直線上にある点の座標の求め方
-
y=x^2の座標をプロットするプロ...
-
ピクチャボックスの座標取得
おすすめ情報