在画三维立体图之前,主要是先要找到二维和三维的对应关系,这是转化的关键。
关键代码如下:

         S[i].x=P[i][1]+sqrt(2)/3.0*(-P[i][0]);S[i].y=P[i][2]+sqrt(2)/3.0*(-P[i][0]);

一、建立边表结构,在同一屏幕上完成三视图和正等轴测投影图

//消隐之前
//编译环境:Visual C++ 6.0,EasyX_20190219(beta)
#include<graphics.h>
#include<conio.h>
#include<math.h>
#define max 50
#include<iostream>
#include<math.h>
using namespace std;#define pi 3.14159
using namespace std;
double ja=35.3;//54.7
double rad=(double)ja*pi/(double)180.0;
double Dpoint[][4]={{0,0,84,1},{110,0,84,1},{110,0,20,1},{140,0,20,1},{140,0,0,1},{140,80,0,1},{0,80,0,1},{0,80,54,1},{0,60,54,1},{0,60,84,1},{20,60,84,1},{20,20,84,1},{110,20,84,1},{110,20,20,1},{60,20,20,1},{60,80,20,1},{40,80,54,1},{40,60,54,1},{140,80,20,1},{0,0,0,1}
};//下标从0开始
int ring[]={0,1,12,11,10,9,//0-52,3,18,15,14,13,//6-118,17,16,17,//12-151,2,13,12,//16-193,4,5,18,//20-2311,14,15,16,17,10,//24-2911,12,13,14,//30-3315,18,5,6,7,16,//34-399,10,17,8,//40-430,9,8,7,6,19,//44-490,19,4,3,2,1,//50-554,19,6,5//56-59
};
//构成面的顶点
int surface[12][2]={{0,5},{6,11},{12,15},{16,19},{20,23},{24,29},{30,33},{34,39},{40,43},{44,49},{50,55},{56,59}
};
//主视图
int XOZ_ring[]={1,2,14,10,0,7,16,10,3,15,17,7,6,4
};
int XOZ_surface[3][2]={{0,3},{4,7},{8,13}
};
//侧视图
int YOZ_ring[]={0,2,13,12,11,10,8,7,15,13,3,4,5,15
};
int YOZ_surface[3][2]={{0,3},{4,9},{10,13}
};
//俯视图
int XOY_ring[]={2,0,9,10,11,12,3,5,15,14,12,2,14,15,16,17,10,11,16,7,9,17
};
int XOY_surface[4][2]={{0,5},{6,11},{12,17},{18,21}
};//正等轴投影
int XYZ_ring[]={3,4,5,18,5,6,7,16,15,18,2,3,18,15,14,13,1,2,13,12,11,12,13,14,10,11,14,15,16,17,7,8,17,16,8,9,10,17,0,1,12,11,10,9
};
int XYZ_surface[9][2]={{0,3},{4,9},{10,15},{16,19},{20,23},{24,29},{30,33},{34,37},{38,43}
};//三维坐标转换为右手坐标系的二维坐标
void transfer(double P[max][4], int n, POINT S[])
{int i,j;for(i=0;i<n;i++){for(j=0;j<3;j++){S[i].x=P[i][1]+sqrt(2)/3.0*(-P[i][0]);S[i].y=P[i][2]+sqrt(2)/3.0*(-P[i][0]);}        }
}
//主视图:XOZ面的投影变换,将Z的值给二维坐标的y
void XOZ_Projection(double P[max][4], int n, POINT S[])
{double T[max][4];//新生成的投影面上的点int i,j,k;int TV[4][4]={ {1,0,0,0},{0,0,0,0},{0,0,1,0},{0,0,0,1} };for(i=0;i<n;i++){       for(j=0;j<4;j++){   T[i][j]=0;for(k=0;k<4;k++){T[i][j]+=P[i][k]*TV[k][j];}} }for(i=0;i<n;i++){S[i].x=T[i][0];S[i].y=T[i][2];}
}//侧视图:YOZ面的投影变换,将y的值给二维坐标的x, z的值给二维坐标的y
void YOZ_Projection(double P[max][4], int n, POINT S[])
{double T[max][4];//新生成的投影面上的点int i,j,k;int TW[4][4]={ {0,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1} };for(i=0;i<n;i++){       for(j=0;j<4;j++){   T[i][j]=0;for(k=0;k<4;k++){T[i][j]+=P[i][k]*TW[k][j];}}}for(i=0;i<n;i++){S[i].x=T[i][1];S[i].y=T[i][2];}
}//俯视图:XOY面的投影变换,将y的值给二维坐标的y, x的值给二维坐标的x
void XOY_Projection(double P[max][4], int n, POINT S[])
{double T[max][4];//新生成的投影面上的点int i,j,k;int TH[4][4]={ {1,0,0,0},{0,1,0,0},{0,0,0,0},{0,0,0,1} };for(i=0;i<n;i++){       for(j=0;j<4;j++){   T[i][j]=0;for(k=0;k<4;k++){T[i][j]+=P[i][k]*TH[k][j];}}}for(i=0;i<n;i++){S[i].x=T[i][0];S[i].y=T[i][1];}
}//正等轴投影图:绕Z轴正向旋转α角 ,再绕X轴反向旋转β角,将三维形体向XOZ平面作正投影得到正轴测投影的投影变换矩阵
//三维形体向XOZ平面作正投影,将Z的值给二维坐标的y
void XYZ_Projection(double P[max][4], int n, POINT S[])
{double T[max][4];//新生成的投影面上的点int i,j,k;double TT[4][4]={{cos(rad),0,-sin(rad)*sin(rad),0},{-sin(rad),0,-cos(rad)*sin(rad),0},{0,0,cos(rad),0},{0,0,0,1}};for(i=0;i<n;i++){  for(j=0;j<4;j++){   T[i][j]=0;for(k=0;k<4;k++){T[i][j]+=P[i][k]*TT[k][j];}}}for(i=0;i<n;i++){S[i].x=T[i][0];S[i].y=T[i][2];}
}int main()
{initgraph(800,550);setorigin(220,350);setaspectratio(1,-1);line(0,0,180,0);line(0,0,0,120);line(0,0,-95,-95);int i,j,index,k;POINT points[20];POINT points1[10];setcolor(RED);transfer(Dpoint,20,points);
//画三维立体图
for(i=0;i<12;i++){k=0;for(j=surface[i][0];j<=surface[i][1];j++){index=ring[j];points1[k].x=points[index].x;points1[k].y=points[index].y;k++;}polygon(points1,k);
}
setcolor(YELLOW);
//画主视图
XOZ_Projection(Dpoint,20,points);
for(i=0;i<3;i++){//3个面k=0;for(j=XOZ_surface[i][0];j<=XOZ_surface[i][1];j++){index=XOZ_ring[j];points1[k].x=-points[index].x;points1[k].y=points[index].y+230;k++;}polygon(points1,k);
}//侧视图
YOZ_Projection(Dpoint,20,points);
for(i=0;i<3;i++){//3个面k=0;for(j=YOZ_surface[i][0];j<=YOZ_surface[i][1];j++){index=YOZ_ring[j];points1[k].x=points[index].x+20;points1[k].y=points[index].y+230;k++;}polygon(points1,k);
}//俯视图
XOY_Projection(Dpoint,20,points);
for(i=0;i<4;i++){//4个面k=0;for(j=XOY_surface[i][0];j<=XOY_surface[i][1];j++){index=XOY_ring[j];points1[k].x=-points[index].x;points1[k].y=-points[index].y+210;k++;}polygon(points1,k);
}
//正等轴投影图
XYZ_Projection(Dpoint,20,points);
for(i=0;i<12;i++){k=0;for(j=surface[i][0];j<=surface[i][1];j++){index=ring[j];points1[k].x=-points[index].x+250;points1[k].y=-(-points[index].y+100)+200;k++;}polygon(points1,k);
}_getch();closegraph();return 0;
}

