摘要:
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 data
Graphics g(hDC);
Pen p(Color(0xff, 0, 0), 1.0); //Red
GetClientRect(hWnd, &rc);
z = 0.99; //Point coordinate affinity
dx = double(rc.right) / 2.0 - 1.0; //Half window height
dy = double(rc.bottom) / 2.0 - 1.0; //Half window width
wx = double(rc.right) / 2.0; //Ellipse center
hy = double(rc.bottom) / 2.0; //Ellipse center
for(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 now
g.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 one
g.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);
*/
}