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

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

10.09.2013, 21:48. Показов 2731. Ответов 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
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.09.2013, 21:48
Ответы с готовыми решениями:

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

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

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

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



И mouse тоже не совсем ясно кто таков будет.
C#
1
Point mouse;
это точка, хранящая координта курсора
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
11.09.2013, 22:19  [ТС]
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
что-то не могу понять задачу. что значит привязка? что должно произойти, чего не происходит?

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

Вообщем, если что могу вечерком скинуть примерчик, как это сделать можно.
0
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
12.09.2013, 23:56  [ТС]
Цитата Сообщение от 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
Накидал небольшой пример, где чисто нажатие мыши ловится, если нужно наведение или перемещение объекта, такой же способ, только события другие.
Класс:
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
Базовый класс. Наследник реализует прорисовку (например)

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
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
14.09.2013, 14:49  [ТС]
sezada, спс большое привязка и вправду работает быстро.

Сейчас попробую прикрутить выделение мышью onicdr.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
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 раза меньше заряда малой сферы. В точках A...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru