Как указать положение формы эллипса на холсте в WPF? - PullRequest
16 голосов
/ 08 апреля 2011

Я программно создаю форму эллипса, но я не могу найти свойство, которое определяет его положение.Lines имеют X1, Y1, X2, Y2, но в форме эллипса нет центра, положения, X, Y и т. Д.Как я могу это сделать?

Ответы [ 3 ]

21 голосов
/ 08 апреля 2011

Размещение фигур в произвольных местах на экране, вероятно, должно быть сделано на панели Canvas (см. Ответ @ phoog).Но если вместо этого вы помещаете это в сетку или другую панель, вы всегда можете изменить свойство Margin, чтобы разместить его там, где вы хотите.

Если вы хотите сделать это, указав центральную точку вместоВ верхнем левом углу эллипса вы можете сделать это:

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

Я не проверял, что это именно то, что вы хотите в компиляторе, но, надеюсь, вы поняли идею.Опять же, использование Canvas было бы предпочтительным методом по сравнению с использованием Margin внутри панели, не связанной с Canvas, но тот же принцип вычисления left и top все равно будет применяться:

Canvas.SetLeft(ellipse, desiredCenterX - (width/2))
Canvas.SetTop(ellipse, desiredCenterY - (height/2))
14 голосов
/ 08 апреля 2011

Canvas.Left и Canvas.Top. Это все в документации "Как нарисовать эллипс или круг" http://msdn.microsoft.com/en-us/library/ms751563.aspx

В коде C # синтаксис будет следующим:

void CreateCanvasWithEllipse(double desiredLeft, double desiredTop)
{
    Canvas canvas = new Canvas();
    Ellipse ellipse = SomeEllipseConstructionMethod();
    Canvas.SetLeft(ellipse, desiredLeft);
    Canvas.SetTop(ellipse, desiredTop);
}
0 голосов
/ 15 марта 2013

Если у вас есть начальная и конечная точки, а также радиус и логическое значение, если это по часовой стрелке или нет, используйте мою функцию:)

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...