С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
1 / 1 / 2
Регистрация: 21.12.2011
Сообщений: 73

Перемещение фигуры по canvas

14.11.2017, 15:25. Показов 2636. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно сделать перемещение фигуры пальцем. Круг и квадрат сделал, а с треугольником не получается. Как менять координаты вершин треугольника (строки 71-76).
Java
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Override public boolean onTouch(View view, MotionEvent motionEvent)
    {
        int x = (int)motionEvent.getX();
        int y = (int)motionEvent.getY();
        gestureDetector.onTouchEvent(motionEvent);
 
        switch(motionEvent.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                if(drawManuallyMode)
                {
                    myShape.path.moveTo(x, y);
                    myShape.currentCoordinate = new Point(x, y);
                    invalidate();
                }
                else
                {
                    for(Shape shape: shapes)
                    {
                        if(shape.IsTouched(x, y))
                        {
                            dragMode = true;
                            dragShape = shape;
                            if(dragShape instanceof Square)
                            {
                                dragLeft = x - ((Square) dragShape).left;
                                dragTop = y - ((Square) dragShape).top;
                                dragRight = ((Square) dragShape).right - x;
                                dragBottom = ((Square) dragShape).bottom - y;
                            }
                            else if(dragShape instanceof Circle)
                            {
                                dragCenterX = x - ((Circle)dragShape).center.x;
                                dragCenterY = y - ((Circle)dragShape).center.y;
                            }
                            else if(dragShape instanceof Triangle)
                            {
                                dragCenterX = x - ((Triangle)dragShape).centroid.x;
                                dragCenterY = y - ((Triangle)dragShape).centroid.y;
                            }
                        }
                    }
                }
                break;
            case MotionEvent.ACTION_MOVE:
                if(drawManuallyMode)
                {
                    myShape.currentCoordinate = new Point(x, y);
                    invalidate();
                }
                else if(dragMode)
                {
                    if(dragShape instanceof Square)
                    {
                        ((Square) dragShape).left = x - dragLeft;
                        ((Square) dragShape).top = y - dragTop;
 
                        ((Square) dragShape).right = x + dragRight;
                        ((Square) dragShape).bottom = y + dragBottom;
                    }
                    else if(dragShape instanceof Circle)
                    {
                        ((Circle)dragShape).center.x = x - dragCenterX;
                        ((Circle)dragShape).center.y = y - dragCenterY;
                    }
                    else if(dragShape instanceof Triangle)
                    {
                        ((Triangle)dragShape).centroid.x = x - dragCenterX;
                        ((Triangle)dragShape).centroid.y = y - dragCenterY;
                                               
                        ((Triangle)dragShape).coordinates[0].x =;
                        ((Triangle)dragShape).coordinates[0].y =;
                        ((Triangle)dragShape).coordinates[1].x =;
                        ((Triangle)dragShape).coordinates[1].y =;
                        ((Triangle)dragShape).coordinates[2].x =;
                        ((Triangle)dragShape).coordinates[2].y =;
                    }
                    invalidate();
                }
                break;
            case MotionEvent.ACTION_UP:
                if(drawManuallyMode)
                    drawManuallyMode = false;
                else if(dragMode)
                    dragMode = false;
                invalidate();
                break;
        }
 
        return true;
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.11.2017, 15:25
Ответы с готовыми решениями:

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

Перемещение Canvas
Добрый день. Сегодня утром принял великое решение изучить WPF и вот первый сбой в великих планах Нарисовал Restangle , и хочу чтобы он...

Перемещение объектов в Canvas
Всем привет, всех с Новым годом! Никак не могу толком написать код для перемещения. На каждый элемент, добавляемый в Children вешаю...

2
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
14.11.2017, 16:11
ну я так подозреваю что как и квадрат? у тебя ж точки есть - двигай их все вместе. В квадрате ты просто центр двигаешь. А тут точно также , только точки сдвигай х0, х1. х2 по ику . у0.у1.у2 по игрику
0
1 / 1 / 2
Регистрация: 21.12.2011
Сообщений: 73
14.11.2017, 18:01  [ТС]
Добавил ещё переменную для третьей вершины и теперь работает.

Java
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
boolean dragMode = false;
Point dragLeftTop = new Point();
Point dragRightBottom = new Point();
Point dragCenterXY = new Point();
Point dragTriangleLeftBottom = new Point();
.
.
.
@Override public boolean onTouch(View view, MotionEvent motionEvent)
    {
        int x = (int)motionEvent.getX();
        int y = (int)motionEvent.getY();
        gestureDetector.onTouchEvent(motionEvent);
 
        switch(motionEvent.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                if(drawManuallyMode)
                {
                    myShape.path.moveTo(x, y);
                    myShape.currentCoordinate = new Point(x, y);
                    invalidate();
                }
                else
                {
                    for(Shape shape: shapes)
                    {
                        if(shape.IsTouched(x, y))
                        {
                            dragMode = true;
                            dragShape = shape;
                            if(dragShape instanceof Square)
                            {
                                dragLeftTop.x = x - ((Square) dragShape).left;
                                dragLeftTop.y = y - ((Square) dragShape).top;
                                dragRightBottom.x = ((Square) dragShape).right - x;
                                dragRightBottom.y = ((Square) dragShape).bottom - y;
                            }
                            else if(dragShape instanceof Circle)
                            {
                                dragCenterXY.x = x - ((Circle)dragShape).center.x;
                                dragCenterXY.y = y - ((Circle)dragShape).center.y;
                            }
                            else if(dragShape instanceof Triangle)
                            {
                                //dragCenterXY.x = x - ((Triangle)dragShape).centroid.x;
                                //dragCenterXY.y = y - ((Triangle)dragShape).centroid.y;
                                
                                dragLeftTop.x = x - ((Triangle) dragShape).coordinates[0].x;
                                dragLeftTop.y = y - ((Triangle) dragShape).coordinates[0].y;
 
                                dragTriangleLeftBottom.x = x - ((Triangle) dragShape).coordinates[1].x;
                                dragTriangleLeftBottom.y = ((Triangle) dragShape).coordinates[1].y - y;
 
                                dragRightBottom.x = ((Triangle) dragShape).coordinates[2].x - x;
                                dragRightBottom.y = ((Triangle) dragShape).coordinates[2].y - y;
                            }
                        }
                    }
                }
                break;
            case MotionEvent.ACTION_MOVE:
                if(drawManuallyMode)
                {
                    myShape.currentCoordinate = new Point(x, y);
                    invalidate();
                }
                else if(dragMode)
                {
                    if(dragShape instanceof Square)
                    {
                        ((Square) dragShape).left = x - dragLeftTop.x;
                        ((Square) dragShape).top = y - dragLeftTop.y;
 
                        ((Square) dragShape).right = x + dragRightBottom.x;
                        ((Square) dragShape).bottom = y + dragRightBottom.y;
                    }
                    else if(dragShape instanceof Circle)
                    {
                        ((Circle)dragShape).center.x = x - dragCenterXY.x;
                        ((Circle)dragShape).center.y = y - dragCenterXY.y;
                    }
                    else if(dragShape instanceof Triangle)
                    {
                        //((Triangle)dragShape).centroid.x = x - dragCenterXY.x;
                        //((Triangle)dragShape).centroid.y = y - dragCenterXY.y;
                        
                        ((Triangle)dragShape).coordinates[0].x = x - dragLeftTop.x;
                        ((Triangle)dragShape).coordinates[0].y = y - dragLeftTop.y;
                        ((Triangle)dragShape).coordinates[1].x = x - dragTriangleLeftBottom.x;
                        ((Triangle)dragShape).coordinates[1].y = y + dragTriangleLeftBottom.y;
                        ((Triangle)dragShape).coordinates[2].x = x + dragRightBottom.x;
                        ((Triangle)dragShape).coordinates[2].y = y + dragRightBottom.y;
                    }
                    invalidate();
                }
                break;
            case MotionEvent.ACTION_UP:
                if(drawManuallyMode)
                    drawManuallyMode = false;
                else if(dragMode)
                    dragMode = false;
                invalidate();
                break;
        }
 
        return true;
    }
Добавлено через 1 час 10 минут
С движением разобрался, но теперь не получается сделать вращение. На другом форуме нашёл формулу, но она не работает. После трансформации первые две координаты получаются равными, и треугольник исчезает.
Координаты треугольника: (300;300), (300;600), (600;450). Координаты центра (в онлайн-решалке такое же): (400;450)
Java
1
2
3
4
5
6
7
8
9
10
11
@Override public void Rotate()
    {
        double angle = 0.3;
 
        for(int i = 0; i < 3; i++)
        {
            double R = Math.sqrt(Math.pow(coordinates[i].x - centroid.x, 2) + Math.pow(coordinates[i].y - centroid.y, 2));
            coordinates[i].x = (int) (R * Math.cos(angle) + centroid.x);
            coordinates[i].y = (int) (R * Math.sin(angle) + centroid.y);
        }
    }
Результат: (572;503), (572;503), (591;509).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2017, 18:01
Помогаю со студенческими работами здесь

Перемещение объектов по Canvas
Подскажите пожалуйста, как реализовать перемещение нарисованных объектов (точек, линий, наборов точек (как один объект)) на Image.Canvas с...

Перемещение кнопок по Canvas
protected override UIElementCollection CreateUIElementCollection(FrameworkElement logicalParent) { ...

Движение фигуры по Canvas
Доброе время суток. Подскажите пожалуйста как двигать фигуру по канвасу. Вот мои наброски: void timer_Tick(object sender,...

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

Искаженные фигуры на Canvas
Доброго времени суток! Есть непонятный момент: пытался нарисовать шахматную доску из белых и черных квадратов - рисунок получился...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru