2011-04-08 2 views

답변

18

퍼팅 모양 그래서 캔버스 패널 (@ phoog의 응답 참조). 그러나 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.SetLeft(ellipse, desiredCenterX - (width/2)) 
Canvas.SetTop(ellipse, desiredCenterY - (height/2)) 
+1

왼쪽 속성이없는 이유는 무엇입니까? WPF는 너무 이상합니다. – Kamil

+1

@Kamil이 경우의 위치 지정은 타원 자체가 아닌 contanier의 속성입니다. 캔버스에서'Canvas.Left' 속성을 설정합니다. 이상하게도 ... – heltonbiker

+0

@heltonbiker 나는 이런 식으로 설계된 이유가 있다고 생각하지만, 나는 그 이유를 아직 발견하지 못했다. – Kamil

13

Canvas.Left 및 Canvas.Top. 그것은 C# 코드에서 http://msdn.microsoft.com/en-us/library/ms751563.aspx

"어떻게 타원 또는 원을 그리려면"에 문서의 모든있어, 구문이 될 것이다 : 아마 수행해야 화면에 임의의 장소에서

+0

감사합니다. 코드에서 시도했지만 작동하지 않습니다. 저는 이것을했습니다 :'ellipse.Canvas.Left'.'Ellipse' 객체에는'Canvas' 속성이 없습니다. –

+1

나는 내 대답을 편집하여 C# 구문을 보여 주었다. Canvas.Left 속성 (및 .Top, .Bottom, .Right)은 연결된 속성입니다. 개요는 http://msdn.microsoft.com/en-us/library/ms749011.aspx – phoog

-1

을 당신은뿐만 아니라 시작과 끝 지점이있는 경우 : 다시 캔버스를 사용하여 비 캔버스 패널의 안쪽 여백을 사용을 통해 선호하는 방법,하지만 왼쪽 계산 상단이 여전히 적용됩니다 같은 원칙이 될 것입니다 반지름과 부울 값으로 시계 방향인지 아닌지에 대한 내 함수를 사용하십시오 :)

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); 
} 
관련 문제