Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > SceneGraph: введение


Автор: Platon 10.4.2008, 15:02
Здравствуйте, уважаемые.

В виду последних событий, мне придется основательно познакомиться с библиотекой SceneGraph, примеры которой можно найти https://scenegraph-demos.dev.java.net/.
Библиотека замечательная, и обладает неслабым потенциалом, к слову, ее используют SwingLabs и JavaFX.

Гипотетически, я могу делиться своими маленькими примерчиками, открытиями и прочим, если это кому нибудь интересно. 
Не стал делать опрос, просто свое мнение высказывайте устно и ставя оценку этому посту.

Автор: cube 10.4.2008, 16:03
Очень интересно! Выкладывай!

Автор: Platon 11.4.2008, 12:11
Окэй, ожидал чуть более живой реакции, видимо. понапрасну, надеюсь подтянутся в процессе.
Для начала вводная лекция.

Обоснование выбора 
В начале графического пути я делал все вещи самостоятельно, это и программка Фигурки, Вырезание лобзиком, Танчики, Шахматы (все игрушки выложены на форуме) – вся графическая часть этого была выполнена собственноручно, со временем я стал задумываться, а неплохо было бы вращать композицию объектов одновременно + своя внутренняя система координат + здорово было бы если бы события на графических объектах обрабатывались как в компонентах Swing, AWT и т.д. По знакомству с QT, я знал, что там разработан замечательный framework (дожил, даже не знаю, как обзывать по-русски) The Graphics View Framework, Первая мысль была использовать Jambi, загвоздка заключается в том, что Jambi нужно или купить, или разрабатывать некоммерческие приложения + идея о pure java заставила отклонить этот вариант. При первой острой необходимости я стал искать http://forum.vingrad.ru/forum/topic-204283.html в конце поиска остановился на SceneGraph, удовлетворяла всем моим потребностям. Но, должен предостеречь, как это делают сами разработчики этой библиотеки, она пока сырая и в проекты ее включать опасно. Поработав немного, пока не вижу никаких причин не использовать, разве, что нашел один баг, но он незначительный.

Основные понятия 
Сцена – полотно, на котором располагаются все графические элементы.
Глобальные координаты – координаты относительно корневого компонента (сцены), чаще всего это JSGPanel
Локальные координаты – координаты в своей внутренней системе представлений.
SGNode 
Цитата
Base class for scene graph nodes. Nodes define a "local" coordinate system like the one used by AWT/Swing: x increases to the right, y increases downwards.

Цитата
Базовый класс для графических узлов сцены. Узлы определяют «локальную» систему координат, как, например, используется AWT/Swing: x увеличивается вправо, y растет вниз. 

Попросту говоря, это кирпичик сцены, класс, от которого наследуются все графические  компоненты сцены.

SGGroup
Цитата
Defines a transformed coordinate system for a list of SGNodes.

Цитата
Определяет смещенную систему координат для списка элементов SGNode.

Как раз тот удобный класс, который позволяет при изменении координат данного элемента изменить глобальные координаты всех дочерних элементов SGNode.

SGTransform.Translate
Цитата

A subclass of SGTransform that applies a simple translation transform. A translation transform simply adds a constant value to the X and Y coordinates of the source coordinates. The transform x',y' of a source point x,y is represented by the equations: 
           x' = x + transx;
           y' = y + transy;
       
Instances of this class can only be created by calling the createTranslation factory method. 

Цитата
Подкласс SGTransform, который применяет простое перемещение. <…> 
Объект класса можно создать только вызвав createTranslation статичный метод класса SGTransform (изменено переводчиком).

Используется для динамического позиционирования графического объекта.

SGTransform.Rotate
Цитата
 This class implements a rotation transform about the origin. All points are rotated according to the sine and cosine of the specified angle. The transform x',y' of a source point x,y is represented by the equations: 
           x' = x * cos(theta) - y * sin(theta);
           y' = x * sin(theta) + y * cos(theta);
       
Instances of this class can only be created by calling the createRotation factory method. 
 

Цитата
Класс реализует поворот относительно начала координат. Все точки поворачиваются согласно синусу и косинусу заданного угла <…>
Объект класса можно создать только вызвав createRotation статичный метод класса SGTransform (изменено переводчиком).


JSGPanel
Цитата
 JSGPanel is a JComponent that renders a scene graph. 

