Что не так со следующим кодом? - PullRequest
0 голосов
/ 08 сентября 2011

Я получаю полный эллипс, а не пересечение между ними. Что не так?

<Canvas x:Name="mainCnavs">
<Ellipse x:Name="ellipse" Width="100" Height="50" Canvas.Top="100" Canvas.Left="300" Fill="Transparent" Stroke="Red" StrokeThickness="3"/>
<Ellipse x:Name="ellipse1" Width="100" Height="50" Canvas.Top="100" Canvas.Left="250" Fill="Transparent" Stroke="Red" StrokeThickness="3"/>
</Canvas>

 public partial class MainWindow : Window
    {
        CombinedGeometry g;
        Path p;
        public MainWindow()
        {
            InitializeComponent();
            mainWindow.Loaded += new RoutedEventHandler(mainWindow_Loaded);

        }

        void mainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            g = new CombinedGeometry(ellipse.RenderedGeometry, ellipse1.RenderedGeometry);
            g.GeometryCombineMode = GeometryCombineMode.Intersect;
            statusBar.Text = "top left " + g.Bounds.TopLeft.ToString() +"   bounds.size   " + g.Bounds.Size + "    bounds " + g.Bounds.ToString();
            p = new Path();
            p.Data = g;
            p.Fill = Brushes.Green;
            mainCnavs.Children.Add(p);
        }


}

Если я изменю эллипс на прямоугольник и сделаю объединение, получим две перекрывающиеся фигуры. Он ведет себя так, как будто две геометрии не имеют позиционирования, потому что я использую визуализированную геометрию, и у нее нет связанной с ней позиции? Тогда как еще можно получить геометрию формы?

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Да, проблема заключается в использовании RenderedGeometry, так как он не содержит положение относительно Canvas.

Попробуйте использовать собственную EllipseGeometry, построенную из позиций эллипсов.

        Rect r1 = new Rect(Canvas.GetLeft(ellipse), Canvas.GetTop(ellipse), ellipse.Width, ellipse.Height);
        Rect r2 = new Rect(Canvas.GetLeft(ellipse1), Canvas.GetTop(ellipse1), ellipse1.Width, ellipse1.Height);
        EllipseGeometry eg1 = new EllipseGeometry(r1);
        EllipseGeometry eg2 = new EllipseGeometry(r2);

        CombinedGeometry g = new CombinedGeometry(eg1, eg2);
        g.GeometryCombineMode = GeometryCombineMode.Intersect;
        //statusBar.Text = "top left " + g.Bounds.TopLeft.ToString() + "   bounds.size   " + g.Bounds.Size + "    bounds " + g.Bounds.ToString();
        Path p = new Path();
        p.Data = g;
        p.Fill = Brushes.Green;
        mainCnavs.Children.Add(p);
1 голос
/ 08 сентября 2011

Вы видите правильное пересечение, оно должно быть просто по форме эллипса.Есть одна вещь, которую вы не учли, все геометрии находятся в начале координат (положение относительно холста не имеет значения).Поскольку обе геометрии имеют одинаковую форму и местоположение, вы увидите одну и ту же форму, когда получите пересечение.Попробуйте каким-либо образом изменить форму любого эллипса, и вы увидите разницу.

Вам нужно перевести одну из геометрий на соответствующие смещения, чтобы получить правильную форму.Возможно, даже не стоит устанавливать все присоединенные свойства Top и Left.

Чтобы продемонстрировать, что вы можете сделать вместо этого:

var ellipseGeometry1 = new EllipseGeometry(new Rect(50, 0, 100, 50));
var ellipseGeometry2 = new EllipseGeometry(new Rect(0, 0, 100, 50));
var ellipse1 = new Path { Data = ellipseGeometry1, Stroke = Brushes.Red, Fill = Brushes.Transparent, StrokeThickness = 3 };
var ellipse2 = new Path { Data = ellipseGeometry2, Stroke = Brushes.Red, Fill = Brushes.Transparent, StrokeThickness = 3 };
Canvas.SetTop(ellipse1, 100);
Canvas.SetLeft(ellipse1, 250);
Canvas.SetTop(ellipse2, 100);
Canvas.SetLeft(ellipse2, 250);
mainCanvas.Children.Add(ellipse1);
mainCanvas.Children.Add(ellipse2);
var g = new CombinedGeometry
{
    Geometry1 = ellipseGeometry1,
    Geometry2 = ellipseGeometry2,
    GeometryCombineMode = GeometryCombineMode.Intersect,
};
var p = new Path
{
    Data = g,
    Stroke = Brushes.Transparent,
    Fill = Brushes.Green,
};
mainCanvas.Children.Add(p);
...