3DGBAS.CPP
上传用户:wtrl82617
上传日期:2007-01-07
资源大小:187k
文件大小:5k
源码类别:

界面编程

开发平台:

DOS

  1. #include "msgbox.h"
  2. #include "yyxmain.h"
  3. #include "editdlg.h"
  4. #include "filedial.h"
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <math.h>
  8. #include <io.h>
  9. #include <fcntl.h>
  10. #include "3dgbas.h"
  11. #include "3dmenu.h"
  12. graphbas_class::graphbas_class (int ID,char *title,byte type,byte hotkey,
  13.  int left, int top, int width, int height )
  14. :win_class (ID,title,type,hotkey,left,top,width,height)
  15. {
  16. rho =40; theta =0; phi = PI/2 ; d =450;
  17. viewport.clip =1 ; // CLIP_ON;
  18. setup_window();  // may result in a duplicate
  19. }
  20. void graphbas_class::setup_window ()
  21. { win_class::setup_window();
  22. cx  =( bounds.right-bounds.left-25) /2 ;
  23. cy  =( bounds.bottom-bounds.top-25) /2;
  24. // ix1=25, iy1=25, ix2=bounds.right-bounds.left-25, iy2=bounds.bottom-bounds.top-90;   // bounds.top
  25. calc();
  26. }
  27. graphbas_class::~graphbas_class ()
  28. {
  29. }
  30. int graphbas_class::key_pressed_handler  ( int key_scan_num )
  31. {
  32.   int ret_value;
  33. if ((ret_value=win_class::key_pressed_handler (key_scan_num )) !=FALSE)
  34. return ret_value;
  35. draw_all_surface (BLACK);
  36. switch(key_scan_num ) {
  37. case F1KEY:rho *=2;  break;
  38. case F2KEY:rho /=2;  break;
  39. case LEFTKEY:theta +=PI/8;break;
  40. case RIGHTKEY:theta -=PI/8;break;
  41. case UPKEY:phi +=PI/8;break;
  42. case DOWNKEY:phi -=PI/8;break;
  43. case '7':d   *=2;break;
  44. case '8':d   /=2;break;
  45. }
  46. calc();
  47. draw_all_surface (GREEN);
  48. return FALSE;
  49. }
  50. int graphbas_class::msg_handler (MSG& message )
  51. {
  52. if (win_class::msg_handler (message) !=FALSE ) return TRUE;
  53. switch ( message .Action){
  54. case MenuActionMSG:
  55. switch (message.ID ){
  56. case LEFT: key_pressed_handler  ( LEFTKEY);break;
  57. case RIGHT:key_pressed_handler  ( RIGHTKEY);break;
  58. case UP:   key_pressed_handler  (   UPKEY);break;
  59. case DOWN: key_pressed_handler  ( DOWNKEY);break;
  60. case NEAR: key_pressed_handler  (   F2KEY);break;
  61. case FAR : key_pressed_handler  (   F1KEY);break;
  62. case DISTANCE: break;
  63.   Teditdlg * modifydlg;
  64.   char buf[30];
  65. case X_VALUE:
  66. sprintf (buf,"%4.1f",X);
  67. modifydlg=new Teditdlg(0,"INPUT X VALUE",150,100,300,200,buf);
  68. if (theprogram->exec_dialog(modifydlg) ==Dlg_OK )  {
  69. X = atof ( buf );
  70. rho = sqrt (X*X+Y*Y+Z*Z);
  71. theta = acos ( Z/ rho);
  72. phi   = acos ( X/ sqrt(X*X+Y*Y));
  73. calc ();
  74. draw_win_contents();
  75. };
  76. break;
  77. case Y_VALUE:
  78. sprintf (buf,"%4.1f",Y);
  79. modifydlg=new Teditdlg(0,"INPUT Y VALUE",150,100,300,200,buf);
  80. if (theprogram->exec_dialog(modifydlg) ==Dlg_OK )  {
  81. Y = atof ( buf );
  82. rho = sqrt (X*X+Y*Y+Z*Z);
  83. theta = acos ( Z/ rho);
  84. phi   = acos ( X/ sqrt(X*X+Y*Y));
  85. calc ();
  86. draw_win_contents();
  87. };
  88. break;
  89. case Z_VALUE:
  90. sprintf (buf,"%4.1f",Z);
  91. modifydlg=new Teditdlg(0,"INPUT Z VALUE",150,100,300,200,buf);
  92. if (theprogram->exec_dialog(modifydlg) ==Dlg_OK )  {
  93. Z = atof ( buf );
  94. rho = sqrt (X*X+Y*Y+Z*Z);
  95. theta = acos ( Z/ rho);
  96. phi   = acos ( X/ sqrt(X*X+Y*Y));
  97. calc ();
  98. draw_win_contents();
  99. };
  100. break;
  101. };
  102. break;
  103. default: return FALSE;
  104. }
  105. return TRUE;
  106. }
  107. int graphbas_class::draw_win_contents()
  108. {
  109. getviewsettings (&current_viewport );
  110. setport (viewport);
  111. /* setviewport (viewport.left,
  112. viewport.top,
  113. viewport.right,
  114. viewport.bottom-2*bar_height, 1);
  115. */
  116. setfillstyle(SOLID_FILL,BLACK);
  117. bar (0,0,viewport.right-viewport.left,
  118. viewport.bottom-viewport.top-bar_height);
  119. putch (0x007);
  120. // calc ();
  121. draw_all_surface(GREEN);
  122. setport (current_viewport );
  123. return 0;
  124. }
  125. void graphbas_class::draw_all_surface(int color)
  126. {
  127.   int i;
  128. setcolor (color);
  129. for (i=0;i<SURFACENUM;i++) {
  130.    if ( showornot[i]==1) show_surface (i);
  131. }
  132.   char buf[100];
  133. sprintf (buf,"X=%4.1f,Y=%4.1f,Z=%4.1f,rho=%4.1f,theta=%4.1f,phi=%4.1f",
  134. X,Y,Z,rho,theta,phi);
  135. outtextxy ( bounds.left +10,bounds.bottom-bar_height-30, buf );
  136. }
  137. void graphbas_class::show_surface (int sur)
  138. {
  139.   int x1,y1,x2,y2;
  140.   int i;
  141. // setcolor ( GREEN );
  142. for (i=0;i<nps[sur]-1;i++) {
  143. x1=sv[s[sur][i]-1][0];
  144. y1=sv[s[sur][i]-1][1];
  145. x2=sv[s[sur][i+1]-1][0];
  146. y2=sv[s[sur][i+1]-1][1];
  147. line (x1,y1,x2,y2);
  148. }
  149. }
  150. void graphbas_class::calc()
  151. { int i;
  152. // rho =40; theta =0.7; phi = 1; d =450;
  153. // cx = 320; cy=240;
  154. s1 =sin (theta ); c1 =cos (theta );
  155. s2 =sin (phi  );  c2 =cos (phi );
  156. X=rho * s1 * c2;
  157. Y=rho* s1 * s2;
  158. Z=rho* c1;
  159. for (i=0;i<POINTNUM;i++ ) {
  160.   float x,y,z;
  161.   float x1,y1,z1;
  162. x=v[i][0]; y=v[i][1]; z=v[i][2];
  163. x1=-x*s1+y*c1;
  164. y1=-x*c1*c2-y*s1*c2+z*s2;
  165. z1=-x*s2*c1-y*s1*s2-z*c2+ rho;
  166. sv[i][0]=d*(x1/z1)+cx;
  167. sv[i][1]=-d*(y1/z1)+cy;
  168. }
  169.   float u1,u2,u3,v1,v2,v3;
  170.   float xe,ye,ze;
  171. for (i=0;i<SURFACENUM;i++){
  172. u1=v[s[i][1]-1][0]-v[s[i][0]-1][0];
  173. u2=v[s[i][1]-1][1]-v[s[i][0]-1][1];
  174. u3=v[s[i][1]-1][2]-v[s[i][0]-1][2];
  175. v1=v[s[i][2]-1][0]-v[s[i][0]-1][0];
  176. v2=v[s[i][2]-1][1]-v[s[i][0]-1][1];
  177. v3=v[s[i][2]-1][2]-v[s[i][0]-1][2];
  178. n[i][0]=u2*v3-v2*u3;
  179. n[i][1]=u3*v1-v3*u1;
  180. n[i][2]=u1*v2-v1*u2;
  181. }
  182. xe=rho*s2*c1;
  183. ye=rho*s2*s1;
  184. ze=rho*c2;
  185.   float e2,wx,wy,wz;
  186. for (i=0;i<SURFACENUM;i++) {
  187. e2=s[i][0]-1;
  188. wx =xe-v[e2][0];
  189. wy =ye-v[e2][1];
  190. wz =ze-v[e2][2];
  191. if ( n[i][0]*wx + n[i][1]*wy+n[i][2]*wz <=0 ) {
  192. showornot[i]=0;
  193. // Do not show it;
  194. } else {
  195. showornot[i]=1;
  196. // show_surface (i);
  197. // Show the surface;
  198. }
  199. }
  200. }
  201. BOOL graphbas_class::func_canclose()
  202. {
  203. return TRUE;
  204. }