web-dev-qa-db-fra.com

Comment spécifier la position d'une forme d'ellipse sur une toile dans WPF?

Je crée de manière programmable une forme d'ellipse mais je ne trouve aucune propriété qui spécifie sa position. Lines avoir x1, y1, x2, y2, mais il n'y a pas de centre, de position, x, y, etc. sur une forme d'ellipse. Comment puis-je faire ceci?

16
Joan Venge

La mise en place des formes dans des endroits arbitraires sur l'écran doit probablement être faite dans un panneau de toile (voir la réponse de Phoog). Mais si vous placez cela dans une grille ou un autre panneau à la place, vous pouvez toujours modifier la propriété de marge pour la placer où vous le souhaitez.

Si vous vouliez le faire en spécifiant le point central au lieu du coin supérieur gauche de l'ellipse, vous pouvez le faire:

Ellipse CreateEllipse(double width, double height, double desiredCenterX, double desiredCenterY)
{
    Ellipse ellipse = new Ellipse { Width = width, Height = height };
    double left = desiredCenterX - (width / 2);
    double top  = desiredCenterY - (height/ 2);

    ellipse.Margin = new Thickness(left, top, 0, 0);
    return ellipse;
}

Je n'ai pas vérifié que cela fait exactement ce que vous voulez dans le compilateur, mais j'espère avoir l'idée. Encore une fois, l'utilisation de toile serait la méthode préférée sur l'utilisation de la marge à l'intérieur d'un panneau non en toile, mais le même principe de calcul de gauche et de haut s'appliquerait toujours:

Canvas.SetLeft(ellipse, desiredCenterX - (width/2))
Canvas.SetTop(ellipse, desiredCenterY - (height/2))
21
viggity

Si vous avez les points de départ et de fin ainsi que le rayon et un booléen pour s'il s'agit d'une montre ou non, utilisez ma fonction :)

function ellipse(x1, y1, x2, y2, radius, clockwise) {
    var cBx = (x1 + x2) / 2;    //get point between xy1 and xy2
    var cBy = (y1 + y2) / 2;
    var aB = Math.atan2(y1 - y2, x1 - x2);  //get angle to bulge point in radians
    if (clockwise) { aB += (90 * (Math.PI / 180)); }
    else { aB -= (90 * (Math.PI / 180)); }
    var op_side = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) / 2;
    var adj_side = Math.sqrt(Math.pow(radius, 2) - Math.pow(op_side, 2));

    if (isNaN(adj_side)) {
        adj_side = Math.sqrt(Math.pow(op_side, 2) - Math.pow(radius, 2));
    }

    var Cx = cBx + (adj_side * Math.cos(aB));            
    var Cy = cBy + (adj_side * Math.sin(aB));
    var startA = Math.atan2(y1 - Cy, x1 - Cx);       //get start/end angles in radians
    var endA = Math.atan2(y2 - Cy, x2 - Cx);
    var mid = (startA + endA) / 2;
    var Mx = Cx + (radius * Math.cos(mid));
    var My = Cy + (radius * Math.sin(mid));
    context.arc(Cx, Cy, radius, startA, endA, clockwise);
}
0
Grant