抛物线

来源:互联网 发布:js字符串拼接引号 编辑:程序博客网 时间:2024/04/29 01:15

已知三点绘制抛物线,以下代码在VC.NET2003中测试通过。

 

绘制规则:

1. 把抛物线的顶点移到屏幕的中间的顶部或底部。

2. 通过缩放保证给定的三点在屏幕范围内。

 

改进:

1. 用点绘图,不连续。

2. 缩放比例过大时,图形有些失真。

3. 显示点及坐标轴相关信息。

  1. void CChildView::OnPaint() 
  2. {
  3.     CPaintDC dc(this); // 用于绘制的设备上下文 
  4.     //double x1 = 100;  
  5.     //double y1 = 100;  
  6.     //double x2 = 200;  
  7.     //double y2 = 200;  
  8.     //double x3 = 300;  
  9.     //double y3 = 150; 
  10.     //double x1 = 50;  
  11.     //double y1 = 50;  
  12.     //double x2 = 30;  
  13.     //double y2 = 30;  
  14.     //double x3 = -8;  
  15.     //double y3 = 31;  
  16.     double x1 = 183; 
  17.     double y1 = 373; 
  18.     double x2 = 330; 
  19.     double y2 = 553; 
  20.     double x3 = 553; 
  21.     double y3 = 229; 
  22.     double a = (y1*x2 + y2*x3 + y3*x1 - y3*x2 - y2*x1 - y1*x3) / (x1*x1*x2 + x2*x2*x3 + x3*x3*x1 - x3*x3*x2 - x2*x2*x1 - x1*x1*x3); 
  23.     double b = -(y1*x2*x2 + y2*x3*x3 + y3*x1*x1 - y3*x2*x2 - y2*x1*x1 - y1*x3*x3) / (x1*x1*x2 + x2*x2*x3 + x3*x3*x1 - x3*x3*x2 - x2*x2*x1 - x1*x1*x3); 
  24.     double c = (y1*x2*x2*x3 + y2*x3*x3*x1 + y3*x1*x1*x2 - y3*x2*x2*x1 - y2*x1*x1*x3 - y1*x3*x3*x2) / (x1*x1*x2 + x2*x2*x3 + x3*x3*x1 - x3*x3*x2 - x2*x2*x1 - x1*x1*x3); 
  25.     //顶点 
  26.     double x0 = -b / 2 / a;
  27.     double y0 = (4*a*c - b*b) / 4 / a;
  28.     //三点中的最远点 
  29.     double xm = x1;
  30.     double ym = y1;
  31.     if( abs(x2-x0) > abs(x1-x0) )
  32.     {
  33.         xm = x2;
  34.         ym = y2;
  35.     }
  36.     if( abs(x3-x0) > abs(xm-x0) )
  37.     {
  38.         xm = x3;
  39.         ym = y3;
  40.     }
  41.     //x、y区间 
  42.     double cx = ( abs(xm - x0) + 1 ) * 2;
  43.     double cy = ( abs(ym - y0) + 1 );
  44.     //设绘图区 
  45.     dc.SetMapMode(MM_ISOTROPIC);
  46.     dc.SetWindowExt( cx, cy ); 
  47.     //设视口和原点 
  48.     CRect rectClient; 
  49.     GetClientRect(rectClient); 
  50.     dc.SetViewportExt( rectClient.right, -rectClient.bottom ); 
  51.     if( a > 0 ) dc.SetViewportOrg( rectClient.right/2, rectClient.bottom );
  52.     else dc.SetViewportOrg( rectClient.right/2, 0 );
  53.     //绘图 
  54.     for(int x = -cx/2; x < cx/2; x++) 
  55.     { 
  56.         double y = a*x*x;     //把抛物顶点移到视口原点后就变成这样一个简单的函数了
  57.         dc.SetPixel(x,y,RGB(0,0,0)); 
  58.     }
  59. }