请高手帮忙看看该问题如何处理(GDI绘制三维图形)?

clxye 2010-04-09 09:01:59
我目前刚到一个新公司,公司给的第一个任务就让我比较吃劲。任务的内容是自己实现一个三维图的类,图的内容如我左边的头像所示(CSDN好像贴不了图片,所以只能用这种方法了)。

这个是一个三维频谱图,X轴表示频率(范围:0-1000),Y轴表示这个强度(单位db,范围:-30-60db),Z轴表示时间(范围:0-100)。

原以为这个图比较简单,但真正实现时发现还真的很困难,关键难点在于这是一个三维坐标,如何确定点的位置很难,好像还涉及到立体几何的知识。这个图的另一个难点是渐变效果,这个先占不考虑(我个人打算采用换色画直线的方法)。

对于第一个问题不知大家有什么好的方法,其它控件或者现成的类也行。我之前也考虑过matlab和Direct 3D(没学过),如果用这些方法来实现的话我还要现学,任务时间又不够。

希望那大侠帮帮忙,小弟先在此谢过!!

...全文
235 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsxsxs 2012-02-20
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 clxye 的回复:]
最后还是自己搞定了,效果很好。
[/Quote]
你是怎么弄的呢,能发来我学习一下吗,我现在也是要画一个类似的图,不知道怎么画。谢谢了。
clxye 2010-07-02
  • 打赏
  • 举报
回复
最后还是自己搞定了,效果很好。
clxye 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhaoxueqian1988 的回复:]
引用 5 楼 longlongagoimboy 的回复:
X轴表示频率(范围:0-1000),Y轴表示这个强度(单位db,范围:-30-60db),Z轴表示时间(范围:0-100)。
这些坐标数据楼主肯定有了。
假设有三维坐标P=(x,y,z) ,
绕Y轴旋转B角度得到坐标P'(x',y',z')=(z*sin(B)+x*cos(B), y, z*cos(B)-x*sin(B)),
之后……
[/Quote]

算法好像是有问题的,我上面有说明。

好像通过一些矩阵变换应该是可以比较容易就能定位才对啊。牛人们过来帮帮忙啊。
Jimmy_Xia 2010-04-09
  • 打赏
  • 举报
回复
X轴表示频率(范围:0-1000),Y轴表示这个强度(单位db,范围:-30-60db),Z轴表示时间(范围:0-100)。
这些坐标数据楼主肯定有了。
假设有三维坐标P=(x,y,z) ,
绕Y轴旋转B角度得到坐标P'(x',y',z')=(z*sin(B)+x*cos(B), y, z*cos(B)-x*sin(B)),
之后绕Z轴旋转A角度得到坐标P"(x",y",z")=(x'*cos(A)-y'*sin(A), x'*sin(A)+y'*cos(A), z'),
我们要的是这个图像在二维上的投影,则Z不关心了,只需要按照x”,y”值画出来就行了。
Good luck!
clxye 2010-04-09
  • 打赏
  • 举报
回复
是啊,这两点都让我比较难受。上班第四天,前天用脑过度脑子疼,昨晚回去浑身难受还怕冷。

OPen GL主要是我没学过,要是学了的话实现这个应该也会简单很多。主要是现在根本容不得我去学习,领导昨天催了一遍,刚才又催了一遍。
red-fly 2010-04-09
  • 打赏
  • 举报
回复
1. 上网上搜索看能不能找到现成的免费控件来使用
2. 自己用一般方法实现。做好空间分析,几何体应该不难,其难点主要是渐变色的实现就比较麻烦了,最好是能借助其它现有的库或者函数来实现,否则我看这一个渐变就够你受的了
3. 如楼上所说,采用OpenGL或者D3D,不过这两个我都没有弄过,不知道是不是做这个效果会容易一些
oysoft 2010-04-09
  • 打赏
  • 举报
回复
使用OPenGL
taofa817 2010-04-09
  • 打赏
  • 举报
回复
用OpenGL很快就搞定的
jogger007 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 longlongagoimboy 的回复:]
X轴表示频率(范围:0-1000),Y轴表示这个强度(单位db,范围:-30-60db),Z轴表示时间(范围:0-100)。
这些坐标数据楼主肯定有了。
假设有三维坐标P=(x,y,z) ,
绕Y轴旋转B角度得到坐标P'(x',y',z')=(z*sin(B)+x*cos(B), y, z*cos(B)-x*sin(B)),
之后绕Z轴旋转A角度得到坐标P"(x",y",z")=(x'*c……
[/Quote]
此回复很强,学习了
wuhuwy 2010-04-09
  • 打赏
  • 举报
回复
还是用Opengl做吧,两天熟悉语法,一天就能做完了,其实内容很简单
向立天 2010-04-09
  • 打赏
  • 举报
回复
不好意思啊
我刚刚说的那个没找到
给你发了一个OpenGL的例子
可以用键盘上下左右键控制直升机的移动
这个例子里就是用得你下到的类
你参考一下吧
实在抱歉
clxye 2010-04-09
  • 打赏
  • 举报
回复
chenlia2602@sina.com

多谢了!!
向立天 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 clxye 的回复:]
xianglitian非常感谢,我已下载。

好像只有两个文件(头文件和cpp文件),我不知如何使用,不知有没有例子啊?谢谢!!
[/Quote]

留个邮箱
我给你一个我读书的时候做的用GDI画的立方体的例子
应该还能找到吧
呵呵
不过你下倒的这个是我后来又完善了的
例子比较老了
clxye 2010-04-09
  • 打赏
  • 举报
回复
xianglitian非常感谢,我已下载。

好像只有两个文件(头文件和cpp文件),我不知如何使用,不知有没有例子啊?谢谢!!
向立天 2010-04-09
  • 打赏
  • 举报
回复
在三维空间关键就是操作三维向量
我做过一个类你可以试试
http://download.csdn.net/source/1888166
clxye 2010-04-09
  • 打赏
  • 举报
回复
LongLongAgoImBoy你好,感谢你的答复!

我实际编码了一下,并调试,发现好像还是有点问题。


POINT C3DPlot::CoordinateTo3D(double dwXValue, double dwYValue, double dwZValue)
{
POINT point;
double x = dwXValue, y = dwYValue, z = dwZValue;
double x1 = 0, y1 = 0, z1 = 0;
double x11 = 0, y11 = 0, z11 = 0;
int B = -45;
int A = -45;

// 绕Y轴旋转
x1 = z * sin(atr(B)) + x * cos(atr(B));
y1 = y;
z1 = z * cos(atr(B)) - x * sin(atr(B));

// 绕Z轴旋转
x11 = x1 * cos(atr(A)) - y1 * sin(atr(A));
y11 = x1 * sin(atr(A)) + y1 * cos(atr(A));
z11 = z1;

point.x = (LONG)( m_nX0 + x11 );
point.y = (LONG)( m_nY0 -y11 );

m_pDC->MoveTo( m_nX0, m_nY0 );
m_pDC->LineTo( point.x, point.y );

return point;
}


当CoordinateTo3D( 0, 300, 0 )时,这时的x、y值均为212.132。

// 绕Y轴旋转
x1 = z * sin(atr(B)) + x * cos(atr(B)); => x1 = 0
y1 = y; => y1 = 300
z1 = z * cos(atr(B)) - x * sin(atr(B)); => z1 = 0

// 绕Z轴旋转
x11 = x1 * cos(atr(A)) - y1 * sin(atr(A)); => x1为零,y1不为零,结果不为零 => X坐标发生了偏移
y11 = x1 * sin(atr(A)) + y1 * cos(atr(A));
z11 = z1;

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