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

Нарисовать составную кривую Фергюсона кликами мышкой: рисуется только последняя часть

20.11.2012, 17:38. Показов 1794. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имею задачу – нарисовать составную кривую Фергюсона кликами мышкой. Разобрался как рисовать, кажется даже рассчёты правильные, но программа (под спойлером) рисует только последний кусок (тот, что между предпоследним и последним тыками мышкой), а предыдущий стирает.
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
 
namespace HermitSpline_v0._1
{
    public partial class Form1 : Form
    {
        private int n = 0;
        private List<PointF> hermitP = new List<PointF>();
        private List<PointF> hermitT = new List<PointF>();
        public Form1()
        {
            InitializeComponent();
        }
        private PointF GetHermit(float t)
        {
            if (n > 2)
            {
                int i = n-1;
                float X = (3 * (hermitP[i].X - hermitP[i - 2].X - hermitT[i].X - hermitT[i - 2].X) / 4);
                float Y = (3 * (hermitP[i].Y - hermitP[i - 2].Y - hermitT[i].Y - hermitT[i - 2].Y) / 4);
                hermitT[i - 1] = new PointF(X, Y);
                float tCubed = t * t * t;
                float tSquared = t * t;
                float resultX = tCubed * (2 * hermitP[i - 2].X - 2 * hermitP[i - 1].X + hermitT[i - 2].X + hermitT[i - 1].X) + tSquared * (3 * hermitP[i - 1].X - 3 * hermitP[i - 2].X - 2 * hermitT[i - 2].X - hermitT[i - 1].X) + t * hermitT[i - 2].X + hermitP[i - 2].X;
                float resultY = tCubed * (2 * hermitP[i - 2].Y - 2 * hermitP[i - 1].Y + hermitT[i - 2].Y + hermitT[i - 1].Y) + tSquared * (3 * hermitP[i - 1].Y - 3 * hermitP[i - 2].Y - 2 * hermitT[i - 2].Y - hermitT[i - 1].Y) + t * hermitT[i - 2].Y + hermitP[i - 2].Y;
                return new PointF((float)resultX, (float)resultY);
            }
            return new PointF(0,0);
        }
        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    hermitP.Add(new PointF(e.X, e.Y));
                    hermitT.Add(new PointF(0, 0));
                    n++;
                    DrawHermit();
                    break;
                case MouseButtons.Right:
                    hermitP.Clear();
                    hermitT.Clear();
                    n = 0;
                    DrawHermit();
                    break;
            }
        }
        private void DrawHermit()
        {
            var bm = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height);
            var g = Graphics.FromImage(bm);
            Pen pencil = new Pen(Color.Black, 1f);
            if (n > 2)
            {
                for (int i = 0; i < 100; i++)
                {
                    g.DrawLine(pencil, GetHermit((float)i / 100), GetHermit(((float)i + 1) / 100));
                }
            }
            pictureBox1.Image = bm;
        }
    }
}

Бился долго, так и не смог найти решения проблемы, очень прошу совета, заранее благодарен.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.11.2012, 17:38
Ответы с готовыми решениями:

При рисовании фигур на Канве рисуется только последняя
&quot;рисую&quot; в дельфи первый раз в наличии готовый класс TPoly (внутри методы рисование\вращение\массив точек фигуры и прочие...

Почему рисуется только какая-то часть? Windows Forms
{$reference 'System.Windows.Forms.dll'} {$reference 'System.Drawing.dll'} uses System, System.Windows.Forms, System.Drawing,...

На вывод попадает не вся информация, а только ее последняя часть
Здраствуите! У меня проблема такя что после вывода программы я вижу только её (половину) конец. В Free Pacscal всё идёт как надо. ...

3
 Аватар для C17H19NO3
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
20.11.2012, 18:51
если я вас правильно понял - то так.

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
        Graphics g;
        private int n = 0;
        private List<PointF> hermitP = new List<PointF>();
        private List<PointF> hermitT = new List<PointF>();
 
        private PointF GetHermit(float t)
        {
            if (n > 2)
            {
                int i = n - 1;
                float X = (3 * (hermitP[i].X - hermitP[i - 2].X - hermitT[i].X - hermitT[i - 2].X) / 4);
                float Y = (3 * (hermitP[i].Y - hermitP[i - 2].Y - hermitT[i].Y - hermitT[i - 2].Y) / 4);
                hermitT[i - 1] = new PointF(X, Y);
                float tCubed = t * t * t;
                float tSquared = t * t;
                float resultX = tCubed * (2 * hermitP[i - 2].X - 2 * hermitP[i - 1].X + hermitT[i - 2].X + hermitT[i - 1].X) + tSquared * (3 * hermitP[i - 1].X - 3 * hermitP[i - 2].X - 2 * hermitT[i - 2].X - hermitT[i - 1].X) + t * hermitT[i - 2].X + hermitP[i - 2].X;
                float resultY = tCubed * (2 * hermitP[i - 2].Y - 2 * hermitP[i - 1].Y + hermitT[i - 2].Y + hermitT[i - 1].Y) + tSquared * (3 * hermitP[i - 1].Y - 3 * hermitP[i - 2].Y - 2 * hermitT[i - 2].Y - hermitT[i - 1].Y) + t * hermitT[i - 2].Y + hermitP[i - 2].Y;
                return new PointF((float)resultX, (float)resultY);
            }
            
            return new PointF(0, 0);
        }
        
        private void DrawHermit()
        {
            g = Graphics.FromImage(pictureBox1.Image);
            Pen pencil = new Pen(Color.Black, 1f);
            if (n > 2)
            {
                for (int i = 0; i < 100; i++)
                {
                    g.DrawLine(pencil, GetHermit((float)i / 100), GetHermit(((float)i + 1) / 100));
                    pictureBox1.Refresh();
                }
            }
        }
 
        private void pictureBox1_MouseClick_1(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    hermitP.Add(new PointF(e.X, e.Y));
                    hermitT.Add(new PointF(0, 0));
                    n++;
                    DrawHermit();
                    break;
                case MouseButtons.Right:
                    hermitP.Clear();
                    hermitT.Clear();
                    //это строка определяет pictureBox1 и затирает все что было ранее создано. думаю здесь эта строка нужна
                    pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                    n = 0;
                    DrawHermit();
                    break;
            }
        }
 
        private void Form2_Shown(object sender, EventArgs e)
        {
           pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics g = Graphics.FromImage(pictureBox1.Image);
        }
1
0 / 0 / 0
Регистрация: 20.10.2012
Сообщений: 3
20.11.2012, 19:09  [ТС]
Спасибо огромное, очень помогло. Не совсем только понял эту часть:
C#
1
2
3
4
5
private void Form2_Shown(object sender, EventArgs e)
        {
           pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics g = Graphics.FromImage(pictureBox1.Image);
        }
Вернее понял, что если она не работает (у меня не работает), то перед тем, как начать рисовать, надо кликнуть правой кнопкой мышки, чтобы определить пикчербокс. Как эту штуку заставить работать?
0
 Аватар для C17H19NO3
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
21.11.2012, 01:00
"Shown" - это событие формы, на которой находится пикчербокс. Если вы просто вставите в проэкт строчки

C#
1
2
3
4
5
private void Form2_Shown(object sender, EventArgs e)
        {
           pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics g = Graphics.FromImage(pictureBox1.Image);
        }
то они работать не будут, так как компилтор примет это как ваш собственные метод, а не событие формы. Создайте событие формы "Shown" и вставте строчки

C#
1
2
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics g = Graphics.FromImage(pictureBox1.Image);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.11.2012, 01:00
Помогаю со студенческими работами здесь

Рисование мышкой. При нажатии левой кнопки мыши и ее перемещении рисуется кривая
У меня vb 2010 надо написать программу при нажатии левой кнопки мышки и ее перемещении рисуется кривая. Что-то вроде карандаша в фотошопе....

Сделать что б линия которая рисуется - была сплошной, тоесть не были точки, если быстро двигаться мышкой по картинке
У меня есть прямая код который прописан в Events OneMouseMove картинки так: Image1-&gt;Canvas-&gt;Pen-&gt;Width=3; startX=X; ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru