Я программно создаю форму Ellipse, но я не могу найти какое-либо свойство, которое определяет его положение. Lines
имеют X1, Y1, X2, Y2, но нет центра, положения, X, Y и т.д. в форме эллипса. Как я могу это сделать?
Как указать положение формы эллипса на холсте в WPF?
Ответ 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);
}