Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 23.10.2020
Сообщений: 46

Построение графика на picture box

07.01.2021, 15:15. Показов 2295. Ответов 13

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нужно нарисовать график трохоиды. Это черновой вариант кода. Возникла проблема, я не знаю как мне соединить точки в List. Я их туда заношу, а каким методом их соединить я не знаю. Перепробовал разными или переполнение идет или строится что-то не то.

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
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        List<Point> points = new List<Point>();
        private int i, x1, y1;
        private double r, t, h,x2, y2;
        private Pen pen = new Pen(Color.DarkRed, 2);
        int wX;
        int hX;
        double xF, yF;
        double step;
 
        private void button1_Click(object sender, EventArgs e)
        {            
            Graphics g = pictureBox1.CreateGraphics();
            x1 = pictureBox1.Width / 2;
            y1 = pictureBox1.Height / 2;
            r = 1;
            h = 0.8;
            //t = 0;
            //b = Math.Tan(t/2);
            //c = Math.Cos(t);
            wX = pictureBox1.Width;
            hX = pictureBox1.Height;            
            Random rnd = new Random();
            for (i = 0; i <= 15; i++)
            {
                
                t = rnd.Next(50);
                x2 =x1 + r * t - h * Math.Sin(t); 
                y2 =y1 + r - h * Math.Cos(t);
                points.Add(new Point((int)x2, (int)y2));
                
            }
            for (int i = 1; i < points.Count; i++)
                g.DrawLine(pen, points[i-1], points[i]);
            
        }
    }
На картинке показан график, которой должен получиться.
Миниатюры
Построение графика на picture box  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.01.2021, 15:15
Ответы с готовыми решениями:

Как запретить заход одного объекта (picture box) на другой picture box
Создаю платформер на Windows Forms, как запретить заход одного picture box'a на другой?

Picture box
Нужно создать программу. Суть программы: Небходимо передвинуть картинки чтобы получилось изображение и надпись &quot;портрет&quot;. Я...

Picture Box
как сделать так, чтобы один PictureBox был поверх другого??? вот пример на картинке.

13
0 / 0 / 0
Регистрация: 23.10.2020
Сообщений: 46
07.01.2021, 16:54  [ТС]
Поднимаю
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
07.01.2021, 20:11
Лучший ответ Сообщение было отмечено Gerych12 как решение

Решение

Gerych12,
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
        private void MainForm_Paint(object sender, PaintEventArgs e)
        {
            var R = 100f;
            var d = 80f;
            var offset = new SizeF(200f, 300f);
            var points0 = new List<PointF>();
            var points = new List<PointF>();
            var tof = 2f * Math.PI / 3f;
            for (var t = 0f; t < 3 * Math.PI + tof / 2f; t += 0.1f)
            {
                var ta = t - tof;
                // точки циклоиды
                var x0 = R * (ta - Math.Sin(ta));
                var y0 = R * (1f - Math.Cos(ta));
                var pt0 = new PointF((float)x0, -(float)y0);
                points0.Add(PointF.Add(pt0, offset));
                // точки трохоиды
                var x = R * ta - d * Math.Sin(ta);
                var y = R - d * Math.Cos(ta);
                var pt = new PointF((float)x, -(float)y);
                points.Add(PointF.Add(pt, offset));
            }
            // считаем границы графика (по циклоиде)
            var ymin = points0.Min(p => p.Y);
            var ymax = points0.Max(p => p.Y);
            var xmin = points0.Min(p => p.X);
            var xmax = points0.Max(p => p.X);
            var xzero = points0.First(p => Math.Abs(p.Y - ymax) < float.Epsilon).X;
            // рисуем ось X
            e.Graphics.DrawLine(Pens.Black, new PointF(xmin, ymax), new PointF(xmax, ymax));
            // рисуем ось Y
            e.Graphics.DrawLine(Pens.Black, new PointF(xzero, ymin), new PointF(xzero, ymax * 1.1f));
            // рисуем трохоиду
            if (points.Count > 1)
                e.Graphics.DrawLines(Pens.Red, points.ToArray());
        }
1
0 / 0 / 0
Регистрация: 23.10.2020
Сообщений: 46
07.01.2021, 21:17  [ТС]
ashsvis, большое спасибо!

Добавлено через 12 минут
ashsvis,

Цитата Сообщение от ashsvis Посмотреть сообщение
var R = 100f;
            var d = 80f;
            var offset = new SizeF(200f, 300f);
            var points0 = new List<PointF>();
            var points = new List<PointF>();
            var tof = 2f * Math.PI / 3f;
            for (var t = 0f; t < 3 * Math.PI + tof / 2f; t += 0.1f)
Как вы выбрали значения для переменных и что означает "F" в конце чисел? Просто когда я сам пытался сделать, у меня или переполнение было, или значения вообще не считались для "X".
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
07.01.2021, 21:45
Значения для радиуса взяты с "потолка". Размер формы примерно в 4 раза больше от предложенного радиуса.
Значение d чуть меньше. Потом требуется всё это сдвинуть на центр формы.

Добавлено через 55 секунд
F, приписанное к цифре, означает тип float
1
0 / 0 / 0
Регистрация: 23.10.2020
Сообщений: 46
07.01.2021, 23:20  [ТС]
ashsvis, а для чего еще нужно строить циклоиду?

Вот в конце каждой строчки, то что в скобках не очень понятно что он сравнивает
Цитата Сообщение от ashsvis Посмотреть сообщение
var ymin = points0.Min(p => p.Y);
            var ymax = points0.Max(p => p.Y);
            var xmin = points0.Min(p => p.X);
            var xmax = points0.Max(p => p.X);
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
08.01.2021, 00:10
Для чего циклоиду? Откуда мне знать? Разминка для мозгов.
Поиск максимумов и минимумов нужен для построения осей.
Почитайте про LINQ для понимания работы этих строчек.
1
0 / 0 / 0
Регистрация: 23.10.2020
Сообщений: 46
08.01.2021, 12:59  [ТС]
ashsvis, а вот то что от 0 цикл идет, это понятно, а почему его конец странно записан. Или это тоже вы случайно взяли?

Цитата Сообщение от ashsvis Посмотреть сообщение
for (var t = 0f; t < 3 * Math.PI + tof / 2f; t += 0.1f)
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
08.01.2021, 13:27
Цитата Сообщение от Gerych12 Посмотреть сообщение
а почему его конец странно записан.
У нас окружность крутится, причём нужно больше одного периода взять.
Всё это для красоты только:
C#
1
2
3
4
5
var tof = 2f * Math.PI / 3f;
for (var t = 0f; t < 3 * Math.PI + tof / 2f; t += 0.1f)
{
    var ta = t - tof;
    ...
и для расчёта используется ta, а не t
Всё для неё, для красоты...
1
0 / 0 / 0
Регистрация: 23.10.2020
Сообщений: 46
08.01.2021, 14:36  [ТС]
ashsvis, а еще не очень понятно на что влияют эти параметры

C#
1
var offset = new SizeF(200f, 300f);
Добавлено через 11 минут
ashsvis, и еще по поводу LINQ. Он нужен для упрощения запросов к различным данным.

C#
1
2
3
4
            var ymin = points0.Min(p => p.Y);
            var ymax = points0.Max(p => p.Y);
            var xmin = points0.Min(p => p.X);
            var xmax = points0.Max(p => p.X);
Получается в этих строчках "p" выступает как одна точка в "points0", а когда мы пишем "p.Y", то из всех точек мы ищем минимальный "Y". Я правильно понимаю?
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
08.01.2021, 14:39
Формула для циклоиды даёт координаты как в плюс, так и в минус от нуля.
Поэтому вычисленную координату нужно сместить ближе к центру экрана.
1
0 / 0 / 0
Регистрация: 23.10.2020
Сообщений: 46
08.01.2021, 14:44  [ТС]
ashsvis, извини что почти по всему коду спрашиваю, но хотелось бы по лучше разобраться

Цитата Сообщение от Gerych12 Посмотреть сообщение
и еще по поводу LINQ. Он нужен для упрощения запросов к различным данным.

C#
1
2
3
4
            var ymin = points0.Min(p => p.Y);
            var ymax = points0.Max(p => p.Y);
            var xmin = points0.Min(p => p.X);
            var xmax = points0.Max(p => p.X);
           
Получается в этих строчках "p" выступает как одна точка в "points0", а когда мы пишем "p.Y", то из всех точек мы ищем минимальный "Y". Я правильно понимаю?
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
08.01.2021, 14:48
Вполне.
1
0 / 0 / 0
Регистрация: 23.10.2020
Сообщений: 46
08.01.2021, 14:49  [ТС]
ashsvis, Больше тебе спасибо! Очень помог!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2021, 14:49
Помогаю со студенческими работами здесь

Отображение Picture Box
У меня есть два Picture Box, расположенных &quot;вплотную&quot;. Но когда я запускаю программу, изображения, которые находятся в них, отображаются...

Создание событий для Picture Box
как создать события нажатия клавиши мыши для динамический созданных PictureBox, имя боксов заранее не известно

Получение координат клика по picture box
Здравствуйте, есть picture box, как по клику мыши узнать координаты пикселя? Есть предположения, что можно сделать как-то через событие,...

Элемент Picture Box и генерация чисел
Программа должна нарисовать круг, где по нажатию кнопки Create должна создавать фигура, а по нажатию кнопки Change эта фигура должна...

Как нарисовать такой рисунок в picture box ?
Как нарисовать такой рисунок в picture box ? c# используя циклы ?


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru