Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
haribo
41 / 41 / 0
Регистрация: 26.05.2013
Сообщений: 160
1

Ресайз фигуры

12.09.2013, 11:57. Просмотров 432. Ответов 5
Метки нет (Все метки)

Есть фигура. Квадрат. Отображаю при помощи Path. Path составляю из массива точек.
При пинче хочу ресайзить фигуру (делать крупнее, мельче).
Как ресайзю сейчас: для каждой точек квадрата (а их четыре) сечу новые X+Y, их вычисляю обычным способом.

Проблема: При таком ресайзе фигура уезжает, то есть поскольку x и y все точек увеличивается/уменьшается фигура уезжает.

Вопрос: Как надо?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2013, 11:57
Ответы с готовыми решениями:

Движение геометрической фигуры
Прошу помочь Нужно реализовать движение по экрану геометрической фигуры в...

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

Вращение фигуры в SurfaceView
Сейчас фигура вращается с помощью функции glRotate, все работает, и она...

ProgressBar в виде фигуры человечка
Здравствуйте. Подскажите как реализовать такой progressbar. Спасибо.

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

5
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
12.09.2013, 12:32 2
Цитата Сообщение от haribo Посмотреть сообщение
их вычисляю обычным способом
интересно каким? по идее надо, например, так: левый верхний угол фигуры остается неподвижным, тогда: координаты трех оставшихся точек вычисляются как текущее расстояние от них до опорной точки по соответвующе оси умноженное на масштабный коэффициент.
1
haribo
41 / 41 / 0
Регистрация: 26.05.2013
Сообщений: 160
12.09.2013, 14:16  [ТС] 3
Цитата Сообщение от vxg Посмотреть сообщение
интересно каким? по идее надо, например, так: левый верхний угол фигуры остается неподвижным, тогда: координаты трех оставшихся точек вычисляются как текущее расстояние от них до опорной точки по соответвующе оси умноженное на масштабный коэффициент.
Именно так, только левый верхний угол тоже вычисляется. Если его не вычислять, то точки разъезжаются по какой-то причине и это уже не квадрат.
Плюс ко всему, назрел еще один вопрос, почему-то ресайз ОЧЕНЬ быстрый, малеший pinch дает огромный ресайз.

Ресайз вычисляю следующим образом:
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
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        ...
        case MotionEvent.ACTION_MOVE: {
                ...
                float newMovingDist = spacing(event);
                if (newMovingDist > stdDist) {
                        for (FigurePoint point : pointList) {
                            point.setX((int) (newMovingDist / movingDist * point.getX()));
                            point.setY((int) (newMovingDist / movingDist * point.getY()));
                        }
                        invalidate();
                }
}
 
private float spacing(MotionEvent event) {
    float x = 0;
    float y = 0;
    try {
        x = event.getX(0) - event.getX(1);
        y = event.getY(0) - event.getY(1);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        Log.d(TAG, "pointerIndex exception");
    }
    return FloatMath.sqrt(x * x + y * y);
}
pointsList - содержит точки фигуры (квадрат, треугольник)
0
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
12.09.2013, 14:44 4
Цитата Сообщение от haribo Посмотреть сообщение
по какой-то причине
надо полагать они едут от того что левый верхний угол имеет координаты отличные от 0,0 - нельзя координаты тупо умножать на масштабирующий коэффициент. новая координата должна быть вычислена как
x_new = x_base + (x_old - x_base) * k;
то же самое для y
базовую точку выбирайте любую - будет казаться что фигура меняет размер будучи закрепленной за эту точку. что бы размер изменялся не слишком быстро подберите k. как его получить по прикосновению - отдельная тема. я не разу с прикосновением не работал. если вы про тот вид когда человек сводит/разводит два пальца, то наверное надо получать отношение между исходной и текущей дистанцией. причем перезаписывать координаты фигуры только после того как пользователь отпустил. иначе она лавинообразно увеличится/уменьшится
1
haribo
41 / 41 / 0
Регистрация: 26.05.2013
Сообщений: 160
12.09.2013, 18:01  [ТС] 5
del

Добавлено через 16 минут
Цитата Сообщение от vxg Посмотреть сообщение
иначе она лавинообразно увеличится/уменьшится
именно так и нужно, уменьшение/увеличение не после отпускания пальцев, а во время пинча.
Если что, могу рассказать как это делается (код представлен выше)
0
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
12.09.2013, 19:10 6
лучше расскажите)
0
12.09.2013, 19:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 19:10

Ресайз
Добрый день! Есть такая проблема. Имеется скрипт, который меняет размеры...

Ресайз картинок
Привет! Можно ли средствами РНР изменять размеры картинок как есть, т.е., - ...

Ресайз канваса
Столкнулся с такой проблемой: Загружаю в канвас изображение; Теперь, если...


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

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

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