效果演示:

二、给定点的三维坐标值,建立面表、环表、顶点表三表结构,画出三维物体的消隐图

//消隐之后
//编译环境:Visual C++ 6.0,EasyX_20190219(beta)
#include<graphics.h>
#include<conio.h>
#include<math.h>
#define max 50
#include<iostream>
#include<math.h>
using namespace std;
#define pi 3.14159
using namespace std;
double ja=35.3;//54.7
double rad=(double)ja*pi/(double)180.0;
double Dpoint[][4]={{0,0,84,1},{110,0,84,1},{110,0,20,1},{140,0,20,1},{140,0,0,1},{140,80,0,1},{0,80,0,1},{0,80,54,1},{0,60,54,1},{0,60,84,1},{20,60,84,1},{20,20,84,1},{110,20,84,1},{110,20,20,1},{60,20,20,1},{60,80,20,1},{40,80,54,1},{40,60,54,1},{140,80,20,1},{0,0,0,1}
};//下标从0开始
int ring[]={0,1,12,11,10,9,//0-52,3,18,15,14,13,//6-118,17,16,17,//12-151,2,13,12,//16-193,4,5,18,//20-2311,14,15,16,17,10,//24-2911,12,13,14,//30-3315,18,5,6,7,16,//34-399,10,17,8,//40-430,9,8,7,6,19,//44-490,19,4,3,2,1,//50-554,19,6,5//56-59
};
//构成面的顶点
int surface[12][2]={{0,5},{6,11},{12,15},{16,19},{20,23},{24,29},{30,33},{34,39},{40,43},{44,49},{50,55},{56,59}
};//消影
int ring1[]={3,4,5,18,5,6,7,16,15,18,2,3,18,15,14,13,1,2,13,12,11,12,13,14,10,11,14,15,16,17,7,8,17,16,8,9,10,17,0,1,12,11,10,9
};
int surface1[9][2]={{0,3},{4,9},{10,15},{16,19},{20,23},{24,29},{30,33},{34,37},{38,43}
};//三维坐标转换为右手坐标系的二维坐标
void transfer(double P[max][4], int n, POINT S[]){int i,j;for(i=0;i<n;i++){for(j=0;j<3;j++){S[i].x=P[i][1]+sqrt(2)/3.0*(-P[i][0]);S[i].y=P[i][2]+sqrt(2)/3.0*(-P[i][0]);}       }
}//正等轴投影图
void XYZ_Projection(double P[max][4], int n, POINT S[]){double T[max][4];//新生成的投影面上的点int i,j,k;double TT[4][4]={{cos(rad),0,-sin(rad)*sin(rad),0},{-sin(rad),0,-cos(rad)*sin(rad),0},{0,0,cos(rad),0},{0,0,0,1}};for(i=0;i<n;i++){   for(j=0;j<4;j++){   T[i][j]=0;for(k=0;k<4;k++){T[i][j]+=P[i][k]*TT[k][j];}}}for(i=0;i<n;i++){S[i].x=T[i][0];S[i].y=T[i][2];}
}int main()
{initgraph(800,550);setorigin(220,350);setaspectratio(1,-1);line(0,0,180,0);line(0,0,0,120);line(0,0,-95,-95);int i,j,index,k;POINT points[20];POINT points1[10];setcolor(RED);transfer(Dpoint,20,points);
//未消影之前的三维立体图
for(i=0;i<12;i++){k=0;for(j=surface[i][0];j<=surface[i][1];j++){index=ring[j];points1[k].x=points[index].x;points1[k].y=points[index].y;k++;}polygon(points1,k);
}
//画三维立体消影图
setcolor(YELLOW);
for(i=0;i<9;i++){k=0;for(j=surface1[i][0];j<=surface1[i][1];j++){index=ring1[j];points1[k].x=points[index].x+250;points1[k].y=points[index].y;k++;}polygon(points1,k);
}
setcolor(BLUE);
//正等轴投影图
XYZ_Projection(Dpoint,20,points);
for(i=0;i<9;i++){k=0;for(j=surface1[i][0];j<=surface1[i][1];j++){index=ring1[j];points1[k].x=-points[index].x+200;points1[k].y=-(-points[index].y+100)+300;k++;}polygon(points1,k);
}_getch();closegraph();return 0;
}

效果演示:

红色为原图,黄色为消影之后的三维立体图,蓝色为消影后的正等轴侧投影图。

Visual C++6.0画三维立体图形相关推荐

  1. Matlab画三维立体网状图形(类似魔方)

    第一次用Matlab画这种三维立体的图形,搞了半天发现这个样例图片真的是个坑!发现选择Matlab画这种图真的是大材小用了. 样例图片: Matlab中有很多绘制三维立体图形的函数,搜了很多资料之后发 ...

  2. 利用PCL库做简单的三维立体图形

    利用PCL库画简单的三维立体图形需要知道各种图形的参数方程,然后给每个参数赋值便可以. 圆柱面的参数方程为:x = R*cos(θ); y = R*sin(θ); z = z;其中 θ范围是[-2*P ...

  3. 【PPT】画三维立体块

    画三维立体块 引言 一.长方体 1.1 简述 1.2 效果展示 1.3 详细操作 二.球体 2.1 简述 2.2 效果展示 2.3 详细操作 引言 3D形状相比2D有更显著的空间视觉效果,更直观好看. ...

  4. python立体图形,python中如何画三维的图形?

    之前教了大家不少简单的画图方法,有的小伙伴已经想尝试更漂亮的高难度图形.小编找到了一个简单容易上手的分享给大家. 如果需要绘制三维的图形,matlab可以,python同样可以,代码风格也是极其的与m ...

  5. python画立体图形代码_python中如何画三维的图形?

    之前教了大家不少简单的画图方法,有的小伙伴已经想尝试更漂亮的高难度图形.小编找到了一个简单容易上手的分享给大家. 如果需要绘制三维的图形,matlab可以,python同样可以,代码风格也是极其的与m ...

  6. Matlab——图形绘制——三维立体图形 剔透玲珑球 动态图——彗星状轨迹图

    三维绘图函数 三维绘制工具 函数view 实例:三维螺旋线 >> t=0:pi/50:10*pi; plot3(sin(t),cos(t),t) grid %添加网格  plot3可以画出 ...

  7. matlab三维螺旋,Matlab——图形绘制——三维立体图形 剔透玲珑球 动态图——彗星状轨迹图...

    三维绘图函数 三维绘制工具 函数view 实例:三维螺旋线 >> t=0:pi/50:10*pi; plot3(sin(t),cos(t),t) grid %添加网格 plot3可以画出空 ...

  8. python怎么画三维函数图像_python中如何画三维的图形?

    之前教了大家不少简单的画图方法,有的小伙伴已经想尝试更漂亮的高难度图形.小编找到了一个简单容易上手的分享给大家. 如果需要绘制三维的图形,matlab可以,python同样可以,代码风格也是极其的与m ...

  9. matlab 不规则 griddata,MATLAB 不规则随机数据点,画三维曲面图形,griddata, meshgrid...

    在2019数学建模A题时遇到需要根据三维坐标画出三维曲面图,但由于随机不规则,不能形成坐标矩阵,故直接带入只能生成三维散点图,如,有数据: u=[5 5 5; 7 2 1; 4 7 2; 6 1 6; ...

最新文章

  1. visual studio 2010 professional , premium, ultimate各版本功能对比
  2. Java基础之this关键字的作用
  3. Android 获取SD卡的图片资源
  4. Codeforces 1005D Polycarp and Div 3
  5. 运用Nginx代理和UWSGI将Flask项目部署在Linux中 详细步骤
  6. mmdetection 使用笔记 01: 安装与简单的推理demo
  7. 几种开源软件授权协议
  8. 视频剪辑什么鬼?Python 带你高效创作短视频
  9. faststart可以卸载吗_电脑上的许多Microsoft Visual c++组件,可以卸载吗?
  10. pythonforin替换字符_Python:用一个字符串替换数组中的数字(Python: Replace a number in array with a string)...
  11. Linux屏幕取词翻译 - 思路及实现过程
  12. 什么是软件工程?它有哪些本质特征?怎么样用软件工程消除危机?
  13. 后端/Java/大数据/C++ 校招内推面经
  14. 高等数学阶段复习, 函数极限, 连续, 导数,微分
  15. 新神魔大陆服务器维护,《新神魔大陆》手游8月20日合服维护公告
  16. 搭建pixhawk飞控无人小车--前期准备
  17. 2022新版驾考技巧驾考培训驾考技巧考试培训系统源码/题库小程序/题库系统源码/驾考答题系统源码
  18. Vue简单示例——weex
  19. Android安全框架:Verfied boot -- Secure Boot
  20. win10开机卡死在logo处无限转圈怎么办

热门文章

  1. ecshop清空购物车提醒,ecshop购物车,ecshop清空购物车,ecshop提醒信息,ecshop清空操作提示
  2. Vue动态计算百分比配合vux插件
  3. c语言 字符转换成ascii吗,C语言字符转换ASCII码
  4. 51单片机的几种精确延时
  5. npm包--rimraf
  6. 解读常见传感器的CFA排列(彩色滤色矩阵,Color Filter Array)
  7. iptables中-j选项与-g选项的区别
  8. 转载:js技巧收集(200多个)
  9. C语言C Prime总结(2-7章)
  10. C语言基础学习day04