2010-07-19 66 views

回答

2

的四点饼功能:

  1. 上边框的左上角。
  2. 边界矩形的右下角。
  3. 指向标记饼图开始的圆上的点。
  4. 指向标记馅饼末端的圆圈(逆时针)。

转换:

中心点:CX,赛扬 半径,R 角度:一个

假设你的馅饼从高层开始。

  1. X1 = CX-R,Y1 = CX + R
  2. X2 = CX + R,Y2 =赛扬-R
  3. X3 = CX,Y3 = Y1
  4. X4 = CX + R罪(a),Y4 = Cy + rcos(a)

你可能不得不在某个地方翻转一个标志,但是这应该是有用的。

用两个不同角度的(a和b):

  • X3 = CX + R SIN(a)中,Y3 =赛扬+ R cos(A)
  • X4 = Cx + r sin(b),Y4 = Cy + r cos(b)
  • +0

    由此得出一个馅饼从零到角A,哪里的角B来了,所以我们必须从A馅饼到B? – Maysam 2010-07-19 19:25:58

    0

    这是用(旧)C++编写的,但大多数应该很容易地转换为Delphi(或几乎任何其他)。它还假定输入是以百分比(整圆为100%)而不是原始角度,但(再次)应该很容易处理。它以弧度转换百分比到角度,所以从其他单位转换应该是一个很小的调整。

    class section { 
        double percent; 
        int color; 
    public: 
    
        section(double percent_, int color_) : 
         percent(percent_), color(color_) {} 
    
        void draw(HDC destination, POINT const &center, int diameter, double &start_angle); 
    }; 
    

    void section::draw(HDC destination, POINT const &center, int radius, double &start_angle) { 
    
        double start_x, start_y, end_x, end_y; 
        double angle, end_angle; 
    
        int top = center.y - radius; 
        int bottom = center.y + radius; 
        int left = center.x - radius; 
        int right = center.x + radius; 
    
        // now we have to convert a percentage to an angle in radians. 
        // there are 100 percent in a circle, and 2*PI radians in a 
        // circle, so we figure this percentage of 2*PI radians. 
        angle = percent/100.0 * 2.0 * 3.1416; 
    
        end_angle = start_angle + angle; 
    
        // Now we have to convert these angles into rectangular 
        // coordinates in the window, which depend on where we're 
        // putting the chart, and how big we're making it. 
        start_x = center.x + radius * cos(start_angle); 
        start_y = center.y + radius * sin(start_angle); 
    
        end_x = center.x + radius * cos(end_angle); 
        end_y = center.y + radius * sin(end_angle); 
    
        // Now we need to actually draw the pie section by selecting 
        // the correct color into the DC, drawing the section, then 
        // selecting the original brush back, and deleing our brush. 
        HBRUSH brush = CreateSolidBrush(color); 
    
        HBRUSH old_brush = (HBRUSH)SelectObject(destination, brush); 
    
        Pie(destination, left, top, right, bottom, 
         (int)start_x, (int)start_y, (int)end_x, (int)end_y); 
    
        SelectObject(destination, old_brush); 
        DeleteObject(brush); 
    
        // our sole awareness of other sections: the next section will 
        // start wherever we finished. 
        start_angle = end_angle; 
    }