摘要:
VTK没有提供椭圆工具,所以自己写了个绘制二维椭圆的类,随便也把直线工具也重新写了下。
参考代码:
C++
//A basic algorithm to draw an N segments ellipse on a window
// hWnd +> Handle to the window where the ellipse will be drawn
// hDC +> Device context to the window where the ellipse will be drawn
// nSeg +> A global variable contains the number of segments or points linked each other to form the ellipse
void MyDrawEllipse(HWND hWnd, HDC hDC)
{double x, y, _x, _y, __x, __y, dx, dy, z, wx, hy;RECT rc;//Prepare objects and dataGraphics g(hDC);Pen p(Color(0xff, 0, 0), 1.0); //RedGetClientRect(hWnd, &rc);z = 0.99; //Point coordinate affinitydx = double(rc.right) / 2.0 - 1.0; //Half window heightdy = double(rc.bottom) / 2.0 - 1.0; //Half window widthwx = double(rc.right) / 2.0; //Ellipse centerhy = double(rc.bottom) / 2.0; //Ellipse centerfor(int i = 0; i < int(nSeg); i++) {x = wx * sin((double(i) / double(nSeg)) * (pi*2.0));y = hy * cos((double(i) / double(nSeg)) * (pi*2.0));if(i > 0) {//Draw a line connecting the last point to the one being calculated nowg.DrawLine(&p, int(dx+_x+z), int(dy+-_y+z), int(dx+x+z), int(dy+-y+z));} else {//Save the first point coordinate to link it with the last one__x = x;__y = y;}//Save the actual point coordinate to link it with the next one_x = x;_y = y;}//Draw a line between the last point and the first oneg.DrawLine(&p, int(dx+x+z), int(dy+-y+z), int(dx+__x+z), int(dy+-__y+z));/*//I use the GDI+ DrawEllipse function to compare my algorithm with//the one used by GDI+. Only the visual result is important for me now!p.SetColor(Color(0, 0xff, 0));g.DrawEllipse(&p, 0, 0, rc.right-1, rc.bottom-1);*/
}
原文链接:Ellipse drawing algorithm - CodeProject