C言語関係掲示板

過去ログ

No683 四面体の体積

[戻る] [ホームページ]
No.7808

四面体の体積
投稿者---AJ(2003/06/26 18:45:42)


三次元ベクトルを扱う関数の定義ファイル vector.hを使い

三次元空間内の4点Pi(i=1,2,3,4,)を頂点とする
四面体の体積を求める関数を考え、

一辺10の立方体の内部に整数値を座標にした点を4つランダムに
生成し、その4点を頂点にした四面体体積および四面体が立方体の
中心を含むか含まないかを表示するプログラムを作りたいのですが
さっぱりわかりません。どなたかわかる方がいらっしゃったら
教えてください。お願いします。

以下、わかる範囲でプログラムを書きました。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "vector.h"

int main(int argc, char **argv)
{
int i;
double V;
Vec3 v[4], va, vb, vc, vd;

srand(time(NULL));
for (i = 0; i < 4; i++){
v[i].x = rand() % 10;
v[i].y = rand() % 10;
v[i].z = rand() % 10;
printf("v[%d].x = %f, "v[%d].y = %f,"
"v[%d].z = %f\n",
i, v[i].x, i, v[i].y, i, v[i].z);
}
va = vsub(v[1],v[0]);
vb = vsub(v[2],v[1]);
vc = vsub(v[3],v[2]);
vd = vsub(v[0],v[3]);

V = vabs(viprod(voprod(va,vb),vc))/6
printf("taiseki = %f", V);

return(0);
}

 

No.7810

Re:四面体の体積
投稿者---たいちう(2003/06/26 19:12:49)


面白そうと思ったけど簡単だった。つまらん。高校教科書レベル。

頂点をA,B,C,Dとして、v1 = B-A, v2 = C-A, v3 = D-A とする。
立方体の中心をOとして、v0 = O-A とすると、
v0 = s * v1 + t * v2 + u * v3 とあらわせる。
0 < s,t,u < 1 かつ s+t+u < 1 なら含まれる。

頂点を乱数で決めると4面体にならないときがあるので注意。
体積で判断できますが。

No.7815

Re:四面体の体積
投稿者---AJ(2003/06/26 23:31:57)


たいちうさん、ありがとうございます。
お手数かけて申し訳ないのですが、たいちうさんが説明してくだっさた
内容をプログラムでおしえていただけないでしょうか?
よろしくお願いします。

No.7816

Re:四面体の体積
投稿者---たいちう(2003/06/27 09:16:10)


体積を計算できるくらいなら少しはできるでしょう。
あなたの課題です。努力してください。質問はその後で。

全部やって欲しいなら他をあたってください。

No.7813

Re:四面体の体積
投稿者---かずま(2003/06/26 23:23:03)


> V = vabs(viprod(voprod(va,vb),vc))/6

viprod は、たぶん内積のことだから、Vec3 ではなく、
double を返すんでしょう。だから、vabs ではなく、
fabs にすれば、よいのではありませんか。

文の最後にセミコロンを付けてくださいね。

No.7814

Re:四面体の体積
投稿者---かずま(2003/06/26 23:31:43)


printf の書式もおかしいし、"vector.h" の正体も
わからないので、適当に書いてみました。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

/* #include "vector.h" */

typedef struct { double x, y, z; } Vec3;

Vec3 vsub(Vec3 a, Vec3 b)
{
    Vec3 c;
    c.x = a.x - b.x;
    c.y = a.y - b.y;
    c.z = a.z - b.z;
    return c;
}

double vabs(Vec3 a)
{
    return sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
}

double viprod(Vec3 a, Vec3 b)
{
    return a.x*b.x + a.y*b.y + a.z*b.z;
}

Vec3 voprod(Vec3 a, Vec3 b)
{
    Vec3 c;
    c.x = a.y*b.z - a.z*b.y;
    c.y = a.z*b.x - a.x*b.z;
    c.z = a.x*b.y - a.y*b.x;
    return c;
}

int main(void)
{
    int i;
    double V;
    Vec3 v[4], va, vb, vc, vd;

    srand(time(NULL));
    for (i = 0; i < 4; i++) {
        v[i].x = rand() % 10;
        v[i].y = rand() % 10;
        v[i].z = rand() % 10;
        printf("v[%d].x = %f, v[%d].y = %f, v[%d].z = %f\n",
            i, v[i].x, i, v[i].y, i, v[i].z);
    }
    va = vsub(v[1], v[0]);
    vb = vsub(v[2], v[1]);
    vc = vsub(v[3], v[2]);
    vd = vsub(v[0], v[3]);

    V = fabs(viprod(voprod(va, vb), vc)) / 6;
    printf("taiseki = %f", V);

    return 0;
}