Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
asopars
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 21
#1

Построение созвездия по точкам

07.01.2018, 22:28. Просмотров 964. Ответов 27
Метки нет (Все метки)

Добрый вечер, нужна помощь:
графическая конфигурация созвездия представлена в виде точек и линий
Необходимо построить рисунок созвездия..
Натолкните на нужную мысль
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2018, 22:28
Ответы с готовыми решениями:

Построение графика по точкам
Собственно как сделать чтоб сетка координат отображалась постоянно, а не...

Построение графика по точкам
Подскажите, как в формах вообще можно рисовать графики. Особенно интересует как...

Обход пути по точкам
Здравствуйте. Приходится сразу создавать, как по мне, сложные темы. ...

Анимированный график по точкам
Всем доброго дня!!! У меня есть файл txt в котором массив из точек (7001 чисел...

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

27
asopars
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 21
08.01.2018, 17:41  [ТС] #21
Цитата Сообщение от ViterAlex Посмотреть сообщение
при такой организации словаря, где ключом является целое число, а значением строка, где хранятся названия и описание?
Да, ключ целое число: m_consteallationDictonary = new Dictionary<int, ConstellationInfo>();
Значение:
C#
1
2
3
4
5
6
7
8
9
10
11
12
class ConstellationInfo
    {
        public string Name { get; set; }
        public string Prehistory { get; set; }
        public string Coordinates { get; set; }
        public ConstellationInfo(string name, string prehistory, string coordinates)
        {
            Name = name;
            Prehistory = prehistory;
            Coordinates = coordinates;
        }
    }
Добавлено через 1 час 26 минут
ViterAlex, Да все рисует, спасибо, только не читается последняя координата, использую GetPoints.
И как можно чтобы при клике на кнопке менялся рисунок на следующее созвездие например
0
ViterAlex
6413 / 3613 / 1482
Регистрация: 11.02.2013
Сообщений: 7,964
Завершенные тесты: 3
08.01.2018, 18:07 #22
asopars, берёшь следующее и рисуешь. Нужно указатель какой-нибудь завести или текущий объект.
0
asopars
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 21
08.01.2018, 18:14  [ТС] #23
Цитата Сообщение от ViterAlex Посмотреть сообщение
берёшь следующее и рисуешь. Нужно указатель какой-нибудь завести или текущий объект.
Не особо понял как это сделать, например у меня генерируется случайное число и при нажатие на кнопку нужно обратиться к OnPaint?
И так и не понял насчет того почему не считываются последние координаты
0
Diamante
1269 / 1025 / 649
Регистрация: 14.08.2016
Сообщений: 3,553
Завершенные тесты: 1
09.01.2018, 01:28 #24
ViterAlex, кхм, ну неужели не понятно, что ТС дуб нубом(нуб дубом)/нужное подчеркнуть...
пиши уже сразу все варианты...
З.Ы. разводят тебя...
0
asopars
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 21
09.01.2018, 17:01  [ТС] #25
ViterAlex,
В общем, я так и не разобрался как сделать, чтобы при клике на кнопку переходило к случайному/последующему созвездию..
При клике на кнопку:
C#
1
2
3
4
5
6
7
8
9
10
11
12
private void gameButton_Click(object sender, EventArgs e)
        {
            if (consteallationDictonary[m_randomConstellation].Name == gameTextBox.Text)
            {
                gameLabel.Text = "Ответ верный!";
            }
            else
            {
                gameLabel.Text = "Ответ неверный!";
            }
            m_randomConstellation++;
        }
Onpaint:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            List<Point> points = new List<Point>();
            points = constellationList.GetPoints(consteallationDictonary[m_randomConstellation].Coordinates);
            Pen blackPen = new Pen(Color.Black, 1);
            Point[] curvePoints = new Point[points.Count];
            for (int i = 0; i < points.Count; i++)
            {
                e.Graphics.FillEllipse(Brushes.Blue, points[i].X - 5, points[i].Y - 5, 10, 10);
                curvePoints[i] = points[i];
            }
 
            e.Graphics.DrawPolygon(blackPen, curvePoints);
        }
Никак не могу понять как это сделать...
0
ViterAlex
6413 / 3613 / 1482
Регистрация: 11.02.2013
Сообщений: 7,964
Завершенные тесты: 3
09.01.2018, 17:14 #26
Метод OnPaint вызывается всегда при перерисовке формы, поэтому нужно программно вызвать перерисовку методом Invalidate()
ну и сам метод OnPaint очистить от лишнего:
C#
1
2
3
4
5
6
7
8
9
10
protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    var points = constellationList.GetPoints(consteallationDictonary[m_randomConstellation].Coordinates);
    for (int i = 0; i < points.Count; i++)
    {
        e.Graphics.FillEllipse(Brushes.Blue, points[i].X - 5, points[i].Y - 5, 10, 10);
    }
    e.Graphics.DrawPolygon(Pens.Black, points.ToArray());
}
Организация данных какая-то странная у тебя. Есть список созвездий и отдельно словарь с координатами. Почему бы всё это не держать в одном классе?
1
asopars
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 21
09.01.2018, 17:51  [ТС] #27
Цитата Сообщение от ViterAlex Посмотреть сообщение
Организация данных какая-то странная у тебя. Есть список созвездий и отдельно словарь с координатами. Почему бы всё это не держать в одном классе?
Спасибо, в этом разобрался. Да я просто только пытаюсь во всем этом разобраться

У меня только в последнем вопросе сейчас проблема, используй ваш метод GetPoint, входная строка text 100 100 200 150 31 25 78 99 88 131 -> в result пишется 100 100 200 150 31 25 78 99
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static private List<Point> GetPoints(string text)
{
    var result = new List<Point>();
    try
    {
        Regex regexObj = new Regex(@"(\d+)\s(\d+)\s", RegexOptions.IgnoreCase);
        Match matchResult = regexObj.Match(text);
        while (matchResult.Success)
        {
            var x = int.Parse(matchResult.Groups[1].Value);
            var y = int.Parse(matchResult.Groups[2].Value);
            result.Add(new Point(x, y));
            matchResult = matchResult.NextMatch();
        }
    }
    catch (ArgumentException ex)
    {
        throw;
    }
    return result.Count > 0 ? result : null;
}
0
ViterAlex
6413 / 3613 / 1482
Регистрация: 11.02.2013
Сообщений: 7,964
Завершенные тесты: 3
09.01.2018, 18:04 #28
Цитата Сообщение от asopars Посмотреть сообщение
последнем вопросе сейчас проблема
Да, не уследил. Замени на эту строку 6 строку моего метода GetPoints
C#
1
Regex regexObj = new Regex(@"(\d+)\s(\d+)\s?", RegexOptions.IgnoreCase);
1
09.01.2018, 18:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2018, 18:04

Как чертить линии по точкам?
Была создана функция для черчения линий между двумя выбранными вручную точками...

Визуализация шестигранной решетки по точкам
Необходимо визуализировать решетку приведенную на рисунке с помощь точек (что...

Получить график по заданным точкам
private void button1_Click(object sender, EventArgs e) { ...


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

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

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