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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SceneGraph: введение, Для тех, кто любит на досуге повозиться 
:(
    Опции темы
Platon
Дата 10.4.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Здравствуйте, уважаемые.

В виду последних событий, мне придется основательно познакомиться с библиотекой SceneGraph, примеры которой можно найти здесь.
Библиотека замечательная, и обладает неслабым потенциалом, к слову, ее используют SwingLabs и JavaFX.

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

Это сообщение отредактировал(а) Platon - 10.4.2008, 15:03
PM MAIL ICQ   Вверх
cube
Дата 10.4.2008, 16:03 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Очень интересно! Выкладывай!
PM MAIL   Вверх
Platon
Дата 11.4.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

Обоснование выбора 
В начале графического пути я делал все вещи самостоятельно, это и программка Фигурки, Вырезание лобзиком, Танчики, Шахматы (все игрушки выложены на форуме) – вся графическая часть этого была выполнена собственноручно, со временем я стал задумываться, а неплохо было бы вращать композицию объектов одновременно + своя внутренняя система координат + здорово было бы если бы события на графических объектах обрабатывались как в компонентах Swing, AWT и т.д. По знакомству с QT, я знал, что там разработан замечательный framework (дожил, даже не знаю, как обзывать по-русски) The Graphics View Framework, Первая мысль была использовать Jambi, загвоздка заключается в том, что Jambi нужно или купить, или разрабатывать некоммерческие приложения + идея о pure java заставила отклонить этот вариант. При первой острой необходимости я стал искать подходящую библиотеку в конце поиска остановился на 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 рисовать не буду. Я позволю себе начать с чуть более сложного. Интересные примеры можно найти на сайте разработчиков
Приложение демонстрирует работу по обработке событий мыши, перетаскивания, поворота фигуры.

Код

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));


Библиотека версии 0.6 лежит здесь

Это сообщение отредактировал(а) Platon - 18.4.2008, 10:52
PM MAIL ICQ   Вверх
1024
Дата 12.4.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у тебя есть что-то готовое посложней разноцветных шариков?
PM MAIL   Вверх
Platon
Дата 15.4.2008, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Решил дополнить свой первый пример.

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

Код с рапиды

Это сообщение отредактировал(а) Platon - 18.4.2008, 10:42
PM MAIL ICQ   Вверх
Platon
Дата 17.4.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Попробуем оживить дискуссию. Подготовил еще 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);
}


Весь Исходный код здесь.

Это сообщение отредактировал(а) Platon - 18.4.2008, 10:48
PM MAIL ICQ   Вверх
Platon
Дата 17.4.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

user posted image
user posted image
user posted image

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

Это сообщение отредактировал(а) Platon - 18.4.2008, 10:51
PM MAIL ICQ   Вверх
1024
Дата 17.4.2008, 11:37 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



никому не интересен твой небольшой опыт (как ты сам сказал). Тем более если надо какой-то пароль.

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

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


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

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



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


Эксперт
***


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

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



Знать бы что стоящее еще сделать. С идеями проблемы :(
PM MAIL ICQ   Вверх
1024
Дата 21.4.2008, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

из непрактичного но наглядного можно взять какую-то классическую игрушку типа Tetris, морской бой, Inviders или Breakout
PM MAIL   Вверх
Platon
Дата 5.5.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Здравствуйте, уважаемые.

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

Карта мира.

user posted image
user posted image

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

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

Это сообщение отредактировал(а) Platon - 6.5.2008, 05:53

Присоединённый файл ( Кол-во скачиваний: 50 )
Присоединённый файл  export.rar 349,28 Kb
PM MAIL ICQ   Вверх
Platon
Дата 6.5.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вижу пятнадцатерых скачавших и ниодного комментария.

Это сообщение отредактировал(а) Platon - 8.5.2008, 08:15
PM MAIL ICQ   Вверх
Gugle
Дата 8.5.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



16 скачиваний. smile

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

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

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

Надеюсь ты незабросишь изучение.
PM MAIL   Вверх
Platon
Дата 8.5.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Слава Богу, хоть 1 спасительный комментарий. Не заброшу в любом случае, я к этому неровно дышу и попытки делать такое предпринимаю давно.
PM MAIL ICQ   Вверх
Asal
Дата 15.5.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А я вот камушАк решил бросить в твой АгАрОд  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 


--------------------
PM MAIL ICQ   Вверх
Platon
Дата 15.5.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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

Вижу разницу только в "lib/Scenario-0.6.jar;", ";" здесь существенна, помнится мне что она добавляет путь "", т.е. грубо говоря в class path добавляется текущая папка.
PM MAIL ICQ   Вверх
Asal
Дата 15.5.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не, не пахит. вроде всяк попробывал  smile 


--------------------
PM MAIL ICQ   Вверх
Gugle
Дата 16.5.2008, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Такс... С поворотами и перемещениями разобрался.
Начал смотреть на движение объектов.

Кстати, модель для координат фигур хорошая. Надо бы ее только закоментить.
PM MAIL   Вверх
Platon
Дата 16.5.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  src.rar 6,21 Kb
PM MAIL ICQ   Вверх
Gugle
Дата 16.5.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Какой IDA пользуешься?

Добавлено через 52 секунды
Тфу... IDE
PM MAIL   Вверх
Platon
Дата 16.5.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А без разницы. там нет IDE зависимых компонентов
PM MAIL ICQ   Вверх
Gugle
Дата 16.5.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



smile Эт я в курсе. просто интересно какой ты пользуешься.
PM MAIL   Вверх
Gugle
Дата 21.5.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И наконец появился вопросик.
В 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());
}

Не могу понять - зачем?
PM MAIL   Вверх
Platon
Дата 21.5.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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

Это сообщение отредактировал(а) Platon - 21.5.2008, 13:11
PM MAIL ICQ   Вверх
Gugle
Дата 30.5.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Это сообщение отредактировал(а) Gugle - 30.5.2008, 12:56

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  MapTestv.rar 373,70 Kb
PM MAIL   Вверх
Platon
Дата 30.5.2008, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

Не по делу: Ты для нагрузки в либ засунул org-netbeans-api-visual.jar?
И исходники, всё-таки, выложил бы. У нас тут GPL smile
PM MAIL ICQ   Вверх
Gugle
Дата 30.5.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Глюк там один нашел, вот и не выложил. smile
Сек. Сегодня положу.
PM MAIL   Вверх
Gugle
Дата 30.5.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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

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

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

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

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

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

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  srs.rar 18,14 Kb
PM MAIL   Вверх
Gugle
Дата 17.6.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть какя нить альтернатива 
Код

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

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

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

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


Эксперт
***


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

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



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;
    }

PM MAIL ICQ   Вверх
Gugle
Дата 17.6.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ыыы... слона то мы и не заметили. smile
спс
PM MAIL   Вверх
Gugle
Дата 14.4.2009, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



up

Можно ли сделать фигуру прозрачной? С наскоку не получилось. Пошел читать доки, но может тут быстрее ответят?
PM MAIL   Вверх
powerOn
Дата 14.4.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



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

Это сообщение отредактировал(а) powerOn - 14.4.2009, 19:20


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1450 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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