Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отобразить Graphics2D Объекты в jPanel 
V
    Опции темы
FewG
Дата 3.12.2011, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как можно отобразить набор Graphics2D объектов (500 Кругов) в jPanel, c условием, что область с кругами дожна быть 1000 пикселей, а jFrame 300x300. При этом область с кругами отображалась полностью т.е. ужата до размеров jFrame.

Заранее спасибо.
PM MAIL   Вверх
_Y_
Дата 3.12.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



А зачем так? Все равно разрешение при отображении будет 300 пикселей. Разумнее сразу строить круги в 300-пиксельном поле. 

Даже если 1000-пиксельный оригинал трогать нельзя, визуально наилучшим результатом будет посторение дополнительной 300-пикскльной копии. 

Если же перестроить круги возможности почему-то нет, тогда надо получать пиксельное изображение и его сжимать. Но выглядеть это будет плоховато.

ЗЫ; Еше можно заниматься извращениями. Например, получить пиксельный вариант изображения, распознать на нем круги и построить по найденным параметрам новое изображение smile  

Это сообщение отредактировал(а) _Y_ - 3.12.2011, 17:13


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
FewG
Дата 3.12.2011, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вся суть в том, что задание нарисовать столько-то кругов, отобразить всю область в меньшем по размеру фрейме и далее написать функцию для увеличения/уменьшения (zoom-in/zoom-out).
PM MAIL   Вверх
_Y_
Дата 3.12.2011, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



А почему нельзя делать zoom-in/zoom-out именно при построении, а не пиксельно? Строите исходное изображение. Вводите коэффициенты зума и перестраиваете его под нужные размеры. По любому и код красивее будет и работать будет быстрее, да и картинка будет лучше, чем пиксели пережевывать.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
FewG
Дата 3.12.2011, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Можно ли примерчик попросить?  smile 
PM MAIL   Вверх
_Y_
Дата 3.12.2011, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



FewG, а примерчик чего? smile  Мы пока о совершенно общих вопросах разговариваем - об архитектуре того что Вам надо сделать. Варианта, собственно три:

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

2. "Пиксельный" подход. Изображение рассматривается как набор пикселей. При уменьшении изображения цвет объединяемых пикселей смешивается-усредняется по тому или иному алгоритму. При увеличении изображения цвет имеющихся пиксели используются для вычисления цвета вновь образовавшихся пикселей. Опять же, алгоритм зависит от задачи. Недостатки - ухудшение качества изображения после каждого сжатия-растягивания. При работе с изображениями низкого разрешения контуры объектов начинают "ломаться". И зачем Вам это надо?

3. Комбинированный подход. Имеем пиксельное изображение. Выделяем на нем элементы и описываем их математически. Дальше идем по пути №1. Для Вашего случая делается довольно легко - круги ведь. Но хоть какой-то разумный смысл в этом еть только если есть картинка и невозможно просто так получить исходные параметры кругов. 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
kamre
Дата 4.12.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(FewG @ 3.12.2011,  18:03)
Можно ли примерчик попросить?  smile

Вот, у меня что-то похожее на "векторный" подход завалялось:
Код

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class CirclesZoom extends JComponent {
    private List<circle> circles;
    private double tx, ty, scale;

    public CirclesZoom() {
        DragZoom dragZoom = new DragZoom();
        addMouseListener(dragZoom);
        addMouseMotionListener(dragZoom);
        addMouseWheelListener(dragZoom);
        circles = new ArrayList<circle>();
        tx = 300;
        ty = 380;
        scale = 30;
        circle c1 = new circle(0, 0, 5);
        circle c2 = new circle(8, 0, 3);
        circle c3 = tangent2(c1, c2, 4, 0, -1);
        circles.add(c1);
        circles.add(c2);
        circles.add(c3);
        for (int i = 0; i < 6; i++) {
            circle c = tangent3(c1, c2, c3);
            circles.add(c);
            c1 = c2;
            c2 = c3;
            c3 = c;
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.gray);
        g.fillRect(0, 0, getWidth(), getHeight());
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.white);
        g2d.setStroke(new BasicStroke(1.5f));
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
        for (circle c : circles) {
            double x = c.x * scale + tx;
            double y = c.y * scale + ty;
            double r = c.r * scale;
            g2d.draw(new Ellipse2D.Double(x - r, y - r, 2 * r, 2 * r));
        }
    }

    private class DragZoom extends MouseAdapter {
        private static final int button = MouseEvent.BUTTON3;
        private boolean isDragging;
        private Point previous;

        @Override
        public void mousePressed(MouseEvent e) {
            if (!isDragging && e.getButton() == button) {
                isDragging = true;
                previous = new Point(e.getPoint());
            }
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            if (isDragging && e.getButton() == button) {
                isDragging = false;
            }
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            if (isDragging) {
                Point point = e.getPoint();
                tx += point.x - previous.x;
                ty += point.y - previous.y;
                previous = new Point(point);
                repaint();
            }
        }

        @Override
        public void mouseWheelMoved(MouseWheelEvent e) {
            double factor = Math.pow(1.1, e.getWheelRotation());
            Point point = e.getPoint();
            tx += (1 - factor) * (point.x - tx);
            ty += (1 - factor) * (point.y - ty);
            scale *= factor;
            repaint();
        }
    }

    private static class circle {
        double x, y, r;

        public circle(double x, double y, double r) {
            this.x = x;
            this.y = y;
            this.r = r;
        }
    }

    private circle tangent2(circle c1, circle c2, double r, double xp, double yp) {
        double r1 = c1.r + r;
        double r2 = c2.r + r;
        double d = c1.r + c2.r;
        double dx = (d * d - r2 * r2 + r1 * r1) / (2 * d);
        double dy = Math.sqrt(r1 * r1 - dx * dx);
        double vx = (c2.x - c1.x) / d;
        double vy = (c2.y - c1.y) / d;
        double nx = -vy;
        double ny = vx;
        if ((xp - c1.x) * nx + (yp - c1.y) * ny < 0) {
            nx = -nx;
            ny = -ny;
        }
        double cx = c1.x + dx * vx + dy * nx;
        double cy = c1.y + dx * vy + dy * ny;
        return new circle(cx, cy, r);
    }

    private circle tangent3(circle c1, circle c2, circle c3) {
        double k1 = 1 / c1.r;
        double k2 = 1 / c2.r;
        double k3 = 1 / c3.r;
        double a = k1 + k2 + k3;
        double b = 2 * Math.sqrt(k1 * k2 + k2 * k3 + k3 * k1);
        double k = Math.max(Math.abs(a - b), a + b);
        double r = 1 / k;
        return tangent2(c1, c2, r, c3.x, c3.y);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("CirclesZoom");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new CirclesZoom());
                frame.setSize(800, 600);
                frame.setVisible(true);
            }
        });
    }
}

В этом примере кстати видно насколько неточно рисуются окружности (через кривые Безье) при большом увеличении, т.к. все окружности по расчетам должны касаться друг друга.

Это сообщение отредактировал(а) kamre - 4.12.2011, 12:12
PM MAIL   Вверх
FewG
Дата 4.12.2011, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



_Y_ и kamre спасибо вам  smile  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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