Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Java] Вращение квадрата с помощью мышки 
V
    Опции темы
PsiSnake
Дата 30.10.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Нужно нарисовать квадрат (2Дшный) и предусмотреть возможность его вращения вокруг своего центра с помощью перетягивания мышкой.

Все это нужно сделать на языке Java с помощью среды J2SE 1.5.

В конечном итоге должна быть маленькая программка, которая создает форму - в ней квадрат с возможностью вращения с помощью мышки. Ну форму и сам квадрат я и сам могу написать, а вот с вращением дела обстоят туго...

Буду очень благодарен за помощь, надеюсь на Вас.

Это сообщение отредактировал(а) PsiSnake - 1.11.2009, 18:06
PM MAIL   Вверх
Sanaff
Дата 30.10.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Какой квадрат?
Если просто 4 линии или 4 вершины (знаем их координаты) - то изменение этих координат через sin и cos, и перерисовка заново

Для каждой точки с коорд X0 и Y0 новые координаты X_new, Y_new
Xc, Yc - коорд центра квадрата, alfa - угол поворота

X_new = Xc + (X0-Xc) * Cos(alfa) + (Y0-Yc) * Sin(alfa)
Y_new = Yc + (X0-Xc) * Sin(alfa) - (Y0-Yc) * Cos(alfa)


Если квадрат растровый (картинка, набор точек) - то поворот каждой точки. У меня код есть, но на VB

--------------------
Программист - это локальный бог ©ICQ 373-628-456
PM MAIL WWW ICQ   Вверх
PsiSnake
Дата 30.10.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Sanaff @ 30.10.2009,  20:23)
Какой квадрат?
Если просто 4 линии или 4 вершины (знаем их координаты) - то изменение этих координат через sin и cos, и перерисовка заново

Для каждой точки с коорд X0 и Y0 новые координаты X_new, Y_new
Xc, Yc - коорд центра квадрата, alfa - угол поворота

X_new = Xc + (X0-Xc) * Cos(alfa) + (Y0-Yc) * Sin(alfa)
Y_new = Yc + (X0-Xc) * Sin(alfa) - (Y0-Yc) * Cos(alfa)


Если квадрат растровый (картинка, набор точек) - то поворот каждой точки. У меня код есть, но на VB

Квадрат обычный, просто 4 линии либо вершины, без разницы... А как именно реализовать чтобы оно реагировало на нажатие и кручение мышкой? 
ЗЫ Увы, нужна только Java...
PM MAIL   Вверх
kamre
Дата 1.11.2009, 17:11 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно вот так:
Код

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class RotateSquare extends JComponent {
    private double angle = 0;
    private double squareSize = 150;

    RotateSquare() {
        Listener listener = new Listener();
        addMouseListener(listener);
        addMouseMotionListener(listener);
    }

    private class Listener extends MouseAdapter {
        private double prevAngle;

        @Override
        public void mousePressed(MouseEvent e) {
            prevAngle = calcAngle(e.getPoint());
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            double curAngle = calcAngle(e.getPoint());
            double deltaAngle = curAngle - prevAngle;
            angle += deltaAngle;
            repaint();
            prevAngle = curAngle;
        }

        private double calcAngle(Point point) {
            double x = point.getX() - 0.5 * getWidth();
            double y = point.getY() - 0.5 * getHeight();
            return Math.atan2(y, x);
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.white);
        int w = getWidth();
        int h = getHeight();
        g.fillRect(0, 0, w, h);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(4.0f));
        g2d.translate(0.5 * w, 0.5 * h);
        g2d.rotate(angle);
        double r = -0.5 * squareSize;
        Rectangle2D rect = new Rectangle2D.Double(r, r, squareSize, squareSize);
        g2d.setColor(Color.magenta);
        g2d.fill(rect);
        g2d.setColor(Color.blue);
        g2d.draw(rect);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame("RotateSquare");
                frame.add(new RotateSquare());
                frame.setSize(400, 300);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}


PM MAIL   Вверх
PsiSnake
Дата 1.11.2009, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



kamre, 
Огромнейшее спасибо, все работает, все супер!  smile 
Respect !
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

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


 




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


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

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