Форум программистов, компьютерный форум, киберфорум
Наши страницы

C#: WPF, UWP и Silverlight

Войти
Регистрация
Восстановить пароль
 
HomBro
1 / 1 / 1
Регистрация: 14.12.2015
Сообщений: 58
#1

Как оптимизировать работу программы визуализации графов? - C# WPF

14.04.2017, 20:24. Просмотров 224. Ответов 3
Метки нет (Все метки)

В общем, программа должна генерировать граф и визуализировать его, всё работает, но если вводить число вершин больше 30, то генерируется и отрисовывается очень долго, а при вводе больше 160 вылетает. Возможно ли как нибудь оптимизировать работу?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        public void Button_Click(object sender, RoutedEventArgs e)
        {
            textBox2.Text = "";
            canvas.Children.Clear();
            Random c = new Random();
            int n = Convert.ToInt32(textBox.Text);
            int[,] arr = new int[n, n];
 
            for (int i = 0; i < n; i++)
                for (int j = i; j < n; j++)
                    if(i == j)
                        arr[i, j] = 0;
                    else
                    {
                        arr[i, j] = c.Next(2);
                        arr[j, i] = arr[i, j] ;
                    }
 
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    textBox2.Text += arr[i, j].ToString() + "   ";
                }
                textBox2.Text += "\n";
            }
 
            canvas.Children.Clear();
            Line[] line = new Line[n];
            Ellipse[] ellipse = new Ellipse[n];
            double x, y, degInRad;
            float DEG2RAD = (float)(3.14159 / 180);
 
            for (int i = 0; i < n; i++)
            {
                degInRad = i * 360 / n * DEG2RAD;
 
                ellipse[i] = new Ellipse();
                ellipse[i].Width = 10;
                ellipse[i].Height = 10;
                ellipse[i].Fill = Brushes.Black;
 
                x = Math.Cos(degInRad) * 330 + (700 / 2);
                y = Math.Sin(degInRad) * 225 + (550 / 2);
 
                Canvas.SetLeft(ellipse[i], x);
                Canvas.SetTop(ellipse[i], y);
 
                canvas.Children.Add(ellipse[i]);
            }
 
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if(arr[i, j] == 1)
                    {
                        line[i] = new Line();
                        line[i].Stroke = Brushes.Black;
                        line[i].X1 = Math.Cos(i * 360 / n * DEG2RAD) * 330 + (700 / 2) + 5;
                        line[i].Y1 = Math.Sin(i * 360 / n * DEG2RAD) * 225 + (550 / 2) + 5;
                        line[i].X2 = Math.Cos(j * 360 / n * DEG2RAD) * 330 + (700 / 2) + 5;
                        line[i].Y2 = Math.Sin(j * 360 / n * DEG2RAD) * 225 + (550 / 2) + 5;
                        canvas.Children.Add(line[i]);
                    }
                }
            }
        }
    }
}
XAML:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="613" Width="1282">
    <Grid>
        <Canvas Name="canvas" HorizontalAlignment="Left" Height="551" Margin="550,10,0,0" VerticalAlignment="Top" Width="700"/>
        <Button Content="Сгенерировать" HorizontalAlignment="Left" Height="26" Margin="10,535,0,0" VerticalAlignment="Top" Width="150" Click="Button_Click"/>
        <TextBox Name="textBox" HorizontalAlignment="Left" Height="26" Margin="185,535,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="345"/>
        <TextBox Name="textBox2" HorizontalAlignment="Left" Height="520" Margin="10,10,0,0" TextWrapping="NoWrap" Text="" VerticalAlignment="Top" Width="520" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" />
    </Grid>
