Модераторы: Partizan, gambit

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Компонент координатная сетка 
V
    Опции темы
Yurik
Дата 2.11.2005, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 18.6.2005

Репутация: нет
Всего: нет



Требуется следующий компонент:
координатная сетка, чтоб при перемещении мыши по ней она(мышь) скакала по узлам этой сетки. (как в автокаде).
При щелчке по узлу там отрисовывалась точка и ее координаты(х,у) добавлялись в массив.
Очень хотелось бы готовый компонент, влом возиться с drawing, graphics и т.д. и фигачить все это вручную....
PM MAIL   Вверх
Exception
Дата 3.11.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



вряд ли такой есть..
PM   Вверх
Hidrag
Дата 3.11.2005, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: 2
Всего: 25



Yurik все таки придется ) или закажи кому нибудь :)


--------------------
user posted image
PM WWW ICQ   Вверх
Yurik
Дата 3.11.2005, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 18.6.2005

Репутация: нет
Всего: нет



Нарисовать линии - не проблема, есть метод DrawLine.
А как заставить мышь прыгать только по пересечениям этих линий? (то бишь по сетке)
Есть идеи?
PM MAIL   Вверх
Exception
Дата 3.11.2005, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



отлавливать MouseMove, читать координаты курсора и округлять их до ближ. узла сетки и ставить коорд. курсора чрез
Код

[DllImport("user32.dll")]
void SetCursor//описание ищи в МСДН
{}

вота..
PM   Вверх
Yurik
Дата 4.11.2005, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 18.6.2005

Репутация: нет
Всего: нет



а как узнать координаты ближайшего узла сетки?
PM MAIL   Вверх
mr.DUDA
Дата 4.11.2005, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Округлить до ближайшего меньшего: rounded_integer = integer - (integer % step)


--------------------
user posted image
PM MAIL WWW   Вверх
Yurik
Дата 4.11.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 18.6.2005

Репутация: нет
Всего: нет



Не понимаю....


Предположим, шаг=1.
Т.е. у нас сетка из квадратиков со сторонами 1.
Мышь находится внутри одного из таких квадратов.
Как узнать, какой из 4-х углов ближайший?



PM MAIL   Вверх
mr.DUDA
Дата 11.11.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Yurik @ 4.11.2005, 16:09)
Предположим, шаг=1.
Т.е. у нас сетка из квадратиков со сторонами 1.
Мышь находится внутри одного из таких квадратов.
Как узнать, какой из 4-х углов ближайший?

А разве позиция мыши может быть в дробных числах ?


--------------------
user posted image
PM MAIL WWW   Вверх
Yurik
Дата 13.11.2005, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 18.6.2005

Репутация: нет
Всего: нет



Ну блин, допустим шаг=100 пикселов.
Квадраты 100*100
Как заставить мышь скакать по узлам?
PM MAIL   Вверх
Exception
Дата 13.11.2005, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



тебе же только что объяснили!
при каждом событии MouseMove ты:
1. читаешь координаты курсора с помощью класса Cursor.
2. округляешь до ближайшего узла сетки x и y
3. с помощью SetCursorPos устанавливаешь позицию x и y в получившиеся значения.
что неясно?
PM   Вверх
lovermann
Дата 14.11.2005, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 28.12.2004
Где: Прага

Репутация: 1
Всего: 8



Тут по форуму часто ходят люди, которые предлагают написать что-то полезное. Добровольцы, ау! smile Помогие человеку - и вам спасибо скажут! smile
PM WWW ICQ   Вверх
mr.DUDA
Дата 14.11.2005, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



По просьбам трудящихся...

Код

        // накапливаемые отклонения мыши
        int _accumDX=0, _accumDY=0;
        // предыдущие координаты курсора
        int _prevX, _prevY;
        // признак первого захода в обработчик MouseMove
        bool _first = true;

        private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            // шаг, с которым "прыгает" мышиный курсор
            int step = 50;

            Point pt = Cursor.Position;

            // если первый заход - ничего не делаем
            if(!_first)
            {
                // добавляем отклонения мыши в накапливаемые значения
                _accumDX += pt.X - _prevX;
                _accumDY += pt.Y - _prevY;
                // определяем "целое" (в клетках) расстояние, на которое отклонилась мышь
                int dx = step * (_accumDX / step);
                int dy = step * (_accumDY / step);
                if(dx != 0)
                {
                    // если перешли на др. клетку по горизонтали...
                    // ...то вычитаем "целое" расстояние из накопленного
                    _accumDX -= dx;
                    // ... и добавляем к позиции точки по горизонтали
                    pt.X += dx;
                }
                if(dy != 0)
                {
                    // аналогично - для позиции по вертикали
                    _accumDY -= dy;
                    pt.Y += dy;
                }
                // сдвигаем курсор мыши к центру (!!! а не к краю) клетки
                pt.X += step / 2 - pt.X % step;
                pt.Y += step / 2 - pt.Y % step;
                Cursor.Position = pt;
            }

            // сохраняем текущие координаты мыши для след. раза
            _prevX = pt.X;
            _prevY = pt.Y;
            _first = false;
        }




--------------------
user posted image
PM MAIL WWW   Вверх
Yurik
Дата 14.11.2005, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 18.6.2005

Репутация: нет
Всего: нет



Спасибо огромное smile
PM MAIL   Вверх
4YBAK
Дата 16.3.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2006

Репутация: нет
Всего: нет



В данном коде отклонение мыши накапливается, т.е. надо какое-то время (расстояние) вести мышью, чтобы она перепрыгнула на следующий узел. А как сделать, чтобы провел мышью один пиксел влево - она и прыгнула на узел влево, провел - вверх - прыгнула вверх и т.д.
Ну, конечно, один пиксел это мало. В этом случае попасть в нужный узел будет невозможно. Лучше взять пикселов 10. При этом чтоб шаг прыжка по-прежднему оставался 50.
Добавлено @ 13:44
Т.е. проехали вправо 10 пикселов, после чего совершаем прыжок на 50, считая от начальной точки(предыдущего узла)
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Закрытая темаСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0924 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.