• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:三次元を二次元に・・・)

ヘッダーファイルの中にXeasyGraphic.hがあり、三次元を二次元に変換する方法を知りたい

noname#30727の回答

  • ベストアンサー
noname#30727
noname#30727
回答No.1

プロジェクションは無視しますが、3D→2Dの透視変換をするならば、 d = box_z2 - (-15); // Z座標=(-15) から見る flat_x = box_x2 / d; flat_y = box_y2 / d; のようにします。 3DのZ座標の最小値は-10√2だからこの場合はありえませんが、box_z2 - (-15) が負になると、座標が反転し、0だと、0割り算が発生し、正であっても0に近いと、XY座標が極めて大きな値になるので、例えば1未満のときは、ラインそのものを表示しないような工夫が必要になります。

関連するQ&A

  • 3次元配列から2次元配列に

    3次元配列のデータを2次元配列に移すにはどのように したらよいのでしょうか.とりあえず下記のように考えてみましたが. data3[500][500][4000]; //3次元配列 data2[500][500]; //2次元配列 for(y=0; y<500; y++) for(x=0; x<500; x++){ for(z=0; z<4000; z++){ data2[y][x] = data3[y][x][z]; } } } これでいいのでしょうか?

  • 関数宣言

    3次元で領域を確保するプログラムをmalloc関数を用いて書きました。しかし、プログラムが長いので関数宣言をしなさいといわれたために、以下のプログラムを書きました。しかし、途中でつまづいてしまい、どのように関数を用いたり、関数を定義すれば良いのか混乱しています。初心者ですが、どうかお願いします。 /*ソース*/ #include<stdio.h> #include<stdlib.h> int main(){ double ***C; f3Malloc(C,.,.); //数値を代入(関数の使い方?) f3Free(C,.,.); } /*3次元配列(返し方?)*/ double*** f3Malloc(C,,){ int i,j,x,y,z; x = 2; y = 3; z = 4; C=(double***)malloc(sizeof(double**)*x*y*z); for(i=0;i<y;i++){ C[i]=(double**)malloc(sizeof(double*)*y*z); for(j=0;j<z;j++){ C[i][j]=(double*)malloc(sizeof(double)*z); } } } /*メモリの解放(返し方?)*/ void f3Free(C,.,.){ int i,j,x,y; x = 2; y = 3; for(i=0;i<x;i++){ for(j=0;j<y;j++){ free(C[i][j]); } free(C[i]); } free(C); }

  • 三次元の井戸型ポテンシャルについて

    量子力学の質問です。 三次元の井戸型ポテンシャル(一辺Lの立方体)についてなのですが、 (I)箱の端の波動関数を0とする条件 つまりψ(L,y,z,)=ψ(x,L,z,)=ψ(x,y,L)=0 のとき (II)周期的境界条件を条件にした場合 つまりψ(x,y,z,)=ψ(x+L,y,z,)=ψ(x,y+L,z)=ψ(x,y,z+L) という条件のとき とでエネルギー固有値を求めました。 すると(I)は E=h^2/(8πm)・(π/L)^2・{(n_x)^2+(n_y)^2+(n_z)^2} ただしn_x,y,zは0を含まない自然数。 (II)は E=h^2/(8πm)・(2π/L)^2・{(n_x)^2+(n_y)^2+(n_z)^2} ただしn_x,y,z=0,±1,±2... となりました。明らかに(I)と(II)ではエネルギー固有値がちがってきます。 これはなぜなのでしょうか? このほかのフェルミ波数等は同じ値をとるのにエネルギー固有値だけちがうというのはいいのでしょうか?

  • c言語

    c言語で写真の課題を出されたのですが自分のプログラムでは上手くいきません。どこが間違っているのか教えて欲しいです。 自分のプログラム #include<stdio.h> #include<math.h> int main(){ int i,j; double c,d,x,y,z; for(i=0;i<=360;i++){ c=10*cos(i*M_PI/180); d=10*sin(i*M_PI/180); if(c>=0 && d>=0){ for(j=0;j<=1000;j++){ x=0.001*j; y =x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } if(c<=0 && d>=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c<=0 && d<=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c>=0 && d<=0){ for(j=0;j<=1000;j++){ x=0.001*j; y=x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } printf("x=%lf y=%lf z=%lf\n",x,y,z); } return(0); }

  • 三次元座標変換について質問

    みなさんこんにちは。 G68の機能を用いて三次元座標変換をしようと考えています。 以下のような指令を用いてテストを行ってみました。 例?)G68X0.Y0.Z0.I1.J0.K0.R30. 例?)G68X0.Y0.Z0.I0.J1.K0.R30. ところが、例?、?のように回転中心座標軸I、Jで指令しても 常にZ軸が回転中心となって座標変換されてしまいます。 このような現象が起こってしまう原因としてどのような要因が考えられますでしょうか。 お手数ですが教えていただけると幸いです。 ちなみに制御装置はFANUC 15iMAです。 宜しくお願い致します。

  • 2次元配列の基礎について

    とある問題で 下に示す行列x,yの積を求めるプログラムを作成せよ。 x=[123][456] y=[15] [53][81] 問題の意味が自分にはよくわからないのですが この場合 123*15;123*53;123*81 456*15;456*53;456*81 の解答を表示させればいいのでしょうか? 自分でやったら以下のようになりましたが、これだと456*53と123*15と0しか表示されません。どこをどう直せば宜しいでしょうか? ご教授お願いしますm(__)m #include <stdio.h> int main(void){ int ma[3][1] ={{123},{456}}; int mb[3][1] ={{15},{53},{81}}; int mc[3][1] ={0}; int i; int j; for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ mc[i][j] =ma[i][j] * mb[i][j]; } } for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ printf("%3d",mc[i][j]); putchar('\n'); } } return 0; }

  • 4次元とは

    4次元というとき2種類あると考えます。 (1) ユークリッド4次元 (2) 時空4次元 (1)においては4つのベクトルは独立です。 x^2+y^2+z^2+u^2=0なら x=y=z=u=0です。 (2)においては x^2+y^2+z^2-ct^2=0でも x=y=z=ct=0になりません。 これについて説明できる方はいらっしゃるでしょうか。

  • 二次元配列に関する質問です。

    一次元配列はわかるのですが二次元配列になると、わからない時があります。 <ソース> #include<stdio.h> int main() { int dat[2][5]={1,2,3,4,5,6,7,8,9,10}; int i; int j; for(i=0;i<2;i++){ for(j=0;j<5;j++){ printf("dat[%d][%d] %d\n",i,j,dat[i][j]); } } return 0; } このプログラムでわからないのは、 int dat[2][5]={1,2,3,4,5,6,7,8,9,10};の部分です。 普段は、int dat[2][5]={{1,2,3,4,5}, {6,7,8,9,10}, }; という使い方をしているのですが・・・。 どうちがうのでしょうか?

  • c言語のmalloc関数と2次元配列について

    ・mallocとreallocのAPPを作成しています、下記は単純化しました。 「質問-1」 ・while(1){...以下を無効にした場合、正常に終了します。 ・有効にして、最初に999を入力した場合、エラー表示されます。 ・この理由が分かりません。 「質問-2」 ・有効にして、初期数値(例えば11)を入力の場合、正常表示されます ・続けて数値(例えば15)を入力した場合、エラー表示されます。 ・この理由が分かりません。 ***************************************************************  #include <stdio.h>  #include <stdlib.h>  void MylnOut(void);  int **map;  int X=10,Y=10,i,j; //************************************************************** // MAIN //************************************************************** int main() {  char str[64]={""};  char *s="変更数値を入力(999で終了).... "; /* 2次元配列確保と初期表示 */  map=(int **)malloc(sizeof(int *)*X);  for(i=0;i<X;i++)   map[i]=(int *)malloc(sizeof(int)*Y);  MylnOut(); /* 変更数値入力 */ // while(1){ //  printf(s); //  gets(str); //  X=atoi(str); //  if(X==999) break; /* 領域変更と表示 */ //  map=(int **)realloc(map,sizeof(int *)*X); //  for(i=0;i<X;i++) //   map[i]=(int *)realloc(map[i],sizeof(Y)); //  MylnOut(); // } /* 領域開放 */   for(i=0;i<X;i++) free(map[i]);   free(map);   return 0; } //************************************************************** // 入力・表示 //************************************************************** void MylnOut(void) {  for(j=0;j<Y;j++)   for(i=0;i<X;i++) map[i][j]=55;   for(j=0;j<Y;j++){    for(i=0;i<X;i++) printf("%3d",map[i][j]);    printf("\n");   } }

  • エクセルを用いた3次元座標変換

    3次元座標空間において、座標軸を回転移動させて三つの基準座標点のz座標をすべて0にする方法を教えていただけないでしょうか。 例:(x1,y1,z1), (x2,y2,z2), (x3,y3,z3) →(回転移動)→ (x1',y1',0), (x2', y2', 0), (x3', y3', 0)  よろしくお願いします。