</Window>
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2017, 20:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как оптимизировать работу программы визуализации графов? (C# WPF):

.NET 4.x Визуализация, отрисовка графов, деревьев, списков, структур. Библиотеки визуализации под WPF. - C#
Недавно столкнулся с проблемой поиска подходящих средств для отрисовки графов, списков, деревьев и т.п. структур. Слышал про отдельную...

Как оптимизировать работу с несколькими DataGridView? - C#
Есть форма с несколькими DataGridView (отсюда http://www.cyberforum.ru/csharp-net/thread228350.html). По клику в заголовке нужно переходить...

Как оптимизировать работу с большими массивами изображений - C#
Добрый вечер. Хотел бы получить небольшую консультацию. В процессе работы приложения, необходимо работать с множеством массивов(например...

.NET 4.x Разработка простой программы по 3D визуализации. - C#
Добрый день уважаемые форумчане. И так, перейду непосредственно к делу. Дана была задача, написать программу по сварке. Где был-бы 3D...

Как построить работу программы? - C#
Есть объект, у него есть критерии, по которым можно определить является ли объект опасным/неопасным. Если хоть один критерий является...

Как отслеживать из моей программы работу Лингво словаря и КМплеера - C#
например, собирать слова Линво словаря открытые пользователем в моей программе, или какие субтитры были испльзованы в Кмплеере? для это...

3
ViterAlex
6091 / 3308 / 1008
Регистрация: 11.02.2013
Сообщений: 7,301
Завершенные тесты: 3
14.04.2017, 22:52 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
HomBro, во-первых, массивы тебе не нужны
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public void Button_Click(object sender, RoutedEventArgs e)
{
    textBox2.Text = "";
    canvas.Children.Clear();
    Random c = new Random();
    int n = Convert.ToInt32(textBox.Text);
    int[,] arr = new int[n, n];
 
    for (int i = 0; i < n; i++)
        for (int j = i; j < n; j++)
            if (i == j)
                arr[i, j] = 0;
            else
            {
                arr[i, j] = c.Next(2);
                arr[j, i] = arr[i, j];
            }
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            textBox2.Text += arr[i, j].ToString() + "   ";
        }
        textBox2.Text += "\n";
    }
 
    canvas.Children.Clear();
    double x, y, degInRad;
    float DEG2RAD = (float)(3.14159 / 180);
 
    for (int i = 0; i < n; i++)
    {
        degInRad = i * 360d / n * DEG2RAD;
 
        var ellipse = new Ellipse
        {
            Width = 10,
            Height = 10,
            Fill = Brushes.Black
        };
 
        x = Math.Cos(degInRad) * 330 + 700 / 2d;
        y = Math.Sin(degInRad) * 225 + 550 / 2d;
 
        Canvas.SetLeft(ellipse, x);
        Canvas.SetTop(ellipse, y);
 
        canvas.Children.Add(ellipse);
    }
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (arr[i, j] != 1) continue;
            var line = new Line
            {
                Stroke = Brushes.Black,
                X1 = Math.Cos(i * 360d / n * DEG2RAD) * 330 + 700 / 2d + 5,
                Y1 = Math.Sin(i * 360d / n * DEG2RAD) * 225 + 550 / 2d + 5,
                X2 = Math.Cos(j * 360d / n * DEG2RAD) * 330 + 700 / 2d + 5,
                Y2 = Math.Sin(j * 360d / n * DEG2RAD) * 225 + 550 / 2d + 5
            };
            canvas.Children.Add(line);
        }
    }
}
У меня сработало немного быстрее и памяти сожрало меньше. Да и уборщик мусора меньше напрягался.
Во-вторых, можно вынести всё в отдельный поток
1
HomBro
1 / 1 / 1
Регистрация: 14.12.2015
Сообщений: 58
15.04.2017, 08:24  [ТС] #3
ViterAlex, а вылет при вводе больших значений, я так понимаю, связан уже с самим текстбоксом или же с другими элементами так же будет?
0
LEX38RUS
7 / 7 / 0
Регистрация: 27.06.2015
Сообщений: 70
15.04.2017, 13:34 #4
Вылет больших чисел наверное связан с типом переменных интеджер? Если я правильно понял.
Хотя это какие числа то вводить надо )))
0
15.04.2017, 13:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2017, 13:34
Привет! Вот еще темы с ответами:

Выкладываю часть кода моей программы, хочу чтобы вы мне указали где что лучше здесь оптимизировать исправить - C#
Здравствуйте, я недавно в программировании на C# поэтому тонкостей не знаю, выкладываю часть кода моей программы, хочу чтобы вы мне указали...

Как оптимизировать приведённый код? - C# WPF
Доброе время суток! У меня такой вопрос: Как можно оптимизировать подобный код? case 1: Change = 0; ...

Влияние расположения инициации переменной на работу программы - C#
Здравствуйте. При написании сканера памяти столкнулся с проблемой, которую не могу решить. Суть проблемы в том, что при объявлении...

Как оптимизировать применение регулярных выражений - C#
Как оптимизировать следующий код? string a2 = Regex.Replace(x, p, @&quot;$4&quot;, RegexOptions.IgnoreCase); string a3 = Regex.Replace(x, p,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.