2012-05-23 11 views
0

저는 GeometryDrawing을 사용하여 WPF에서 삼각형을 그립니다. 나는 현재 사용자가 움직일 수있는 슬라이더에 부착 된 ViewModel의 "Angle"속성에이를 바인딩 할 수 있기 때문에 사각형 주위를 객체 주위로 이동할 수 있습니다. 문제는 확대/축소 값을 기반으로 계산 한 특정 각도에 따라 사각형을 더 넓게 만들거나 좁힐 수 있도록하려는 것입니다. GeometryDrawing 개체에서이 작업을 수행하는 방법을 모르기 때문에 현재 사각형을 변경할 수 없습니다. 아마도 다른 객체가 사용되어야합니까?WPF에서 여러 각도를 지원하는 삼각형 그리기

GeometryDrawing 개체 코드는 이것이다 :

<GeometryDrawing Geometry="M100,100 L186.6,280 A100,100,0,0,1,13.4,280 L100,100"> 
    <GeometryDrawing.Brush> 
     <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" Opacity="0.25"> 
       <GradientStopCollection> 
        <GradientStop Color="Black" Offset="0" /> 
        <GradientStop Color="Transparent" Offset="0.9"/> 
       </GradientStopCollection> 
     </LinearGradientBrush> 
    </GeometryDrawing.Brush> 
</GeometryDrawing> 

응용 프로그램의 UI는이

를 (단지 테스트 프로젝트는, 내가 내 실제 프로젝트에서 그것을 구현하기 전에이 컨트롤을 테스트했습니다)입니다

The UI for the rectangle problem. The faded rectangle is the one in question

모든 도움을 주셔서 감사합니다.

존.

답변

1

현재 지오메트리 도면 문자열을 두 개의 LineSegments 및 ArcSegment으로 바꿀 수 있습니다.

<ArcSegment Size="100,50" 
      IsLargeArc="True" 
      SweepDirection="CounterClockwise" 
      Point="200,100" /> 

게다가, 아크는 특히 각도가 큰 (180도 근처에서) 경우 삼각형보다 자연스러운 시각입니다.

편집

이것은 당신이 원호의 끝점을 계산해야하기 때문에보기보다 어렵습니다. 코드에서 끝점을 계산하는 것 외에 다른 해결책을 찾지 못했습니다.

+0

각도에 바인딩을 사용하도록 코드가 변경되었습니다. –

+0

팁 Erno를 주셔서 감사합니다.이 솔루션을 확인하고 곧 내 의견을 게시하겠습니다. 2 개의'LineSegment' 객체를'ArcSegment'에 어떻게 연결합니까? –

+1

죄송합니다. 그러나 이것은 호의 점을 계산하는 코드를 사용하지 않으면 불가능한 것처럼 보입니다. 선과 호를 연결하는 것은 쉽습니다. 선과 호가 이전 위치에서 계속되면 세그먼트의 끝점을 지정하고 PathFigure의 IsClosed를 "참"(선을 저장하는)으로 설정하면됩니다. –

0

좋아, 나는 호를 열고 닫을 수있었습니다. 내가 이런 짓을하는 방법이

<PathGeometry> 
     <PathFigure StartPoint="50,0" IsClosed="True"> 
      <LineSegment Point="0,100" x:Name="m_leftLine" /> 
      <LineSegment Point="100,100" x:Name="m_rightLine" /> 
     </PathFigure> 
</PathGeometry> 

처럼 아크의 라인을 모두 정의 그리고 단지 필요한 각도를 사용하여 라인의 X 위치를 슬라이더의 ValueChanged 이벤트 뒤에 코드를 작성하고 다시 계산에서였다.

public partial class MyFovControl : UserControl 
{ 
private float m_oldAngleValue; 
private float m_newAngleValue; 

public MyFovControl() 
{ 
    InitializeComponent(); 
    this.zoomSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(zoomSlider_ValueChanged); 
    m_oldAngleValue = m_newAngleValue = 0; 
} 

void zoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
{ 
    m_newAngleValue = (float)(Convert.ToDouble((double)lblFovXAngle.Content)); 

    // Happens only once the first time. 
    if (m_oldAngleValue == 0) 
    { 
    m_oldAngleValue = m_newAngleValue; 
    } 

    m_leftLine.Point = new Point(m_leftLine.Point.X + (m_oldAngleValue - m_newAngleValue), m_leftLine.Point.Y); 
    m_rightLine.Point = new Point(m_rightLine.Point.X - (m_oldAngleValue - m_newAngleValue), m_rightLine.Point.Y); 
    m_oldAngleValue = m_newAngleValue; 
    } 
} 

나는 매우 메시, 알아,하지만 그게 내가의 내가 온라인 검색 한 것과 생각할 수있는 유일한 방법 -이 아마도 유일한 방법이 다음 코드의 결과.

관련 문제