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

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

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

Всем добрый вечер. Подскажите как сделать перемещение нарисованной фигуры по форме? Допустим нарисовал круг,далее кликнули в любое место формы, и он передвинулся по диагонали. Именно по диагонали. Код не нужен,главное понять как вычислять координаты при передвижении по диагонали.
Заранее спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2012, 21:40
Ответы с готовыми решениями:

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

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

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

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

11
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
13.05.2012, 21:52 2
Цитата Сообщение от NowMatrix Посмотреть сообщение
,главное понять как вычислять координаты при передвижении по диагонали
меняешь координаты по x и y одновременно на одно значение и вот тебе движение по диагонали
0
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
14.05.2012, 13:32  [ТС] 3
Да это то понятно. Но надо узнать,какие именно нужны эти dx и dy(расстояние перемещения по осям) . Можно конечно при клике любое значение поставить,но фигура не попадёт в точку. От этих dx и dy зависит угол перемещения фигуры.
0
1267 / 968 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
14.05.2012, 14:17 4
если надо переместить туда куда кликнули просто измени координаты и перерисуй
если надо двигаться по диагонали - anonimus ответил уже
так что надо-то?
0
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
14.05.2012, 16:53  [ТС] 5
Надо двигаться по диагонали. Как выбрать изменения перемещения?Так понятнее?
Миниатюры
Как сделать перемещение нарисованной фигуры по форме  
0
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
14.05.2012, 17:01  [ТС] 6
Если я Х и У буду изменять на одинаковое количество единиц,то фигура будет двигаться под углом 45% градусов,если Х увеличиваем,а У уменьшаем,то угол уменьшается. Если наоборот - угол увеличивается. Так как мне в зависимости от положения точки(конечной),рассчитать угол и в зависимости от угла выбрать шаг передвижения по Х и У?
0
327 / 311 / 68
Регистрация: 05.11.2009
Сообщений: 712
14.05.2012, 17:34 7
Расчёт точек между двумя заданными:
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  [ТС] 8
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
327 / 311 / 68
Регистрация: 05.11.2009
Сообщений: 712
14.05.2012, 20:25 9
Цитата Сообщение от 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  [ТС] 10
Ну у меня получалось,что куда бы я ни кликнул мышью,круг начинает двигаться в это полушарие,но направление неверное,т.е. проходит мимо координат,куда я кликнул. 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
327 / 311 / 68
Регистрация: 05.11.2009
Сообщений: 712
15.05.2012, 11:05 11
выкладываю не большой пример, единственный недостаток предложенного мною метода это погрешность расчёта
хотя существуют и другие алгоритмы, которые могут рассчитать координаты точек вектора, надо просто вспомнить геометрию...
Вложения
Тип файла: rar WindowsFormsApplication2.rar (11.1 Кб, 145 просмотров)
1
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
15.05.2012, 11:38  [ТС] 12
Спасибо. Я тоже разобрался уже).На самом деле всё очень просто).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2012, 11:38

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.