locked
Соединяя точки RRS feed

  • Вопрос

  • Всем привет. Подскажите, пожалуйста, как осуществить следующее: нужно не отпуская кнопки мыши, или пальца от тача соединить три точки линиями. С# приложение под Windows 8.
    25 сентября 2013 г. 7:54

Ответы

  • Добрый день.

    Общая идея в том, чтобы зафиксировав нажатие в окресностях одной из точек, создать линию с началом в этой точке и концом в точке в которой произошло нажатие. При обработке события движения указателя, вы у прямой меняете координаты конца. Как только вы приблизитесь в некоторую область около второй точки, первую прямую делаете из первой точки во вторую, и создаете вторую прямую, с началом во второй точке и концом в точке, в которой вы сейчас находитесь. И т.д.

    Вот так это будет выглядеть, для двух точек. Я взял точки 100, 100 и 400, 400. XAML выглядит вот так:

    <Page
        x:Class="App10.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App10"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}" PointerPressed="Grid_PointerPressed" PointerMoved="Grid_PointerMoved" PointerReleased="Grid_PointerReleased">
            <Ellipse Fill="Red" Margin="98,98" Width="4" Height="4" HorizontalAlignment="Left" VerticalAlignment="Top" />
            <Ellipse Fill="Red" Margin="398,398" Width="4" Height="4" HorizontalAlignment="Left" VerticalAlignment="Top" />
            
        </Grid>
    </Page>

    Ну и обработчики событий, которые добавились в cs:

    Line _line = null;
    
    bool _isTapped = false;
    
    bool _isDrawed = false;
    
    private void Grid_PointerPressed(object sender, PointerRoutedEventArgs e)
    {
        Grid main = sender as Grid;
        PointerPoint point = e.GetCurrentPoint(main);
        if (!_isDrawed && Math.Abs(point.Position.X - 100) < 10 && Math.Abs(point.Position.Y - 100) < 10)
        {
            _isTapped = true;
            _line = new Line() { X1 = 100, Y1 = 100, X2 = point.Position.X, Y2 = point.Position.Y, StrokeThickness = 2, Stroke = new SolidColorBrush(Colors.Green) };
            main.Children.Add(_line);
        }
    }
    
    private void Grid_PointerMoved(object sender, PointerRoutedEventArgs e)
    {
        if (_isTapped && !_isDrawed)
        {
            Grid main = sender as Grid;
            PointerPoint point = e.GetCurrentPoint(main);
            _line.X2 = point.Position.X;
            _line.Y2 = point.Position.Y;
            if (Math.Abs(point.Position.X - 400) < 10 && Math.Abs(point.Position.Y - 400) < 10)
            {
                _line.X2 = 400;
                _line.Y2 = 400;
                _isDrawed = true;
            }
        }
    
    }
    
    private void Grid_PointerReleased(object sender, PointerRoutedEventArgs e)
    {
        _isTapped = false;
        if (!_isDrawed)
        {
            Grid main = sender as Grid;
            main.Children.Remove(_line);
            _line = null;
        }
    }

    Выглядит это вот так:

    • Предложено в качестве ответа Oleg Kurzov 25 сентября 2013 г. 9:45
    • Помечено в качестве ответа Petr Kononov 25 сентября 2013 г. 10:16
    25 сентября 2013 г. 9:20
    Отвечающий

Все ответы

  • Добрый день.

    Общая идея в том, чтобы зафиксировав нажатие в окресностях одной из точек, создать линию с началом в этой точке и концом в точке в которой произошло нажатие. При обработке события движения указателя, вы у прямой меняете координаты конца. Как только вы приблизитесь в некоторую область около второй точки, первую прямую делаете из первой точки во вторую, и создаете вторую прямую, с началом во второй точке и концом в точке, в которой вы сейчас находитесь. И т.д.

    Вот так это будет выглядеть, для двух точек. Я взял точки 100, 100 и 400, 400. XAML выглядит вот так:

    <Page
        x:Class="App10.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App10"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}" PointerPressed="Grid_PointerPressed" PointerMoved="Grid_PointerMoved" PointerReleased="Grid_PointerReleased">
            <Ellipse Fill="Red" Margin="98,98" Width="4" Height="4" HorizontalAlignment="Left" VerticalAlignment="Top" />
            <Ellipse Fill="Red" Margin="398,398" Width="4" Height="4" HorizontalAlignment="Left" VerticalAlignment="Top" />
            
        </Grid>
    </Page>

    Ну и обработчики событий, которые добавились в cs:

    Line _line = null;
    
    bool _isTapped = false;
    
    bool _isDrawed = false;
    
    private void Grid_PointerPressed(object sender, PointerRoutedEventArgs e)
    {
        Grid main = sender as Grid;
        PointerPoint point = e.GetCurrentPoint(main);
        if (!_isDrawed && Math.Abs(point.Position.X - 100) < 10 && Math.Abs(point.Position.Y - 100) < 10)
        {
            _isTapped = true;
            _line = new Line() { X1 = 100, Y1 = 100, X2 = point.Position.X, Y2 = point.Position.Y, StrokeThickness = 2, Stroke = new SolidColorBrush(Colors.Green) };
            main.Children.Add(_line);
        }
    }
    
    private void Grid_PointerMoved(object sender, PointerRoutedEventArgs e)
    {
        if (_isTapped && !_isDrawed)
        {
            Grid main = sender as Grid;
            PointerPoint point = e.GetCurrentPoint(main);
            _line.X2 = point.Position.X;
            _line.Y2 = point.Position.Y;
            if (Math.Abs(point.Position.X - 400) < 10 && Math.Abs(point.Position.Y - 400) < 10)
            {
                _line.X2 = 400;
                _line.Y2 = 400;
                _isDrawed = true;
            }
        }
    
    }
    
    private void Grid_PointerReleased(object sender, PointerRoutedEventArgs e)
    {
        _isTapped = false;
        if (!_isDrawed)
        {
            Grid main = sender as Grid;
            main.Children.Remove(_line);
            _line = null;
        }
    }

    Выглядит это вот так:

    • Предложено в качестве ответа Oleg Kurzov 25 сентября 2013 г. 9:45
    • Помечено в качестве ответа Petr Kononov 25 сентября 2013 г. 10:16
    25 сентября 2013 г. 9:20
    Отвечающий
  • Спасибо)
    25 сентября 2013 г. 10:16