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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать своё событие? проекция... 
:(
    Опции темы
America
  Дата 21.1.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня есть некоторые переменные A B и C... которые подвергаются изменению... 

Мне нужно отловить это изменение и изменить переменные D E и F.

Мне это нужно для того чтобы сделать проекцию движущегося обьекта, у него есть координаты... как тока они изменились... меня ем и проекцию. Как мне организовать своё событие?  smile 

выстрел(экранный) smile 

Код


import com.sun.j3d.utils.universe.SimpleUniverse;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.Transform3D;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Text2D;

import com.sun.j3d.utils.geometry.*;
import javax.vecmath.*;
import javax.media.j3d.LineStripArray;
import javax.media.j3d.TriangleFanArray;
import javax.media.j3d.Geometry;
import javax.media.j3d.Appearance;
import javax.media.j3d.Shape3D;
import javax.media.j3d.BoundingSphere;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import javax.media.j3d.LineStripArray;

import javax.swing.JFrame;
import java.lang.String;
import javax.media.j3d.Text3D;
import javax.media.j3d.Font3D;
import java.awt.Font;
import javax.media.j3d.FontExtrusion;


public class gem extends JFrame {

    
    
    

//parameters======================================================    
    float r = 0.3f;
    int N = 40;
    int s=10;
//yge ne parameters===============================================    
    
    
    
    
    
    
    
    private float level(int c){
        float m=0;
        
        if((c>1)||(c<s)){
            for(int i=2; i<=c;i++){
            m=m+((r-m)/3);
           }}
        if(c==s){m=r;}
        return m;
    }
    
    private float radius(int v){
        float re,p;
        p=level(v);
        re=(float)(Math.sqrt((r*r)-(p*p)));
        return re;
    }
//================================================================    
    private float getnX(int l,int n){
        double a = 2.0 * Math.PI / (N - 1) * n;
        
        float hj=(float) (radius(l) * Math.cos(a));
        return hj;
    }
    
    private float getnY(int l,int n){ 
        double a = 2.0 * Math.PI / (N - 1) * n;
        float hg=(float) (radius(l) * Math.sin(a));
        return hg;    
    }
//=================================================================    
    private Point3f up(int e,int n){
        float x=getnX(e+1,n);
        float y=getnY(e+1,n);    
        float z=level(e+1);
        Point3f point=new Point3f(x,y,z);
        return point;
    }
    
    private Point3f down(int e,int n){
        float x=getnX(e-1,n);
        float y=getnY(e-1,n);    
        float z=level(e-1);
        Point3f point=new Point3f(x,y,z);
        return point;
    }
    
    private Point3f right(int e,int n){
        float x=getnX(e,n+1);
        float y=getnY(e,n+1);    
        float z=level(e);
        Point3f point=new Point3f(x,y,z);
        return point;
    }
    
    private Point3f left(int e,int n){
        float x=getnX(e,n-1);
        float y=getnY(e,n-1);    
        float z=level(e);
        Point3f point=new Point3f(x,y,z);
        return point;
    }
    
    private Point3f upright(int e,int n){
        float x=getnX(e+1,n+1);
        float y=getnY(e+1,n+1);    
        float z=level(e+1);
        Point3f point=new Point3f(x,y,z);
        return point;
    }
    
    private Point3f upleft(int e,int n){
        float x=getnX(e+1,n-1);
        float y=getnY(e+1,n-1);    
        float z=level(e+1);
        Point3f point=new Point3f(x,y,z);
        return point;
    }
    
    private Point3f downright(int e,int n){
        float x=getnX(e-1,n+1);
        float y=getnY(e-1,n+1);    
        float z=level(e-1);
        Point3f point=new Point3f(x,y,z);
        return point;
    }
    
    private Point3f downleft(int e,int n){
        float x=getnX(e-1,n-1);
        float y=getnY(e-1,n-1);    
        float z=level(e-1);
        Point3f point=new Point3f(x,y,z);
        return point;
    }
    
//==============================================================
    
    
    
    
    
    private Geometry approx(){
        LineStripArray tfa;
        int totalN=N*(19);
        Point3f coords[]=new Point3f[(s-2)*totalN];
        int stripCounts[]=new int[s-2];
          for(int t=0;t<=(s-3);t++){
              stripCounts[t]=totalN;
              }
        
        
        for(int e=2;e<s;e++){
        for(int n=0;n<N;n++){
        
        int k=n*19;
        int f=k+(e-2)*totalN;
        float x=getnX(e,n);
        float y=getnY(e,n);
        float z=level(e);
        
        coords[f+ 0]=new Point3f(up(e,n));
        coords[f+ 1]=new Point3f(upright(e,n));
        coords[f+ 2]=new Point3f(right(e,n));
        coords[f+ 3]=new Point3f(downright(e,n) );
        coords[f+ 4]=new Point3f(down(e,n));
        coords[f+ 5]=new Point3f(downleft(e,n));
        coords[f+ 6]=new Point3f(left(e,n));
        coords[f+ 7]=new Point3f(upleft(e,n));
        coords[f+ 8]=new Point3f(up(e,n));
        
        coords[f+9]=new Point3f(x,y,z);
        coords[f+10]=new Point3f(up(e,n));
        
        coords[f+11]=new Point3f(x,y,z);
        coords[f+12]=new Point3f(right(e,n));
    
        coords[f+13]=new Point3f(x,y,z);
        coords[f+14]=new Point3f(down(e,n));

        coords[f+15]=new Point3f(x,y,z);
        coords[f+16]=new Point3f(left(e,n));
        
        coords[f+17]=new Point3f(x,y,z);
        coords[f+18]=new Point3f(up(e,n));
        
    }        
 }        
    
        
        
        
        
        tfa = new LineStripArray((s-2)*totalN,
                LineStripArray.COORDINATES, stripCounts);
        tfa.setCoordinates(0, coords);
        
        return tfa;
    }    
    
Point3f GetPoint(int t){
        Point3f df=new Point3f();
        float x=(float)(r* Math.cos(2*Math.PI*t/N));
        float z=(float)( r*Math.sin(2*Math.PI*t/N));
        df.x=x;
        df.z=z;
        df.y=-0.5f;
        return df;    
}
//===================================================    
private Geometry getprojgeom(){
    LineStripArray tfa;

    int tN=(N+1);
    float w=0.8f,z=-0.4f;
    float a=0.3f,b=0.5f;
    int k[]={N+1};
    Point3f points[]=new Point3f[tN];

    for(int i=0;i<N;i++){
        points[i]=GetPoint(i);
    }
    points[N]=points[0];
    
    
    
    tfa=new LineStripArray(
         tN,LineStripArray.COORDINATES,k);
    tfa.setCoordinates(0, points);
    return tfa;



}

private Geometry getbanergeom(){    
    LineStripArray tfa;

    int tN=(4+1);
    int k[]={4+1};
    Point3f points[]=new Point3f[tN];
    float a=0.65f;
    float b=0.4f;

    points[0]=new Point3f(a,a,0);
    points[1]=new Point3f(b,a,0);
    points[2]=new Point3f(b,b,0);
    points[3]=new Point3f(a,b,0);
    points[4]=new Point3f(a,a,0);
    
    tfa=new LineStripArray(
         tN,LineStripArray.COORDINATES,k);
    tfa.setCoordinates(0, points);
    return tfa;
}
//======================================================
private String getString(int a,int b,int c){
         String ac=" ";
         String bc=" ";
         String cc=" ";
         
         if(a<0){a=-a;ac="-";}
         if(b<0){b=-b;bc="-";}
         if(c<0){c=-c;cc="-";}
         
         if(a<10)bc=" "+bc;
         if(b<10)cc=" "+cc;
         String s=ac+a+" "+bc+b+" "+cc+c;
return s;
}
//======================================================
public gem()
{
    BoundingSphere bounds= new BoundingSphere(new 
            Point3d(0.0, 0.0,0.0), 10.0);
    SimpleUniverse universe = new SimpleUniverse();

       BranchGroup group = new BranchGroup();
       TransformGroup TG= new TransformGroup();
       TransformGroup TG2= new TransformGroup();
       
          
       Appearance app= new Appearance();
       
       Shape3D shape=new Shape3D();
       Geometry geom=approx();
       shape.setAppearance(app);
       shape.setGeometry(geom);
       
       Shape3D projection=new Shape3D();
       projection.setAppearance(app);
       Geometry projgeom=getprojgeom();
       projection.setGeometry(projgeom);
       
       Shape3D baner=new Shape3D();
       baner.setAppearance(app);
       Geometry bgeom=getbanergeom();
       baner.setGeometry(bgeom);
       
     
       
    
        
       Shape3D line1 = new Text2D(getString(12,45,80), new Color3f(1f,
                1f, 1f), "Serif", 20, Font.BOLD);
       Shape3D line2 = new Text2D(getString(-5,20,0), new Color3f(1f,
                1f, 1f), "Serif", 20, Font.BOLD);
       Shape3D line3 = new Text2D(getString(11,66,7), new Color3f(1f,
                1f, 1f), "Serif", 20, Font.BOLD);
       
       Transform3D line1Translation = new Transform3D();
       Transform3D line2Translation = new Transform3D();
       Transform3D line3Translation = new Transform3D();
       
       line1Translation.setTranslation(new Vector3f(0.5f, 0.5f, 0f));
       line2Translation.setTranslation(new Vector3f(0.5f, 0.4f, 0f));
       line3Translation.setTranslation(new Vector3f(0.5f, 0.3f, 0f));
        
       TransformGroup line1TG = new TransformGroup(line1Translation);
       TransformGroup line2TG = new TransformGroup(line2Translation);
       TransformGroup line3TG = new TransformGroup(line3Translation);
       
       line1TG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       line2TG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       line3TG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        
        
        
       TG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
       TG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       MouseRotate mouseSpin = new MouseRotate();
       mouseSpin.setTransformGroup(TG);
       mouseSpin.setSchedulingBounds(bounds);
       
       TG.addChild(shape);
       group.addChild(TG);
       TG2.addChild(projection);
       group.addChild(TG2);
       
     
       line1TG.addChild(line1);
       line2TG.addChild(line2);
       line3TG.addChild(line3);
       
       group.addChild(line1TG);
       group.addChild(line2TG);
       group.addChild(line3TG);
      
       
       group.addChild(mouseSpin);
       universe.getViewingPlatform().setNominalViewingTransform();
       universe.addBranchGraph(group);

}

public static void main( String[] args ) {

   gem g=new gem();
   
   
}

} // end of the program


PM MAIL   Вверх
Dekker
Дата 21.1.2007, 22:32 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть такой вариант - использование JavaBeans событий.

шаг1. Для следует создать в качестве члена класса (т.е. поля) ссылку на объект класса PropertyChangeSupport из пакета java.beans (полное имя класса, с пакетом: java.beans.PropertyChangeSupport) и инициализировать его. Допустим, имя ссылки на объект класса PropertyChangeSupport будет messager.

шаг2. Допустим, у нас есть переменные (ссылки в случае не примитивных типов) А, В и С некоего класса AnyClass (или примитивного типа). В таком случае для установки их значений НЕ СТОИТ использывать оператор присваивания =. Следует создать методы: 

void setA( AnyClass newA )
{
    AnyClass oldA = A;
    A = newA;
    messager.firePropertyChange( new PropertyChangeEvent( this, "A", oldA, newA );
}

void setB( AnyClass newB )
{
    AnyClass oldB = B;
    B = newB;
    messager.firePropertyChange( new PropertyChangeEvent( this, "B", oldB, newB );
}

void setC( AnyClass newC )
{
    AnyClass oldC = C;
    C = newC;
    messager.firePropertyChange( new PropertyChangeEvent( this, "C", oldC, newC );
}
И использовать для установки значений ТОЛЬКО эти методы.

шаг3. Далее следует создать 3 класса, которые будут иметь возможность изменять значения переменных D, E & F. Каким образом - это Вам решать в зависимости от размера и сложности системы. Если класс HostClass небольшой, рекомендую использовать внутренние классы. Не рекомендую использовать анонимные классы в данном случае, так как это может затруднить читаемость программы при большом количестве сотворенных модификаций :)
Каждый из классов должен реализовать интерфейс PropertyChangeListener. Допустим, создадим классы AChangeHandler, BChangeHandler, CChangeHandler. Я рассмотрю AChangeHandler, внутренний класс HostClass. Остальные - аналогично.

Код

import java.beans.*;

public class HostClass {

    private PropertyChangeSupport messager;

    private AnyClass A;
    private AnyClass B;
    private AnyClass C;
...

    private class AChangeHandler implements PropertyChangeListener {
    
        public void propertyChange( PropertyChangeEvent e )
        {
            // алгоритм реакции на изменение переменной А
            // доп. инфо в е
        }
    } // AChangeHandler
...
} // HostClass



шаг4. Регистрация слушателей. Собственно, регистрация слушателей происходит в блоке, который исполняется до первого возможного изменения переменной при помощи метода set-. Вполне подходящим является конструктор. Итак,
Код

public class HostClass {

    private PropertyChangeSupport messager;

    public HostClass()
    {
        ...
        messeger.addPropertyChangeListener( new AChangeListener() );
        messeger.addPropertyChangeListener( new BChangeListener() );
        messeger.addPropertyChangeListener( new CChangeListener() );
        ...
    }

    private class APropertyChangeListener implements PropertyChangeListener {... }
    private class BPropertyChangeListener implements PropertyChangeListener {... }
    private class CPropertyChangeListener implements PropertyChangeListener {... }
}


В результате получаем цепочку:
setA->messeger->AChangeListener(instance)->propertyChange(PropertyChangeEvent)->
ВАША_ЛОГИКА_РЕАКЦИИ

Т.е., мы получили то, что хотели, а именно - адекватной реакции на изменение значения переменной  :)
PM MAIL   Вверх
_Y_
Дата 22.1.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А я бы попробовал объединить координаты и проэкцию в один обьект, в котором бы любой из методов setA, setB, setC (и т.п.) вызывал метод пересчета D, E, F.

И никаких событий smile 

Это сообщение отредактировал(а) _Y_ - 22.1.2007, 16:20


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


Новичок



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

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



Весь смысл в том, что устанавливать значения переменых (ссылок) нужно путем использования методов. В таком случае у Вас будет возможность устроить требуемую реакцию на изменение данных  smile 
PM MAIL   Вверх
SimpAlex
Дата 6.8.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Dekker, Огромное Спасибо)
PM MAIL   Вверх
jeank
Дата 7.8.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вообще есть такая вещь как шаблон Наблюдатель - Observer pattern. А в яве есть его реализация посредством реализации интерфейса Observer, Observble. С помощью этого лови любые изменения, какие хошь - переменные, объекты...
PM MAIL WWW   Вверх
frodo5
Дата 7.8.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Зачем огород городить? ни бины, ни обсервер тут не нужны. Просто создаешь класс с приватными полями под "отслеживаемые" переменные с сеттерами/геттерами. В сеттерах описываешь логику.
PM MAIL   Вверх
Старовъръ
Дата 25.8.2009, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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


 




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


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

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