OpenGL上的烟花
参考这个做的: http://blog.csdn.net/crazyjumper/archive/2007/10/19/1833483.aspx
只贴下数据结构
#define MAX_PARTICLES 24 // 小烟花个数
#define MAX_TAIL 30 // 烟花尾部长度
#define MAX_FIRE 5 // 烟花总个数
#define PI 3.1415926
#define COLOR_NUM 12
static GLfloat colors[COLOR_NUM][3]= // 彩虹颜色
{
{1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f},
{0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f},
{0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}
};
GLfloat zoom = -40.0f; // 视角远近
typedef struct
{
float x, y, z; // 粒子位置
} PARTICLE;
typedef struct
{
PARTICLE particles[MAX_TAIL];
float xspeed, yspeed, zspeed; // 粒子速度
float xg, yg, zg; // 加速度
} TAIL;
struct
{
TAIL tails[MAX_PARTICLES];
float r, g, b; // 颜色
GLfloat life; // 生命
GLfloat fade; // 衰减速度
GLfloat rad; // xz平面上的运动速度
int style; // 上升还是下降
int count; // 小烟花尾部点数
} Fire[MAX_FIRE];
Putty中文乱码问题
很简单的问题,解决N次忘N次,还是记下好。
-
如果$locale没有zh_CN,$export LC_ALL=zh_CN.utf8,前提$locale -a中有zh_CN.utf8
-
在window-〉Appearance-〉Translation中,Received data assumed to be in which character set 中,把Use font encoding改为UTF-8,用$date 命令测试.
-
如果还不行,选择window-〉Appearance-〉Font settings-〉Change…,选择Fixedsys字体,字符集选择CHINESE_GB2312。
再不行继续google了
解决putty上vim小键盘不好使的问题
http://syre.blogbus.com/logs/10431681.html
原来在putty上用vi的时候,开NumLock时按小键盘上的数字键并不能输入数字,而是出现一个字母然后换行(实际上是命令模式上对应上下左右的键)。输入数字的时候,不能用小键盘总是很不舒服的。于是就去找解决办法。
其实最后的解决办法也很简单,在选项Terminal- Features里,找到Disable application keypad mode,选上就可以了。
[zz]OpenCV设置摄像头的分辨率
OpenCV中原本是有设置视频捕捉属性的函数的,如下:
CVAPI(int) cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
//cvSetCaptureProperty(pCapture, CV_CAP_PROP_FPS, 30);
//cvSetCaptureProperty(pCapture, CV_CAP_PROP_FRAME_WIDTH, 1024);
//cvSetCaptureProperty(pCapture, CV_CAP_PROP_FRAME_HEIGHT, 768);
不过我用了之后没效果,就google到这篇文章了,也仅此一篇,实践过可行,源码也蛮清楚的,保存下。
Opencv是提供了一系列的摄像头设置函数的,但是没有提供相应的实现,使用的话,需要如下设置:
1 把下面几个定义添加到 highgui.h中
#define CV_CAP_PROP_DIALOG_DISPLAY 8
#define CV_CAP_PROP_DIALOG_FORMAT 9
#define CV_CAP_PROP_DIALOG_SOURCE 10
#define CV_CAP_PROP_DIALOG_COMPRESSION 11
#define CV_CAP_PROP_FRAME_WIDTH_HEIGHT 12
2 把页面中的函数
static int icvSetPropertyCAM_VFW( CvCaptureCAM_VFW* capture, int property_id, double value )
添加到cvcap_vfw.cpp中,放在typedef struct CvCaptureCAM_VFW 这个结构之后。(见下文)
3 用下面的函数代替cvcap_vfw.cpp中的同名函数
static CvCaptureVTable captureCAM_VFW_vtable =
{
6,
(CvCaptureCloseFunc)icvCloseCAM_VFW,
(CvCaptureGrabFrameFunc)icvGrabFrameCAM_VFW,
(CvCaptureRetrieveFrameFunc)icvRetrieveFrameCAM_VFW,
(CvCaptureGetPropertyFunc)icvGetPropertyCAM_VFW,
(CvCaptureSetPropertyFunc)icvSetPropertyCAM_VFW, // was NULL
(CvCaptureGetDescriptionFunc)0
};
4 编译highgui
用的时候调用如下函数即可
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH_HEIGHT, 640480 )
补充,需要的函数:
static int icvSetPropertyCAM_VFW( CvCaptureCAM_VFW* capture, int
property_id, double value )
{
int result = -1;
CAPSTATUS capstat;
CAPTUREPARMS capparam;
BITMAPINFO btmp;
switch( property_id )
{
case CV_CAP_PROP_DIALOG_DISPLAY:
result = capDlgVideoDisplay(capture->capWnd);
//SendMessage(capture->capWnd,WM_CAP_DLG_VIDEODISPLAY,0,0);
break;
case CV_CAP_PROP_DIALOG_FORMAT:
result = capDlgVideoFormat(capture->capWnd);
//SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOFORMAT,0,0);
break;
case CV_CAP_PROP_DIALOG_SOURCE:
result = capDlgVideoSource(capture->capWnd);
//SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOSOURCE,0,0);
break;
case CV_CAP_PROP_DIALOG_COMPRESSION:
result = capDlgVideoCompression(capture->capWnd);
break;
case CV_CAP_PROP_FRAME_WIDTH_HEIGHT:
capGetVideoFormat(capture->capWnd,, sizeof(BITMAPINFO));
btmp.bmiHeader.biWidth = floor(value/1000);
btmp.bmiHeader.biHeight = value-floor(value/1000)*1000;
btmp.bmiHeader.biSizeImage = btmp.bmiHeader.biHeight *
btmp.bmiHeader.biWidth * btmp.bmiHeader.biPlanes *
btmp.bmiHeader.biBitCount / 8;
capSetVideoFormat(capture->capWnd,, sizeof(BITMAPINFO));
break;
default:
break;
}
return result;
}
关于MFC隐藏窗口的方法
作业的一个程序要用到隐藏窗口。虽然个人很想编程命令行下的。但是没办法。。找了找mfc隐藏窗口的代码。发现一篇好文章.
很多时候我们需要做一些后台的服务程序,这时我们就不需要弹出程序的窗口,因此便需要隐藏程序的窗口,以下就是一些我从网上或者其它途径获取的隐藏程序窗口的方法,一般的MFC应用程序有基于对话框的,单文档和多文档,而单文档和多文档的方法是一样的,所以这里只以单文档为例:
隐藏基于对话框的MFC应用程序窗口的方法
(推荐这个方法,非常好用)
很多人可能会将窗口创建出来,然后用一个 ShowWindow(SW_HIDE) 的方法去隐藏窗口,当然这是可以做到隐藏的功能,但是有一点不足的地方就是窗口在隐藏之前会有一下短瞬的闪烁,而以下这种方法可以解决这种问题:
在 C***App::InitInstance() 的函数中将以下的这一段注释掉:
C***Dlg dlg;
m_pMainWnd =&dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
换成:
C***Dlg *dlg = new C***Dlg;
m_pMainWnd = dlg;
return dlg->Create(IDD_***_DIALOG);
同时将 IDD_***_DIALOG 的对话框资源的 More Stytles 属性页的 Visible 属性的勾去掉即可。这是我认为最简单的一种方法,还有另外一种方法,就是在工作区的资源菜单中插入一个新的对话框,然后用 ClassWizard 新建一个与之对应的类, 而下面
C***Dlg *dlg = new C***Dlg;
m_pMainWnd = dlg;
return dlg->Create(IDD_***_DIALOG);
这里的CDlg和IDD__DIALOG改为与你新建的对话框的对应即可,方法的原理与上面的一样,只是麻烦了一点点而已.
隐藏基于单文档的MFC应用程序窗口的方法
1) 最简单的方法是从网上的找到的,可行,好用
CMainFrame::ActiveFrame()
{
nCmdShow= SW_HIDE;
CFrameWnd::ActivateFrame(nCmdShow);
}
C??App::Initstance()
{
m_pMainWnd->ShowWindow(SW_HIDE);
//UpdateWindow();
}
因为 MFC 有两个步骤来显示 SDI 主窗口, 所有必须在这两个地方都 SW_HIDE, 否则就会闪动。即便 HWND 没有 WS_VISIBLE 属性, 用ShowWindow(SW_SHOW) 还是可以显示该 HWND 的, 所以vcbear的方法有问题。这里的ActiveFrame函数可以在ClassWizard中添加.
2)第二种方法则相对繁琐得多
第一步,将CMainFrame的构造函数改为public属性(默认是protected的)
第二步,将C***App::InitInstance()里面的下面代码注释掉:
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestHideDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CTestHideView));
AddDocTemplate(pDocTemplate);
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
换成以下的代码:
m_pMainWnd = new CMainFrame();
BOOL bRet = ((CMainFrame *)m_pMainWnd)->LoadFrame(IDR_MAINFRAME);
if (bRet)
{
m_pMainWnd->UpdateWindow();
}
else
{
if (m_pMainWnd)
{
delete m_pMainWnd;
m_pMainWnd = NULL;
}
}
这样子编绎出来的程序运行时便不会有主窗口。
纵观上面的隐藏窗口的方法,除了使用ShowWIndow(SW_HIDE)的方法之外,其实都是将程序中m_pMainWnd指针换一下面目,原来是正常显示的,就改为不显示,或者用其它的对话框或者自身新建一个不同类别的框架指针.
我一开始的疑惑是既然CApp会有自已的线程和消息循环机制,那么为什么还必要要这么一个框架类CMainFrame作为它的支撑呢?后来查了一下源码发现在CApp类的Run()函数里面有这么一段(关于Run函数这里不做详细讲解,有兴趣可以去查看 深入浅出MFC ):
int CWinApp::Run()
{
if (m_pMainWnd == NULL&&AfxOleGetUserCtrl())
{
// Not launched /Embedding or /Automation, but has no main window!
TRACE0("Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n");
AfxPostQuitMessage(0);
}
return CWinThread::Run();
}
呵呵,原来只要 m_pMainWnd 不为 NULL, 则主线程就可以转起来.至此,所有的问题就迎刃而解。
唯美主义 STL
原文: STL Easy Study
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
void main(void)
{
typedef vector<int> int_vector;
typedef istream_iterator<int> istream_itr;
typedef ostream_iterator<int> ostream_itr;
typedef back_insert_iterator<int_vector> back_ins_itr;
// STL中的vector容器
int_vector num;
// 从标准输入设备读入整数,
// 直到输入的是非整型数据为止
copy(istream_itr(cin), istream_itr(), back_ins_itr(num));
// STL中的排序算法
sort(num.begin(), num.end());
// 将排序结果输出到标准输出设备
copy(num.begin(), num.end(), ostream_itr(cout,"\n"));
}
在这个程序里几乎每行代码都是和STL有关的(除了main和那对花括号,当然还有注释),并且它包含了STL中几乎所有的各大部件(容器 container,迭代器iterator, 算法algorithm, 适配器adaptor),唯一的遗憾是少了函数对象(functor)的身影。
Poisson Image Editing
Poisson Image Editing. SIGGRAPH2003.
Patrick Perez, Michel Gangnet and Andrew Blake.
做了近一周多,时间都用在MFC、CxImage库和稀疏矩阵求解库的使用上了,Poisson算法倒是很明了,在Intel MKL库调试成功当天完成的。那个开源的TAUCS库怎么也放不到MFC中,最后只好用MKL了。这个算法的效果不是很好,Microsoft Research Asia和The Chinese University of Hong Kong的Drag-and-Drop Pasting策略效果改进很多了,主要优化了下边界和透明度处理,有时间一定也去实现下。
在生成Release版本时又遇到了问题,后来请教了牛人学长才得知,要生成Release版则库一般也要相应的是Release的。解释是,如果库的内存分配操作在内部实现,就一定也要Release的,而像OpenCV库的对象内存都是在库外分配的,所以Debug和Release可以用同一版本的lib。因为这个程序的运算量比较大,才发现Release比Debug明显快了很多!
关于TAUCS库的编译
http://www.tau.ac.il/%7Estoledo/taucs/
主要说下命令行下编译环境建立,只要在VC或VS2003/2005的安装目录下找vcvars32.bat ,如我的VS2005在D:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat,运行它即可。然后开始编译TAUCS库,在MS-DOS下,到taucs库存放configure.bat的目录,运行它,生成配置文件(makefile),再输入nmake命令就开始编译了。可以用“nmake nmake.txt ”把编译过程提示信息保存到nmake.txt文件。不过最终我还是没编译成功,就生成了个libtaucs.lib库文件,其它的都没成功生成,所以只好用Intel MKL了。
2010-06-25 补充
可能有用的方案
著名的CGAL(Computational Geometry Algorithms Libaray) 库的 Installation Manual 中提到 Taucs 项目对 vs 的支持不好,所以他们提供了一个预编译好的,有兴趣的可以去看看。 传送门
如果还不行,也可以试试用 mingw 来编译,编译好后也可以在 vs 中使用,ffmepg 的 Win32 二进制版本好像就这么得到的。
另一个数学库 Eigen
再推荐一个开源数学库 Eigen ,代码写得可以像 Matlab 一样精简,一点不夸张。我就用它和 Matlab 分别实现同一篇论文的算法,代码在数量和风格上几乎没变化(Matlab 代码都是尽可能用内置函数的噢~)。而且,该库在 Dense Matrix 的计算上与 mkl 可以相比,目前 Sparse Matrix 也支持,不过算法还在开发中。这是一个模版库,也就是说全部源代码都是头文件,不要编译。惊叹于开发人员的设计,大量使用 general programming 和 meta programming 技术,很难看懂。这些设计主要是为了提供易用 API 的同时,不牺牲效率,主要是对运算符的支持。小白本人以前就曾尝试过解决这个问题,无果。后来,查阅了 OpenCV2.0 的相关设计,了解到一些方案,不过当时没大关注。这次遇到这么大规模地应用,打算有空研究下!