可以把相关知识发到[email protected]
著名ID,一定给分,谢谢啦。

解决方案 »

  1.   

    不太难,自己写一个函数就行了
    大概意思就是你建一些点,然后moveto lineto把点连就行了
      

  2.   

    http://www.codeproject.com/gdi/setworldtransform().asp
    这里用SetWorldTransform帮你解决问题.本来我想找用Bezier画Ellipse的,没找到. 也是个好方法, 可解决旋转问题.
      

  3.   

    用gdi+做。以下代码均测试无误!
    //椭圆圆弧
    Graphics  graphics(this->m_hWnd);
    Pen redPen(Color::Red,3);
    Rect ellipseRect(10,10,200,100);
    REAL startAngle=0.0f;
    REAL sweepAngle=90.0f;
    graphics.DrawArc(&redPen,ellipseRect/*定义弧形的矩形*/,startAngle/*开始角度*/,sweepAngle/*终止角度*/);
    //旋转椭圆
    Graphics graphics(this->m_hWnd);
    Pen greenPen(Color(255,0,255,0),3);
    graphics.RotateTransform(30);//旋转绘图平面,你需要旋转的角度
    graphics.DrawEllipse(&greenPen,10+150,10+100,100,200);
      

  4.   

    http://www.visual-graph.com    Visual Graph 是一个功能非常强大的“交互图形开发引擎”,她和其他编程语言共同工作,弥补了这些语言在图形方面的不足。    Visual Graph尤其适合开发电力、煤炭、化工等各种工业监控软件以及工程绘图、图形管理等应用。http://www.visual-graph.com
      

  5.   

    谢谢大家的关注,
    jinxuliang(smielfox) 的方法我不熟悉,回去试验一下
    jyc_nj(老蔣)介绍的是个好办法,但是上面只有椭圆旋转,回去看看能不能加在椭圆弧度上
    tmly(铁磨老妖)也谢谢你的介绍,但是我现在是需要自己自由处理
      

  6.   


    ///////////////////////////////////////////////////////////////////////////////
    //
    // 方法名: EllipseToBezier
    // 方法说明: 从椭圆特征点算出Bezier曲线所需之点
    // 参数:
    // 返回值:
    //
    // 椭圆示意图:
    //
    //       2___3___4 --->13个特征点
    //
    // 1             5       
    // dbDeltaY<--  |             |       
    // |  dbDeltaX   |       
    // 0,12    ------>      6      
    // |             |       
    // |                    |       
    // 11             7      
    //
    //       0___9___8
    //
    ///////////////////////////////////////////////////////////////////////////////void CEllipseHelper::EllipseToBezier(const vector<WKSPoint>& vertexs,             vector<WKSPoint>& pts) const
    {
    ASSERT(13L == pts.size());
    const double dbEToBConst=0.2761423749154;// 误差
    vector<WKSPoint> cControlPts(4);

    SetControlPts(vertexs, cControlPts);
    // 椭圆高度及宽度
    double dbWidth = MathHelper::Distance(cControlPts[0], cControlPts[2]);
    double dbHeight = MathHelper::Distance(cControlPts[1], cControlPts[3]);

    // 椭圆倾斜角正弦及余弦值
    double dbSinValue = (cControlPts[1].Y - cControlPts[3].Y) / dbHeight;
    double dbCosValue = (cControlPts[1].X - cControlPts[3].X) / dbHeight;

    // 计算控制点横纵坐标偏移值
    double dbDeltaX = dbWidth * dbEToBConst;
    double dbDeltaY = dbHeight * dbEToBConst; // 计算生成椭圆的BEZIER曲线控制点
    pts[0] = cControlPts[0];
    pts[1].X = pts[0].X + dbDeltaY * dbCosValue; 
    pts[1].Y = pts[0].Y + dbDeltaY * dbSinValue;     
    pts[11].X = pts[0].X - dbDeltaY * dbCosValue;
    pts[11].Y = pts[0].Y - dbDeltaY * dbSinValue;
    pts[12] = pts[0];

    pts[3] = cControlPts[1];
    pts[2].X = pts[3].X - dbDeltaX * dbSinValue; 
    pts[2].Y = pts[3].Y + dbDeltaX * dbCosValue;
    pts[4].X = pts[3].X + dbDeltaX * dbSinValue; 
    pts[4].Y = pts[3].Y - dbDeltaX * dbCosValue; pts[6] = cControlPts[2];
    pts[5].X = pts[6].X + dbDeltaY * dbCosValue;
    pts[5].Y = pts[6].Y + dbDeltaY * dbSinValue;     
    pts[7].X = pts[6].X - dbDeltaY * dbCosValue;
    pts[7].Y = pts[6].Y - dbDeltaY * dbSinValue; pts[9] = cControlPts[3];
    pts[10].X = pts[9].X - dbDeltaX * dbSinValue; 
    pts[10].Y = pts[9].Y + dbDeltaX * dbCosValue;
    pts[8].X = pts[9].X + dbDeltaX * dbSinValue; 
    pts[8].Y = pts[9].Y - dbDeltaX * dbCosValue;
    }
      

  7.   

    我也建议使用GDI+做,曲线平滑且不需要多少代码。
      

  8.   

    给你段代码 有帮助的
    float x, y;
    float angle;
    double dangle= 3.1415926536/6;
    float f1,f2,f3,f4;
    for(int i=0;i<360;i++)
    {
    angle = i*3.1415926536/180;
    f1 = cos(angle+dangle)*cos(-dangle);
    f2 = sin(angle+dangle)*sin(-dangle);
    f3 = -cos(angle+dangle)*sin(-dangle);
    f4 = sin(angle+dangle)*cos(-dangle);
    int ra=100,rb=50;
    for(int j=0;j<2;j++)
    {
    x = int(150.5 + ra*f1 + rb*f2);
    y = int(150.f + ra*f3 + rb*f4);
    *Img.GetPtr(y, x) = 1;
    ra-=2;
    rb-=2;
    }
    ra-=2;rb-=2;
    for(j=0;j<3;j++)
    {
    x = int(150.5 + ra*f1 + rb*f2);
    y = int(150.f + ra*f3 + rb*f4);
    *Img.GetPtr(y, x) = 2;
    ra-=2;
    rb-=2;
    }
    } float xangle = atan(tan(-dangle)/2)-dangle;
    x = int(150.5f + 100*cos(xangle+dangle)*cos(-dangle) + 50*sin(xangle+dangle)*sin(-dangle));
    y = int(150.5f - 100*cos(xangle+dangle)*sin(-dangle) + 50*sin(xangle+dangle)*cos(-dangle));
    *Img.GetPtr(y, x) = 3;//椭圆上x最大的点
    float yangle = atan(-1/tan(-dangle)/2)-dangle;
    x = int(150.5f + 100*cos(yangle+dangle)*cos(-dangle) + 50*sin(yangle+dangle)*sin(-dangle));
    y = int(150.5f - 100*cos(yangle+dangle)*sin(-dangle) + 50*sin(yangle+dangle)*cos(-dangle));
    *Img.GetPtr(y, x) = 3;;//椭圆上y最大的点
    Img.SetPalEntry(1, 0,255,0);
    Img.SetPalEntry(2, 255,0,0);
    Img.SetPalEntry(3, 255,255,255);
      

  9.   

    GDI+速度太慢,如果对于性能要求比较高的话,建议还是不要用。
    另外,用bezier拟合速度肯定比lineto要快,因为画bezier曲线内部微软优化了。
      

  10.   

    fengyuan 的《Windows 图形编程》上也有介绍。
      

  11.   

    我看过楼上介绍的书。我觉得大部分都说bezier是一种绘制椭圆和椭圆弧的最好方法。但是关键问题是控制点的选取。我看了很久,都没明白这控制点如何选取。如果你数学不错,你可以试试。