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

このQ&Aのポイント
  • この質問では、ヘッダーファイルの中にXeasyGraphic.hがあり、立方体を表示させ回転させたいが、結果がゆがんでしまうという問題が発生しています。
  • 質問者は、三次元で回転させた立方体を二次元に落とす方法を知りたいとしています。
  • 質問者は、どのようにすれば立方体が正しく回転して二次元に変換されるのか教えてほしいと言っています。
回答を見る
  • ベストアンサー

三次元を二次元に・・・

ヘッダーファイルの中にXeasyGraphic.hと言うのがあり、立方体を表示させ回転たいのです。 そして、三次元で回転させ、二次元に落とすという方法をしたかったのですが、どうしても、ゆがんでしまいます。どうしたらいいでしょうか? -------ソース------- #include<stdio.h> #include<XeasyGraphics.h> #include<math.h> int main(){ /*立方体の宣言*/ float box_x[8]={10,10,10,-10,10,-10,-10,-10};/*X軸*/ float box_y[8]={10,10,-10,10,-10,10,-10,-10};/*Y軸*/ float box_z[8]={10,-10,10,-10,-10,10,10,-10};/*Z軸*/ /*立方体のキャッシュ*/ float box_x2[360][8],box_y2[360][8],box_z2[360][8]; /*平面に落とした時のキャッシュ*/ float flat_x[360][8],flat_y[360][8]; /*回転用*/ int j,i; float th,x,y,x2,y2; /*回転プログラム*/ for(j=1;j<=360;j++){ for(i=0;i<8;i++){ x=box_x[i]; y=box_y[i]; th=(PAI/180)*j; box_x2[j-1][i]=x*cos(th)-y*sin(th); box_y2[j-1][i]=x*sin(th)+y*cos(th); box_z2[j-1][i]=box_z[i]; } } /*三次元から二次元へ*//*ここが間違えていると思われる*/ for(j=0;j<360;j++){ for(i=0;i<8;i++){ flat_x[j][i]=box_x2[j][i]-box_z2[j][i]; flat_y[j][i]=box_y2[j][i]-box_z2[j][i]; } } /*この後に表示が入る予定*/ getchar(); exit(0); }

  • da2
  • お礼率8% (5/58)

質問者が選んだベストアンサー

  • ベストアンサー
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未満のときは、ラインそのものを表示しないような工夫が必要になります。

その他の回答 (1)

noname#30727
noname#30727
回答No.2

No.1ですが、Z軸で回転させているので、-10√2は-10の間違いでした。

関連する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)  よろしくお願いします。