Подтвердить что ты не робот

Как указать положение формы эллипса на холсте в WPF?

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

4b9b3361

Ответ 1

Помещение фигур в произвольные места на экране должно быть сделано на панели Canvas (см. @phoog response). Но если вы размещаете это в Grid или какой-либо другой панели, вы всегда можете изменить свойство 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))

Ответ 2

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

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

void CreateCanvasWithEllipse(double desiredLeft, double desiredTop)
{
    Canvas canvas = new Canvas();
    Ellipse ellipse = SomeEllipseConstructionMethod();
    Canvas.SetLeft(ellipse, desiredLeft);
    Canvas.SetTop(ellipse, desiredTop);
}

Ответ 3

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

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