一个绳线运动模拟程序
时间:2011-03-24 来源:pixels
今天开始看PDE,看到一个绳线运动方程, 于是利用该方程了一个解来模拟一下
绳线的运动,效果如下:
代码如下:
void DrawString(IplImage *image, double t){
if(!image)
return;
cvSet(image, cvScalarAll(250));
int sampleCount = image->width/2;
int marginalX = (image->width - sampleCount)/2;
int marginalY = image->height/2;
int scale = 100;
int lineWidth = 2;
// draw ends
double y = sin(CV_PI*0/sampleCount)*cos(CV_PI*t)*scale + marginalY;
cvCircle(image, cvPoint(0+marginalX, y), lineWidth, CV_RGB(0, 250, 0),
3, CV_AA);
y = sin(CV_PI*sampleCount/sampleCount)*cos(CV_PI*t)*scale + marginalY;
cvCircle(image, cvPoint(sampleCount+marginalX, y), 3, CV_RGB(0, 250, 0),
lineWidth, CV_AA);
for(int x = 0; x <= sampleCount; ++x)
{
y = ( sin(CV_PI*x/sampleCount)*cos(CV_PI*t) -
0.5*sin(2*CV_PI*x/sampleCount)*cos(2*CV_PI*t) +
0.33333333*sin(3*CV_PI*x/sampleCount)*cos(3*CV_PI*t) )*scale + marginalY;
cvLine(image, cvPoint(x+marginalX, y), cvPoint(x+marginalX, y),
CV_RGB(250, 0, 0), 2, CV_AA);
}
}
int main(int argc, char* argv[])
{
IplImage *image = cvCreateImage(cvSize(800, 600), 8, 3);
DrawCoordinate(image);
double tstep = 0.01;
double t = 0;
cvNamedWindow("Canvas", 1);
while(true)
{
DrawString(image, t);
cvShowImage("Canvas", image);
char key = cvWaitKey(33);
if(key > 0)
break;
t += tstep;
}
return 0;
}
相关阅读 更多 +