Swing компонент, который встаивается в Swing приложение и отображает графическую композицию.

Теперь ломовые лошадки, с которыми придется иметь много дел:
SGShape, SGImage, SGText, говорят сами за себя. Соответственно: классы по работе с классами Java 2D Shape, с классами Image, с текстом.

Hello world рисовать не буду. Я позволю себе начать с чуть более сложного. https://scenegraph-demos.dev.java.net/demos.html
Приложение демонстрирует работу по обработке событий мыши, перетаскивания, поворота фигуры.

Код

package ru.vingrad.platon.scenegraph.firstapp;

import com.sun.scenario.scenegraph.*;
import com.sun.scenario.scenegraph.event.SGMouseAdapter;

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

public class Dragger extends JSGPanel {
    public Dragger() {
        // элемент, который представляет прямоугольник
        final SGShape sh = new SGShape();
        // необходимо заметить, что для вращения компонента необходимо расположить прямоугольник с центром тяжести в начале координат
        // Замечание: Есть другой способ, о нем в отдельном комментарии
        sh.setShape(new Rectangle2D.Double(-100, -75, 200, 150));
        // Создаем элемент, который будет отвечать за динамический поворот
        final SGTransform.Rotate rot = SGTransform.createRotation(Math.PI/8, sh);
        // Создаем элемент, который будет отвечать за динамическое перемещение элемента
        final SGTransform.Translate tr2 = SGTransform.createTranslation(0, 0, rot);
        // необходимо заметить, что образуется своего рода цепочка вложенности shape -> rotate -> translate
        // таким образом мы накладываем "фильтр координат", в результате получаем элемент, который способен как вращаться так и перемещаться


        // вот наш первый обработчик событий мыши.Перетаскивание левой кнопкой позволяет переместить элемент,
        // правой - позволяет повернуть элемент вокруг своего начала координат
        sh.addMouseListener(new SGMouseAdapter() {
            private Point p;
            private boolean b;

            public void mouseDragged(MouseEvent e, SGNode node) {
                if (b) {
                    // правая кнопка в действии, поворачиваем элемент
                    Rectangle2D r = tr2.getBounds();
                    double x = e.getX() - r.getCenterX();
                    double y = e.getY() - r.getCenterY();
                    rot.setRotation(Math.atan2(y, x));
                } else {
                    // левая кнопка в действии, перетаскиваем элемент
                    tr2.translateBy(e.getX() - p.getX(), e.getY() - p.getY());
                    p = e.getPoint();
                }
            }

            // поиздеваемся над собой, сделаем при входе мышки на компонент красной
            public void mouseEntered(MouseEvent mouseEvent, SGNode sgNode) {
                sh.setFillPaint(Color.RED);
            }

            // при выходе мыши с элемента, возвращаем его в черный
            public void mouseExited(MouseEvent mouseEvent, SGNode sgNode) {
                sh.setFillPaint(Color.BLACK);
            }

            public void mousePressed(MouseEvent e, SGNode node) {
                b = e.getButton() == MouseEvent.BUTTON3;
                p = e.getPoint();
            }
        });
        // устанавливаем корневой элемент, заметьте, что мы берем именно тот элемент цепочки, который содержит в себе все остальные
        setScene(tr2);
    }

    public static void main(String[] args) {
        JFrame f =new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new Dragger());
        f.setSize(new Dimension(400, 400));
        f.setVisible(true);
    }
}


Теперь о том моменте, который я оставил на отдельный комментарий:
Код

sh.setShape(new Rectangle2D.Double(-100, -75, 200, 150));
SGTransform.Rotate rot = SGTransform.createRotation(Math.PI/8, sh);

будет эквивалентен этому коду:
Код

sh.setShape(new Rectangle2D.Double(0, 0, 200, 150));
SGTransform.Rotate rot = SGTransform.createRotation(Math.PI/8, SGTransform. createTranslation (-100, -75, sh));


http://download.java.net/javadesktop/scenario/releases/0.6/Scenario-0.6.jar

Автор: 1024 12.4.2008, 13:13
у тебя есть что-то готовое посложней разноцветных шариков?

Автор: Platon 15.4.2008, 07:25
Решил дополнить свой первый пример.

Пара скринов:
user posted image
user posted image

http://rapidshare.com/files/108187567/src.rar

Автор: Platon 17.4.2008, 10:35
Попробуем оживить дискуссию. Подготовил еще 1 материальчик.

Использование модели данных управления фигурой. 

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

user posted image

Код

package ru.vingrad.platon.scenegraph.modeldemo;

import com.sun.scenario.scenegraph.*;
import com.sun.scenario.scenegraph.event.SGMouseAdapter;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.GeneralPath;
import java.io.IOException;

public class VingradShape {

    private static Image logo;

    private static Image logoHover;

    private static Paint bigStarPaint = new GradientPaint(new Point2D.Double(-100, 0), Color.BLUE, new Point2D.Double(100, 0), Color.YELLOW);

    private static Paint bigStarHoverPaint = new GradientPaint(new Point2D.Double(-100, 0), Color.YELLOW, new Point2D.Double(100, 0), Color.BLUE);

    static {
        try {
            logo = ImageIO.read(VingradShape.class.getResource("resources/cool11.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            logoHover = ImageIO.read(VingradShape.class.getResource("resources/cool8.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private SGGroup root;

    private SGTransform.Translate translate;
    private SGTransform.Rotate rot1;
    private SGTransform.Rotate rot2;

    private LocationModel model;

    private LocationListener listener = new VingradShapeLocationListener();

    public VingradShape() {
        // элемент, который представляет прямоугольник
        final SGShape sh = new SGShape();
        sh.setShape(buildStar(200));
        sh.setAntialiasingHint(RenderingHints.VALUE_ANTIALIAS_ON);
        sh.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        sh.setFillPaint(bigStarPaint);
        rot1 = SGTransform.createRotation(0, sh);

        // Добавлена новая маленькая звездочка и так же обернута
        final SGShape sh2 = new SGShape();
        sh2.setAntialiasingHint(RenderingHints.VALUE_ANTIALIAS_ON);
        sh2.setShape(buildStar(100));
        sh2.setFillPaint(Color.RED);

        final SGImage image = new SGImage();
        image.setImage(logo);
        SGGroup loc = new SGGroup();
        loc.add(sh2);
        loc.add(SGTransform.createTranslation(-image.getBounds().getCenterX(), -image.getBounds().getCenterY(), image));

        rot2 = SGTransform.createRotation(0, loc);
        SGGroup group = new SGGroup();
        group.add(rot1);
        group.add(rot2);
        translate = SGTransform.createTranslation(100, 100, group);

        // вот наш первый обработчик событий мыши.Перетаскивание левой кнопкой позволяет переместить элемент,
        // правой - позволяет повернуть элемент вокруг своего начала координат
        sh.addMouseListener(new SGMouseAdapter() {
            private Point p;
            private boolean b;

            public void mouseDragged(MouseEvent e, SGNode node) {
                if (b) {
                    // правая кнопка в действии, поворачиваем элемент
                    Rectangle2D r = translate.getBounds();
                    double x = e.getX() - r.getCenterX();
                    double y = e.getY() - r.getCenterY();
                    model.setAngle(Math.atan2(y, x));
                } else {
                    // левая кнопка в действии, перетаскиваем элемент
                    model.setLocation(model.getX() + e.getX() - p.getX(), model.getY() + e.getY() - p.getY());
                    p = e.getPoint();
                }
            }

            // поиздеваемся над собой, сделаем при входе мышки на компонент красной
            public void mouseEntered(MouseEvent mouseEvent, SGNode sgNode) {
                sh.setFillPaint(bigStarHoverPaint);
                sh2.setFillPaint(Color.BLACK);
                image.setImage(logoHover);
            }

            // при выходе мыши с элемента, возвращаем его в черный
            public void mouseExited(MouseEvent mouseEvent, SGNode sgNode) {
                sh.setFillPaint(bigStarPaint);
                sh2.setFillPaint(Color.RED);
                image.setImage(logo);
            }

            public void mousePressed(MouseEvent e, SGNode node) {
                b = e.getButton() == MouseEvent.BUTTON3;
                p = e.getPoint();
            }
        });

        root = new SGGroup();
        root.add(translate);
    }

    public VingradShape(LocationModel model) {
        this();
        setLocationModel(model);
    }

    public void setLocationModel(LocationModel model) {
        if (this.model != null)
            this.model.removeListener(listener);
        this.model = model;
        model.addListener(listener);
        translate.setTranslation(model.getX(), model.getY());
        rot1.setRotation(model.getAngle());
        rot2.setRotation(-model.getAngle());
    }

    private static Shape buildStar(int w) {
        GeneralPath shape = new GeneralPath();
        shape.moveTo(w/2, 0);
        double dAngle = 2*Math.PI/5;
        double outerRadius = w/2;
        double innerRadius = outerRadius/2;
        for (int i = 0; i &lt; 5; i++) {
            shape.lineTo(Math.cos(dAngle*i)*outerRadius, Math.sin(dAngle*i)*outerRadius);
            shape.lineTo(Math.cos(dAngle*i + dAngle/2)*innerRadius, Math.sin(dAngle*i + dAngle/2)*innerRadius);
        }
        shape.closePath();
        return shape;
    }

    public SGNode getView() {
        return root;
    }


    private final class VingradShapeLocationListener implements LocationListener {

        public void locationChanged(LocationModel sectorLocationModel, double x, double y) {
            translate.setTranslation(x, y);
        }

        public void xChanged(LocationModel sectorLocationModel, double x) {
            translate.setTranslateX(x);
        }

        public void yChanged(LocationModel sectorLocationModel, double y) {
            translate.setTranslateY(y);
        }

        public void angleChanged(LocationModel sectorLocationModel, double angle) {
            rot1.setRotation(angle);
            rot2.setRotation(-angle);
        }
    }
}


Код

package ru.vingrad.platon.scenegraph.modeldemo;

import java.util.Vector;

// Сама модель координат фигуры
public class LocationModel {

    private Vector listeners = new Vector();

    private double x;
    private double y;
    private double angle;


    public void addListener(LocationListener l) {
        listeners.add(l);
    }

    public void removeListener(LocationListener l) {
        listeners.remove(l);
    }

    public void setLocation(double x, double y) {
        double oldX = this.x;
        double oldY = this.y;
        this.x = x;
        this.y = y;
        if (oldX != x &amp;&amp; oldY != y)
            fireLocationChanged(x, y);
        else if (oldX != x)
            fireXChanged(x);
        else if (oldY != y)
            fireYChanged(y);
    }

    protected void fireLocationChanged(double x, double y) {
        for(int i = listeners.size() - 1; i &gt;= 0; i--)
          listeners.elementAt(i).locationChanged(this, x, y);
    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        if (this.x == x) return;
        this.x = x;
        fireXChanged(x);
    }

    protected void fireXChanged(double x) {
        for(int i = listeners.size() - 1; i &gt;= 0; i--)
          listeners.elementAt(i).xChanged(this, x);
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        if (this.y == y) return;
        this.y = y;
        fireYChanged(y);
    }

    protected void fireYChanged(double y) {
        for(int i = listeners.size() - 1; i &gt;= 0; i--)
          listeners.elementAt(i).yChanged(this, y);
    }

    public double getAngle() {
        return angle;
    }

    public void setAngle(double angle) {
        if (this.angle == angle) return;
        this.angle = angle;
        fireAngleChanged(angle);
    }

    protected void fireAngleChanged(double anglev) {
        for(int i = listeners.size() - 1; i &gt;= 0; i--)
          listeners.elementAt(i).angleChanged(this, anglev);
    }
}



Код

package ru.vingrad.platon.scenegraph.modeldemo;
// Слушатель изменений координат и угла поворота модели
public interface LocationListener {
    public void locationChanged(LocationModel sectorLocationModel, double x, double y);
    public void xChanged(LocationModel sectorLocationModel, double x);
    public void yChanged(LocationModel sectorLocationModel, double y);
    public void angleChanged(LocationModel sectorLocationModel, double angle);
}


http://rapidshare.com/files/108203869/shape-model.rar

Автор: Platon 17.4.2008, 11:13
Решил выложить пару скринов своей работы с помощью SceneGraph. В конструкторе аудитории это демонтрация манежного блока, который имеет внутренний радиус, внешний радиус (пропорция - их отношение), число рядов, число сидений в первом ряду, число сидений в последнем ряду + уже обсуждаемые координаты фигуры.

user posted image
user posted image
user posted image

http://rapidshare.com/files/108154612/test.rar но архив запаролен, кто хочет иметь доступ к файлу, пишите в личку или на почту.

Автор: 1024 17.4.2008, 11:37
никому не интересен твой небольшой опыт (как ты сам сказал). Тем более если надо какой-то пароль.

Если будет что-то работающее и интересное то выкладывать нужно
1. со скриншотами для тех кому лень скачивать
2.полностью работающее чтоб запускалость тыканием мышки т.е. со всеми библиотеками и настройками
3.исходный код (если есть) должен компиляться в какой либо распространённой IDE без ковыряния в настройках

пример - мой сайт по JavaFX (ото родственный сценграфу проект) - http://molgav.nn.ru/


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

В статьях желательно больше картинок и описаний, так наглядней для читателей. Не нужно ожидать что многие начнут копаться в полотенце кода.



Автор: Platon 18.4.2008, 12:06
Знать бы что стоящее еще сделать. С идеями проблемы :(

Автор: 1024 21.4.2008, 09:07
думаю что из практичного но наглядного может быть какая-то программа использующая графики. 

из непрактичного но наглядного можно взять какую-то классическую игрушку типа Tetris, морской бой, Inviders или Breakout

Автор: Platon 5.5.2008, 14:37
Здравствуйте, уважаемые.

С вами снова я неугомонный любитель графических библиотек! По многочисленным просьбам я выполнил демо проект, опять же не такой сложный как тетрис, морской бой или еще что там, но имеет вполне хорошее практическое применение в эффектных демонстрациях.

Карта мира.

http://ipicture.ru/Gallery/Viewfull/1684913.html
http://ipicture.ru/Gallery/Viewfull/1684924.html

Возможности: можно щелкать по континентам для приближения/отдаления.
Если будут желающие детально разберу и выложу исходники.

Качайте архив, не смущайтесь, запускается с пары кликов (для видновозов).

Автор: Platon 6.5.2008, 16:38
Вижу пятнадцатерых скачавших и ниодного комментария.

Автор: Gugle 8.5.2008, 12:54
16 скачиваний. smile

Посмотрел твой пример.
Просмотрел примеры на сайте. 
Интересно, красиво и еще много чего можно добавить...

Комент собственно решил оставить после твоего примера с картой. В долгом ящике лежит куча проектов где можно было бы использовать такую графику. Вот только эти проекты специфичны. То что ты начал ковырять эту библиотеку это + тебе. В реале, лично я не видел ничего готового с такой графикой написаной на java. Только тестовые работы.

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

Надеюсь ты незабросишь изучение.

Автор: Platon 8.5.2008, 13:26
Слава Богу, хоть 1 спасительный комментарий. Не заброшу в любом случае, я к этому неровно дышу и попытки делать такое предпринимаю давно.

Автор: Asal 15.5.2008, 14:28
А я вот камушАк решил бросить в твой АгАрОд  smile 
Не по злобе, а из абиды, что руки у меня растут не от туда от куда надо  smile 
нифига не получилось у меня запустить твой примерчик с картой
Код

asal@asal:~/Desktop/export> /usr/bin/java -cp lib/Scenario-0.6.jar ru.vingrad.platon.scenegraph.map.test.MapTest
Exception in thread "main" java.lang.NoClassDefFoundError: ru/vingrad/platon/scenegraph/map/test/MapTest
Caused by: java.lang.ClassNotFoundException: ru.vingrad.platon.scenegraph.map.test.MapTest
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

люди научите меня, как запустить  smile 

а еще лучше исходники в студию  smile 

Автор: Platon 15.5.2008, 14:52
У меня в папке есть run.bat ты попробуй запустить что-то в роде этого
Код

java -cp "lib/Scenario-0.6.jar;" ru.vingrad.platon.scenegraph.map.test.MapTest

Вижу разницу только в "lib/Scenario-0.6.jar;", ";" здесь существенна, помнится мне что она добавляет путь "", т.е. грубо говоря в class path добавляется текущая папка.

Автор: Asal 15.5.2008, 15:04
не, не пахит. вроде всяк попробывал  smile 

Автор: Gugle 16.5.2008, 11:32
Такс... С поворотами и перемещениями разобрался.
Начал смотреть на движение объектов.

Кстати, модель для координат фигур хорошая. Надо бы ее только закоментить.

Автор: Platon 16.5.2008, 11:44
В таком случает, раз дискуссия оживилась, выкладываю исходник Карты мира.

Автор: Gugle 16.5.2008, 13:05
Какой IDA пользуешься?

Добавлено через 52 секунды
Тфу... IDE

Автор: Platon 16.5.2008, 13:35
А без разницы. там нет IDE зависимых компонентов

Автор: Gugle 16.5.2008, 14:00
smile Эт я в курсе. просто интересно какой ты пользуешься.

Автор: Gugle 21.5.2008, 12:41
И наконец появился вопросик.
В class Map есть:
Код

 public void setLocation(Point2D location) {
    if (this.location != null && this.location.equals(location)) return;
    this.location = location;
    translate.setTranslation(-location.getX(), -location.getY());
}

Не могу понять - зачем?

Автор: Platon 21.5.2008, 13:10
Не можешь понять зачем что? Зачем я делаю функцию setLocation(Point2D)? Ты хотел бы сразу устанавливать в translate.setTranslation(-location.getX(), -location.getY());? 

Это "тяжелое наследие" ООП, передача полномочий внутреннему устройству карты. Нам совсем не важно, как у нас работает эта функция, в идеале мы даже не должны видеть ее внутренности. Единственное, если бы я описывал функции, я бы обязательно написал, что эта функция устанавливает переданную координату в центр экрана (карты).

Автор: Gugle 30.5.2008, 10:08
Ну вот и я немного повозился с "картой мира".
Программа теперь имеет 2 ражима просмотра карты. 
1. Карта и континенты находятся в центре экрана даже при изменении размеров.
2. Карту можно перемещать мышкой по экрану, при этом работает приближение и удаление. (И скрулом то же)

Автор: Platon 30.5.2008, 10:57
Конечно, здорово, что ты решил пойти дальше smile
Но 
1). Графика страшно выгядит, антиалиасы зря убрал 
2). Глючит прога. Если я жму с одного приближенного континента на другой, то выдление со старого не уходит и новый быделяется. В общем, посмотри.

Не по делу: Ты для нагрузки в либ засунул org-netbeans-api-visual.jar?
И исходники, всё-таки, выложил бы. У нас тут GPL smile

Автор: Gugle 30.5.2008, 11:40
Глюк там один нашел, вот и не выложил. smile
Сек. Сегодня положу.

Автор: Gugle 30.5.2008, 12:58
Выкладываю. Чето только у меня при перерисовки моргать начало. Не сильно, но раньше небыло.
Цитата

Графика страшно выгядит, антиалиасы зря убрал 

Сделал
Цитата

Глючит прога. Если я жму с одного приближенного континента на другой, то выдление со старого не уходит и новый быделяется. В общем, посмотри.

Просто не хотел что бы карта уезжала. Ну да ладно. Поправил. Кстати, при DoubleClik глючит. Хотя решение простое. Ловить его. smile
Цитата

Ты для нагрузки в либ засунул org-netbeans-api-visual.jar

Случайно попала.

Откомпиленные файлы в предидущем посте заменил.
Тут исходники.

Автор: Gugle 17.6.2008, 11:23
Есть какя нить альтернатива 
Код

Polygon(int[] xpoints, int[] ypoints, int npoints)?

Надо что нить похожее на:
Код

Polygon(double[] xpoints, double[] ypoints, int npoints)

Автор: Platon 17.6.2008, 12:06
Gugle, я тебя не понимаю. Мы, в большинстве своём, с полигонами и имеем дело.

Добавлено через 3 минуты и 51 секунду
Вот, к примеру, код из моего учебного пособия со звездой.

Код

private static Shape buildStar(int w) {
        GeneralPath shape = new GeneralPath();
        shape.moveTo(w/2, 0);
        double dAngle = 2*Math.PI/5;
        double outerRadius = w/2;
        double innerRadius = outerRadius/2;
        for (int i = 0; i &lt; 5; i++) {
            shape.lineTo(Math.cos(dAngle*i)*outerRadius, Math.sin(dAngle*i)*outerRadius);
            shape.lineTo(Math.cos(dAngle*i + dAngle/2)*innerRadius, Math.sin(dAngle*i + dAngle/2)*innerRadius);
        }
        shape.closePath();
        return shape;
    }

Автор: Gugle 17.6.2008, 12:42
ыыы... слона то мы и не заметили. smile
спс

Автор: Gugle 14.4.2009, 16:38
up

Можно ли сделать фигуру прозрачной? С наскоку не получилось. Пошел читать доки, но может тут быстрее ответят?

Автор: powerOn 14.4.2009, 19:07
Модератор: Gugle, идин топик - один вопрос. Создай новую тему и спрашивай там.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)