2010-07-19 4 views

Répondre

2

Les quatre points dans la fonction tarte:

  1. coin supérieur gauche du rectangle de sélection.
  2. Coin inférieur droit du rectangle englobant.
  3. Pointez sur le cercle qui marque le début de la tarte.
  4. Pointez sur le cercle qui marque l'extrémité de la tarte (sens inverse des aiguilles d'une montre).

Conversion:

Centerpoint: cx, cy Rayon: r Angle: une

En supposant que votre tarte commence au sommet.

  1. X1 = Cx-r, Y1 = Cx + r
  2. X2 = Cx + r, Y2 = Cy-r
  3. X3 = Cx, Y3 = Y1
  4. X4 = Cx + r sin (a), Y4 = Cy + r cos (a)

Vous devrez peut-être retourner un signe quelque part, mais cela devrait faire l'affaire.

Avec deux anges différentes (a et b):

  1. X3 = Cx + sin r (a), Y3 = Cy + r cos (a)
  2. X4 = Cx + r sin (b), Y4 = Cy + r cos (b)
+0

ce tire une tarte de zéro à angle A, où est l'angle B venir donc nous avons une tarte de A à B? – Maysam

0

Ceci est écrit en (ancien) C++, mais la plupart devrait être converti en Delphi (ou presque n'importe quoi d'autre) assez facilement. Il suppose également que les entrées sont en pourcentages (un cercle complet est de 100%) au lieu d'angles bruts, mais (encore une fois) cela devrait être assez facile à traiter. Il a une conversion de pourcentage en angle en radians, donc une conversion d'autres unités devrait être un ajustement assez trivial.

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; 
} 
Questions connexes