Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Вежливость-главное оружие
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
1

Привязка курсора к точке

10.09.2013, 21:48. Показов 2439. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Сделал простую привязку к точке:
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
 void PictureBoxWorkspace_Paint(object sender, PaintEventArgs e)
        {
           Point anchorPoint;
 
            foreach (var item in shapes)
            {
                switch (item.Title)
                {
                    case AccessiblePrimitives.PENCIL:
                        (item as Pencil).Draw(e.Graphics);
                        break;
                    case AccessiblePrimitives.LINE:
                        (item as Line).Draw(e.Graphics);
                        break;
                    case AccessiblePrimitives.ARCH:
                        (item as Arch).Draw(e.Graphics);
                        break;
                }
 
                anchorPoint = item.Anchor(mouse);
 
                if (anchorPoint.X != -1 && anchorPoint.Y != -1)
                {
                    Cursor.Position = new Point
                    (
                        anchorPoint.X + (this.Left + pictureBoxWorkspace.Location.X + 9),
                        anchorPoint.Y + (this.Top + pictureBoxWorkspace.Location.Y + 31)
                    );
                }
 
            }
        }
Ноте: Пробегаю по квадратике вокруг курсора и проверяю совпадение координат.

Когда не выбран никакой примитив, то привязка работает. А когда я рисую к примеру линию, то НЕТ.
Не подскажите, почему?

Заранее спс!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2013, 21:48
Ответы с готовыми решениями:

Что это жесткая привязка к точке входа, физическое смещение в файле, окрестность точки входа в файл, привязка?
Что это жесткая привязка к точке входа, физическое смещение в файле, окрестность точки входа в...

Привязка к точке, WPF, графика
Здравствуйте!!!! осваиваю WPF и столкнулся с проблемой. как при рисовании фигур по клику кнопки...

Привязка текстуры к определенной точке сферы
Ситуация следующая: отображается сфера (с помощью gluSphere()), загружается текстура...

Привязка курсора к сетке
Как привязать курсор к сетке в раб. области окна? сетка создается из обычных линий? ну типо вот...

9
39 / 37 / 8
Регистрация: 01.08.2013
Сообщений: 106
11.09.2013, 08:38 2
А кто родитель у Pencil, Line и Arch? Я так понял собственные классы? Просто у меня Anchor это ни фига не функция =). И mouse тоже не совсем ясно кто таков будет.
0
Вежливость-главное оружие
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
11.09.2013, 20:54  [ТС] 3
Да, вы правы :

Привязка курсора к точке


И mouse тоже не совсем ясно кто таков будет.
C#
1
Point mouse;
это точка, хранящая координта курсора
0
Вежливость-главное оружие
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
11.09.2013, 22:19  [ТС] 4
C#
1
anchorPoint = item.Anchor(mouse);
В каждом классе, реализован метод, котоырый проверяет любую точку на привязку(в моем случае это точка - координаты курсора)

Если точка входит в облась КОНЦА либо НАЧАЛА какого либо примита, то я возвращаю соответственно координаты конда или начала. Иначе возвращаю точку (-1, -1)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public Point Anchor(Point cursorPosition)
        {
            for (int i = cursorPosition.X - radiusAnchor / 2; i < cursorPosition.X + radiusAnchor / 2; i++)
            {
                for (int j = cursorPosition.Y - radiusAnchor / 2; j < cursorPosition.Y + radiusAnchor / 2; j++)
                {
                    if (
                        (i == startPoint.X && j == startPoint.Y) ||
                        (i == endPoint.X && j == endPoint.Y)
                        )
                    {
                        return new Point(i, j);
                    }
                }
            }
            return new Point(-1, -1);
        }
Добавлено через 10 минут
Сейча вот обнаружил еще одну проблему, когда нарисовано многго примитивов, то очень медленно работает отрисовка, именно из-за этой привязки.

Без нее все ОК. Лагов вообще нету. Как можно оптимизировать? Я делаю простим перебором

Добавлено через 1 час 9 минут
Народ, не игнореьте плз.
0
208 / 164 / 29
Регистрация: 11.09.2013
Сообщений: 445
12.09.2013, 00:59 5
что-то не могу понять задачу. что значит привязка? что должно произойти, чего не происходит?

насчет быстродействия - взгляните на Anchor, работает ну ооочень медленно. брутальный перебор - страшная штука. попробуйте добавить немного математики. например, для линии достаточно представить ее в виде прямоугольника и проверить, где находится курсор. это буквально 5-6 строк кода и несколько умножений-делений. копайте в сторону уравнения прямой. еще я бы в случае неудачи возвращал null - это быстрее создается (не вызывается лишних конструкторов) и проверяется (хотя и в Вашем случае можно не проверять сразу оба поля Х и У точки)
0
39 / 37 / 8
Регистрация: 01.08.2013
Сообщений: 106
12.09.2013, 08:45 6
Цитата Сообщение от some_name Посмотреть сообщение
то очень медленно работает отрисовка, именно из-за этой привязки.
Если сделали объекты свои, так уж до конца доделайте, дайте им Событие на нажатие мыши, Control есть у них свой? Если нет, то лучше и контрол дать, потом привязку дать проще.

Вообщем, если что могу вечерком скинуть примерчик, как это сделать можно.
0
Вежливость-главное оружие
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
12.09.2013, 23:56  [ТС] 7
Цитата Сообщение от onicdr Посмотреть сообщение
если что могу вечерком скинуть примерчик, как это сделать можно.
Буду очень признателен.

Добавлено через 6 часов 32 минуты
Цитата Сообщение от sezada Посмотреть сообщение
что-то не могу понять задачу. что значит привязка? что должно произойти, чего не происходит?
Когда я вожу по полю, передаю методу item.Anchor() координаты курсора. В самом методе делаю проверку, принадлежит ли эта точка прямоугольнику вокруг НАЧАЛЬНОЙ и КОНЕЧНОЙ точек примитива. Если ДА - Ставлю курсор в эту точку, иначе возвращаю Point(-1,-1)

Цитата Сообщение от sezada Посмотреть сообщение
взгляните на Anchor, работает ну ооочень медленно
Дык да, я поэтому и прошу помощь.

Цитата Сообщение от sezada Посмотреть сообщение
например, для линии достаточно представить ее в виде прямоугольника и проверить, где находится курсор.
чесно сказать мало что понял. какая от этого выгода?

Цитата Сообщение от sezada Посмотреть сообщение
еще я бы в случае неудачи возвращал null - это быстрее создается (не вызывается лишних конструкторов)
дело в том что null не получаеься вернуть. компилятор ругается : "Cannot convert null to 'System.Drawing.Point' because it is a non-nullable value type"

Цитата Сообщение от sezada Посмотреть сообщение
это буквально 5-6 строк кода и несколько умножений-делений.
к этому и стремлюсь. самого данный вариант дико раздражает.

Был бы очень признателен, за возможность взглянуть на эти 5-6 строк кода.
0
39 / 37 / 8
Регистрация: 01.08.2013
Сообщений: 106
13.09.2013, 08:19 8
Накидал небольшой пример, где чисто нажатие мыши ловится, если нужно наведение или перемещение объекта, такой же способ, только события другие.
Класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Circle: Control
    {
        public Circle(Form frm)
        {
            this.MouseClick += new MouseEventHandler(Circle_MouseClick);
            frm.Controls.Add(this);
        }
 
        public void CreateCircRegion()
        {
            using (GraphicsPath gp = new GraphicsPath())
            {
                gp.AddEllipse(new Rectangle(0, 0, this.Width, this.Height));
 
                this.Region = new Region(gp);
            }
        }
 
        private void Circle_MouseClick(object sender, MouseEventArgs e)
        {
            MessageBox.Show("Вы нажали на " + this.Text);
        }
    }
Создание на форме:
C#
1
2
3
4
5
6
7
8
9
10
11
12
Circle cr = new Circle(this)
            {
                Name = "Circle",
                Left = 100,
                Top = 100,
                Width = 50,
                Height = 80,
                Text = "Тестовый 1"
            };
 
            cr.CreateCircRegion();
            cr.BringToFront();
0
208 / 164 / 29
Регистрация: 11.09.2013
Сообщений: 445
13.09.2013, 09:34 9
Базовый класс. Наследник реализует прорисовку (например)

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
     class Primitive
    {
        public Point StartPoint;  // начальная точка
        public Point EndPoint;    // конечная точка
        public Size AnchorSize;   // прямоугольник
 
        public Primitive(Point Start, Point End, Size Anchor)
        {
            StartPoint = Start;
            EndPoint = End;
            AnchorSize = Anchor;
        }
 
        public Point? Achor(Point CursorLocation)
        {
            if (
                Math.Abs(CursorLocation.X - StartPoint.X) < AnchorSize.Width/2 &&
                Math.Abs(CursorLocation.Y - StartPoint.Y) < AnchorSize.Height/2) // мы у начальной точки
                return StartPoint;
 
            if (
                Math.Abs(CursorLocation.X - EndPoint.X) < AnchorSize.Width / 2 &&
                Math.Abs(CursorLocation.Y - EndPoint.Y) < AnchorSize.Height / 2) // мы у конечной точки
                return EndPoint;
 
            // Дошли сюда - ни одна из проверок не сработала. мы не у конечной и не у начальной точек
            return null;
 
        }
    }
1
Вежливость-главное оружие
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
14.09.2013, 14:49  [ТС] 10
sezada, спс большое привязка и вправду работает быстро.

Сейчас попробую прикрутить выделение мышью onicdr.
0
14.09.2013, 14:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2013, 14:49
Помогаю со студенческими работами здесь

Привязка объекта к точке с одной стороны и к курсору с другой
Добрейшего всем времени суток! Помогите, пожалуйста, решить проблему! Нужно сделать так, чтобы...

Привязка открытия калькулятора Windows к местоположению курсора
Доброго времени суток,подскажите такую вещь. В разделенной форме при вводе данных в поле...

Найти производную функции u в точке М по направлению, идущему от этой точки к точке P
u = \frac{z}{x^2} + xz^2y^3 + yz^4; M(-1,2,1); P(3 ,-6 , 2) Предполагалась такая функция?

Чему равен потенциал в точке A, если в точке B он составляет 100 В
Две равномерно заряженных сферы радиусами R и 2R имеют общий центр O. Заряд большой сферы в 1,5...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru