Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.99/78: Рейтинг темы: голосов - 78, средняя оценка - 4.99
73 / 73 / 10
Регистрация: 04.12.2008
Сообщений: 458
1

Рисование прямой линии, как в Paint

20.01.2010, 23:43. Показов 14647. Ответов 18
Метки нет (Все метки)

Доброго всем времени суток.

Нужно в PictureBox нарисовать прямую линию. Рисовать надо как в Paint: зажал левую клавишу мыши, провел линию, отпустил. Но, надо еще чтобы координаты каждой точки этой линии сохранялись в массивы: координаты по Х в один, координаты по У в другой. У меня уже было куча идей, но все равно ничего не получалось. Линию рисует, а вот с координатами проблема.
Тонкости расчета координат рассматривались здесь https://www.cyberforum.ru/math... page2.html . Но это в основном была теоретическая часть... Может у кого-то есть определенные идеи по разрешению данной проблемы?

Буду очень благодарен всем, кто поможет.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.01.2010, 23:43
Ответы с готовыми решениями:

Рисование линии как в Paint (фиксация с одного конца и следование за курсором - с другого)
private void tmImgRysownica_MouseDown(object sender, MouseEventArgs e) { if...

Рисование прямой линии по таймеру
Требуется нарисовать по сути вот такую штуку http://savepic.org/3468491.gif . только почаще линии...

Добавить рисование линии мышкой, как в Paint
Программа работает но нужно добавить рисование линии мышкой как на Paint И чтоб видно как елипс...

Рисование прямой линии
Сразу, прошу, на алгоритмы типа "Брейзенхема" не посылать. С помощью рекурсии, пытаюсь то что...

18
274 / 200 / 33
Регистрация: 18.04.2009
Сообщений: 177
21.01.2010, 00:32 2
Как вариант, могу предложить следующее: в событии MouseDown запоминать координаты начала линии, в событии MouseMove получать промежуточные координаты конца линии и делать отрисовку линии в событии Paint (вот тут, кажется, был мой примерчик: https://www.cyberforum.ru/wind... 59359.html), а вот в событии MouseUp запоминать координаты конца отрезка и в этом же событии рисовать линию, например, по алгоритму Брезенхема - тут-то можно точно узнать координаты каждой точки, принадлежащей нарисованной тобою линии. Если такой вариант не устраивает - то можно посмотреть в сторону WPF (простенький графический редактор с использованием этой технологии можно найти здесь: http://www.codeproject.com/KB/... Tools.aspx - только одна беда - картинки сохраняются в формате xml).
1
73 / 73 / 10
Регистрация: 04.12.2008
Сообщений: 458
21.01.2010, 00:46  [ТС] 3
Цитата Сообщение от Стасёнок Посмотреть сообщение
в событии MouseMove получать промежуточные координаты конца линии и делать отрисовку линии в событии Paint
нужно получать координаты точек уже готовой, нарисованной линии. А в этом событии мы будем получать все точки, когда линия рисуется. Может еще есть какие-нибудь варианты?
0
1922 / 427 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
21.01.2010, 02:39 4
patriot2008, для того, чтобы знать точки нарисованной линии, придется эту линию рисовать самому, поточечно. Для этого можно воспользоваться алгоритмом Брезенхема. Как уже посоветовали, по событию MouseDown фиксируем первую точку. По MouseMove фиксируем конец отрезка. По Paint рисуем ручками линию и сразу сохраняем набор полученных точек. Таким образом, все имеем набор точек последней отрисовки.
1
73 / 73 / 10
Регистрация: 04.12.2008
Сообщений: 458
21.01.2010, 12:11  [ТС] 5
Цитата Сообщение от Green Посмотреть сообщение
По MouseMove фиксируем конец отрезка.
Но мне нужно фиксировать конец отрезка по событию MouseUp. В таком случае все получится по алгоритму Брезенхема?
0
мну довольно <(-__-)l
216 / 205 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
21.01.2010, 15:05 6
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
using System;
using System.Drawing;
using System.Windows.Forms;
 
class Program
{
    public static void Main()
    {
        Application.Run(new Form1());
    }
}
 
class Form1 : Form
{
    Bitmap bmp;
    Bitmap bmp2;
    Point StartPoint;
    Pen blackpen;
    public Form1()
    {
        FormBorderStyle = FormBorderStyle.FixedDialog;
        ClientSize = new Size(640, 480);
        blackpen = new Pen(Color.Black, 1);
        bmp = new Bitmap(640, 480);
        bmp2 = new Bitmap(640, 480);
        Graphics grph = Graphics.FromImage(bmp);
        grph.Clear(Color.White);
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        //base.OnPaint(e);
        e.Graphics.DrawImage(bmp,0,0);
    }
    protected override void OnMouseDown(MouseEventArgs e)
    {
        //base.OnMouseDown(e);
        if (e.Button == MouseButtons.Left)
        StartPoint = e.Location;
    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
        //base.OnMouseMove(e);
        if (e.Button == MouseButtons.Left)
        {
            Graphics grph = CreateGraphics();
            Graphics grph2 = Graphics.FromImage(bmp2);
            grph2.DrawImage(bmp, 0, 0);
            grph2.DrawLine(blackpen, StartPoint, e.Location);
            grph.DrawImage(bmp2, 0, 0);
            grph.Dispose();
            grph2.Dispose();
        }
    }
    protected override void OnMouseUp(MouseEventArgs e)
    {
        //base.OnMouseUp(e);
        Graphics grph = Graphics.FromImage(bmp);
        grph.DrawLine(blackpen, StartPoint, e.Location);
        grph.Dispose();
        Invalidate();
    }
}
Вот оно доделаешь сам до пиктур бокса?
1
73 / 73 / 10
Регистрация: 04.12.2008
Сообщений: 458
21.01.2010, 15:26  [ТС] 7
С прорисовкой у меня все нормально, интересует больше получение всех координат по алгоритму Брезенхема и добавление их в массивы.
0
48 / 49 / 10
Регистрация: 24.12.2008
Сообщений: 75
21.01.2010, 23:58 8
Slope
1
18 / 18 / 2
Регистрация: 20.01.2009
Сообщений: 71
22.01.2010, 01:34 9
можете еще глянуть тут
0
1922 / 427 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
22.01.2010, 03:59 10
Цитата Сообщение от patriot2008 Посмотреть сообщение
Но мне нужно фиксировать конец отрезка по событию MouseUp. В таком случае все получится по алгоритму Брезенхема?
Я говорю о другой фиксации. Если обрабатывать только в момент отпускания мыши, то линию не будет видно в момент создания. Это не удобно и не красиво. Прорисовывая линию при движении мыши, видишь как и что рисуешь.
0
73 / 73 / 10
Регистрация: 04.12.2008
Сообщений: 458
22.01.2010, 13:49  [ТС] 11
Цитата Сообщение от Green Посмотреть сообщение
Прорисовывая линию при движении мыши, видишь как и что рисуешь.
это тоже уже сделано. Задача остается та же.
0
мну довольно <(-__-)l
216 / 205 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
22.01.2010, 14:00 12
Я говорю о другой фиксации. Если обрабатывать только в момент отпускания мыши, то линию не будет видно в момент создания. Это не удобно и не красиво. Прорисовывая линию при движении мыши, видишь как и что рисуешь.
так в моем варианте как раз прорисовка видна. точ в точ паинт
0
73 / 73 / 10
Регистрация: 04.12.2008
Сообщений: 458
22.01.2010, 14:03  [ТС] 13
все это уже есть. надо только по алгоритму Брезенхема получить координаты всех точек в событии MouseUp. Мож есть хоть пару идей?
0
мну довольно <(-__-)l
216 / 205 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
22.01.2010, 14:14 14
объясни зачем тебе все точки линии? что ты с ними хочешь сделать?
0
73 / 73 / 10
Регистрация: 04.12.2008
Сообщений: 458
22.01.2010, 14:26  [ТС] 15
Скажу какая у меня стоит задача.
Рисуется прямая линия, а потом на ней ставятся 2 точки и осуществляется пересчет отношений всех отрезков, которые получились в результате деления точкой. Надо чтобы точки могли ставиться только на линии. Соответственно координаты всех точек нужны а). для расчета длин отрезков б). чтобы точки можно было поставить только на линии. Для этого, подсказали, что нужно использовать алгоритм Брезенхема. Просто я в нем немного запутался...
0
мну довольно <(-__-)l
216 / 205 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
22.01.2010, 21:18 16
кинь ссылку на алгоритм...
я его в глаза еще не видел)
0
мну довольно <(-__-)l
216 / 205 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
22.01.2010, 22:31 17
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
    protected override void OnMouseUp(MouseEventArgs e)
    {
        Graphics grph = Graphics.FromImage(bmp);
        grph.DrawLine(blackpen, StartPoint, e.Location);
        Invalidate();
 
        string str="\\.. ";
        int x1,x2,y1,y2;
 
        if (e.X > StartPoint.X)
        {
            x1 = StartPoint.X;
            x2 = e.X;
        }
        else
        {
            x1 = e.X;
            x2 = StartPoint.X;
        }
 
        if (e.Y > StartPoint.Y)
        {
            y1 = StartPoint.Y;
            y2 = e.Y;
        }
        else
        {
            y1 = e.Y;
            y2 = StartPoint.Y;
        }
 
        int x = x2 - x1;
        int y = y2 - y1;
 
        double i,j;
 
        if (Math.Abs(x) > Math.Abs(y))
        {
            double t = y / (double)x;
            for (i = x1, j = y1; (int)i != x2 || (int)j != y2; i += 1, j += t)
                str += "x= " + i + " , y= " + (int)(j + 0.5) + " x= " + i + " , y= " + j + "\n";
        }
        else
        {
            double t = x / (double)y;
            for (i = x1, j = y1; (int)i != x2 || (int)j != y2; i += t, j += 1)
                str += "x= " + (int)(i + 0.5) + " , y= " + j + " x= " + i + " , y= " + j + "\n";
        }
 
        grph.DrawString(str,this.Font,Brushes.Blue,new PointF(10,10));
        grph.Dispose();
    }
прилагаю скрин. Код работает корректно за исключением того что немного подвисает. не знаю в чем там проблема.
Миниатюры
Рисование прямой линии, как в Paint  
1
48 / 49 / 10
Регистрация: 24.12.2008
Сообщений: 75
22.01.2010, 23:32 18
Цитата Сообщение от patriot2008 Посмотреть сообщение
получить координаты всех точек
Unbelievable......RTFM -> Slope
1
966 / 722 / 233
Регистрация: 30.04.2009
Сообщений: 2,997
23.01.2010, 23:56 19
Цитата Сообщение от patriot2008 Посмотреть сообщение
Скажу какая у меня стоит задача.
Рисуется прямая линия, а потом на ней ставятся 2 точки и осуществляется пересчет отношений всех отрезков, которые получились в результате деления точкой. Надо чтобы точки могли ставиться только на линии. Соответственно координаты всех точек нужны а). для расчета длин отрезков б). чтобы точки можно было поставить только на линии. Для этого, подсказали, что нужно использовать алгоритм Брезенхема. Просто я в нем немного запутался...
Я бы сделал проверку на то, находится ли указатель мыши на линии так:

C#
1
2
3
4
5
6
7
8
9
10
int Y(int X)
{
      return Math.Round(a*X+b); //a*X+b - уравнение прямой, коефициенты a и b можно получить 
                                            //используя координаты первой и последней точки отрезка.
}
 
bool MouseOnLine(int mX, int mY)
{
      return (mY==Y(mX)); 
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2010, 23:56

Рисование непрерывной прямой линии
Хочу нарисовать прямую линию из пикселей, есть функция putpixel() ставить пиксель по координатам,...

Графический редактор - рисование прямой линии и заливка.
Есть графический редактор. Вcё рисуется на image1. Есть глобальная переменная а. Есть кнопки...

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

Линии, как в Paint-е
Добрый день. Пытаюсь реализовать прорисовку линий на панели, как в пеинте. То есть зажимаешь кнопку...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru