Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/47: Рейтинг темы: голосов - 47, средняя оценка - 4.60
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438

Как сделать перемещение нарисованной фигуры по форме

13.05.2012, 21:40. Показов 9822. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый вечер. Подскажите как сделать перемещение нарисованной фигуры по форме? Допустим нарисовал круг,далее кликнули в любое место формы, и он передвинулся по диагонали. Именно по диагонали. Код не нужен,главное понять как вычислять координаты при передвижении по диагонали.
Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.05.2012, 21:40
Ответы с готовыми решениями:

Как сделать плавное перемещение нарисованной фигуры по форме?
Здравствуйте, у меня есть задача: Передвижение фигур. Вообщем выполняю её так: создаю стартовую фигуру, указываю куда она должна...

Перемещение нарисованной фигуры по форме
Как осуществить перемещение фигуры? Например, квадрата.

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

11
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
13.05.2012, 21:52
Цитата Сообщение от NowMatrix Посмотреть сообщение
,главное понять как вычислять координаты при передвижении по диагонали
меняешь координаты по x и y одновременно на одно значение и вот тебе движение по диагонали
0
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
14.05.2012, 13:32  [ТС]
Да это то понятно. Но надо узнать,какие именно нужны эти dx и dy(расстояние перемещения по осям) . Можно конечно при клике любое значение поставить,но фигура не попадёт в точку. От этих dx и dy зависит угол перемещения фигуры.
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
14.05.2012, 14:17
если надо переместить туда куда кликнули просто измени координаты и перерисуй
если надо двигаться по диагонали - anonimus ответил уже
так что надо-то?
0
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
14.05.2012, 16:53  [ТС]
Надо двигаться по диагонали. Как выбрать изменения перемещения?Так понятнее?
Миниатюры
Как сделать перемещение нарисованной фигуры по форме  
0
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
14.05.2012, 17:01  [ТС]
Если я Х и У буду изменять на одинаковое количество единиц,то фигура будет двигаться под углом 45% градусов,если Х увеличиваем,а У уменьшаем,то угол уменьшается. Если наоборот - угол увеличивается. Так как мне в зависимости от положения точки(конечной),рассчитать угол и в зависимости от угла выбрать шаг передвижения по Х и У?
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
14.05.2012, 17:34
Расчёт точек между двумя заданными:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
path.Add(new Point(e.X, e.Y)); //path - List<Point> содержит всего две точки "от" и "до"
 
if (path.Count > 1)
{ 
    Point newPoint = path[0];
    int delta_x = (path[1].X - path[0].X) / step_x; //step_x - кол-во итераций для получения результата по оси x
    int delta_y = (path[1].Y - path[0].Y) / step_y; //step_y - кол-во итераций для получения результата по оси y
 
    bool flag = true;
    while (flag)
    {
        flag = flag && (delta_x > 0 ? path[1].X >= newPoint.X : path[1].X <= newPoint.X);
        flag = flag && (delta_y > 0 ? path[1].Y >= newPoint.Y : path[1].Y <= newPoint.Y);
 
        //нечто двигаете используя значения из newPoint
 
        newPoint.X += delta_x;
        newPoint.Y += delta_y;
    }
    path.Clear();
}
а как это использовать думаю сами домыслите...
1
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
14.05.2012, 19:42  [ТС]
kuroiryuu, спасибо,но немного неправильно работает. Единственное ,что это направление правильно рассчитывает. Вот эти строчки обо всём говорят.
C#
1
2
int delta_x = (path[1].X - path[0].X) / step_x; //step_x - кол-во итераций для получения результата по оси x
int delta_y = (path[1].Y - path[0].Y) / step_y; //step_y - кол-во итераций для получения результата по оси y
Получается,что фигура движется в примерно правильном направлении,но всегда под углом 45 градусов.

Добавлено через 19 минут
Всё ,решил проблему.

Добавлено через 4 минуты
Кому интересно. Во-первых нельзя использовать целочисленные переменные,т.к. длина шага колеблется от -1 до 1,поэтому идёт округление. И делить надо не на количество итераций по Х или У,а на биссектрису . Вот пример расчёта:

C#
1
2
3
4
5
6
7
float step_x = Math.Abs(b.startX - b.endX);
            float step_y = Math.Abs(b.startY - b.endY);
 
            float step =(float) Math.Sqrt(step_x * step_x + step_y * step_y);
 
            float dX = (b.endX - b.startX) / step;
            float dY = (b.endY - b.startY) / step;
Добавлено через 4 минуты
Нет,ошибся. Так конечно лучше,но направление не совсем верное.
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
14.05.2012, 20:25
Цитата Сообщение от NowMatrix Посмотреть сообщение
kuroiryuu, спасибо,но немного неправильно работает. Единственное ,что это направление правильно рассчитывает. Вот эти строчки обо всём говорят.
C#
1
2
int delta_x = (path[1].X - path[0].X) / step_x; //step_x - кол-во итераций для получения результата по оси x
int delta_y = (path[1].Y - path[0].Y) / step_y; //step_y - кол-во итераций для получения результата по оси y
Получается,что фигура движется в примерно правильном направлении,но всегда под углом 45 градусов.
Вообще-то не под 45 градусов там любой угол можно задать, т.к. этот алгоритм я проверял с помощью выбора координат мышью...
Смысл здесь в том, что любое движение по вектору можно с позиционировать оси, т.е. движение одновременно происходит по оси абсцисс и по оси ординат. Эти строки как раз это и рассчитывали, откуда вы решили что движение происходит только под 45 градусов не знаю...
конечно желательно, чтобы step_x == step_y
0
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
14.05.2012, 20:39  [ТС]
Ну у меня получалось,что куда бы я ни кликнул мышью,круг начинает двигаться в это полушарие,но направление неверное,т.е. проходит мимо координат,куда я кликнул. delta_x и delta_y в отладчике принимают значения -1,0 или 1. В основном или (delta_x=1 и delta_y=1) или (delta_x=1 и delta_y=-1) или (delta_x=-1 и delta_у=1). Других значений не принимает. И при равных по модулю delta_x и delta_у движение будет под 45 градусов,только в разных направлениях.
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
15.05.2012, 11:05
выкладываю не большой пример, единственный недостаток предложенного мною метода это погрешность расчёта
хотя существуют и другие алгоритмы, которые могут рассчитать координаты точек вектора, надо просто вспомнить геометрию...
Вложения
Тип файла: rar WindowsFormsApplication2.rar (11.1 Кб, 154 просмотров)
1
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
15.05.2012, 11:38  [ТС]
Спасибо. Я тоже разобрался уже).На самом деле всё очень просто).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2012, 11:38
Помогаю со студенческими работами здесь

Как выполнить заливку нарисованной фигуры?
Создана программа - графический редактор. Допустим нарисован овал, как выполнить его заливку? С# Добавлено через 30 минут нашла...

Как реализовать заливку нарисованной фигуры?
Пишу Paint на wpf. Возникла проблема - не знаю как реализовать заливку нарисованной фигуры. Помню в Delphi была возможность делать через...

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

Как поменять размер нарисованной фигуры в PictureBox?
Как поменять размер нарисованной фигуры в picturebox на WinForms C#? Есть рисовалка, в ней мы можем нарисовать фигуры, так вот как...

Перемещение фигуры на форме. Исходное положение задаётся случайно
Здравствуйте. Возникла небольшая проблема. Хочу, чтобы от края экрана начал двигаться эллипс, при каждом запуске программы он естественно...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
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 Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru