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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Java] Вращение геометрических фигур, ошибка в проге. 
:(
    Опции темы
tonchitos
Дата 15.12.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

У меня три фигуры (линия, квадрат, треугольн), они должны вращатся, каждую секунду должны меняццо координаты, для этого ипользую таймер.

Что не так:

Такое впечатление, что метод, меняющий координаты(step) - не ботает. Таймер работает, но по полнолуниям (когда закрываю метод, меняющий координаты комментариями).

Вот простите если сумбурно, наверно в какой нить ерунде дело, но меня заклинило - не вижу.

Код

import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Toolkit;

abstract class Geom_f
{
    int Rad_X;
    int Rad_Y;
    int angle;
    int speed;        // the speed of the rotation
    Color clr;
    
    public Geom_f(int Rad_X, int Rad_Y, 
          int angle, int speed, 
          Color clr)
    {
    this.Rad_X = Rad_X;
    this.Rad_Y = Rad_Y;
        this.angle = angle;
    this.speed = speed;
    this.clr=clr;
    }

    void step (int X_0, int Y_0, 
             int Col, int Pos, 
             int pixX[],int pixY[])
    {

    Pos+=speed;
    double angR = ((Pos*StrictMath.PI)/180); // Угловое положение в радианах

    if (Pos%360 == 0) 
    { 
        Pos = 0; 
        angR = 0;
    }    
    double Angle = 0;    // Угловое положение точки ломаной линии
    int buf;

    for(int i=0; i<Col; i++)
    { 
        buf = (int)StrictMath.cos(angR+Angle);        
        pixX[i] = (int) X_0+Rad_X*buf;

        buf = (int)StrictMath.sin(angR+Angle);
            pixY[i] = (int) Y_0+Rad_Y*buf;
        
        Angle+=(2*StrictMath.PI)/Col;
    }
    pixX[Col]=pixX[0];
    pixY[Col]=pixY[0];

    }
    
    abstract void draw(Graphics g);
    abstract void stir(Graphics g);
}


class Line extends Geom_f
{
    Graphics g;
    int pixX[]=new int[2];
    int pixY[]=new int[2];

    int Pos;

    public Line(int Rad_X, int Rad_Y, 
        int angle, 
        int speed, 
        Color clr )
    {
    super(Rad_X, Rad_Y,angle,speed,clr);
    Pos=angle;

    pixX[0] = 200-Rad_X;
    pixY[0] = 200-Rad_Y;
    pixX[1] = 200+Rad_X;
    pixY[1] = 200+Rad_Y;
     }

  

    public void draw(Graphics g)
    {
        g.setColor(clr);
    g.drawLine(pixX[0],pixY[0],pixX[1],pixY[1]);

    }

    public void stir (Graphics g)
    {
        g.setColor(Color.blue);
    g.drawLine(pixX[0],pixY[0],pixX[1],pixY[1]);

    }

}

// Класс квадрат
//
//

class Square extends Geom_f
{
    int pixX[] = new int[4];
    int pixY[] = new int[4];
    int Pos;

    public Square(int Rad_X, int Rad_Y, 
                 int angle, 
          int speed, 
          Color clr)
    {
    super(Rad_X, Rad_Y,angle,speed,clr);
    Pos=angle;
    pixX[0] = 400-Rad_X;
    pixY[0] = 600-Rad_Y;
    pixX[1] = 400+Rad_X;
    pixY[1] = 600-Rad_Y;
    pixX[2] = 400+Rad_X;
    pixY[2] = 600+Rad_Y;
    pixX[3] = 400-Rad_X;
    pixY[3] = 600+Rad_Y;
    }
    
    public void draw(Graphics g)
    {    g.setColor(clr);
    g.drawLine(pixX[0],pixY[0],pixX[1],pixY[1]);
    g.drawLine(pixX[1],pixY[1],pixX[2],pixY[2]);
    g.drawLine(pixX[2],pixY[2],pixX[3],pixY[3]);
    g.drawLine(pixX[3],pixY[3],pixX[0],pixY[0]);
    }
    
    public void stir (Graphics g)
    {        
        g.setColor(Color.blue);
    g.drawLine(pixX[0],pixY[0],pixX[1],pixY[1]);
    g.drawLine(pixX[1],pixY[1],pixX[2],pixY[2]);
    g.drawLine(pixX[2],pixY[2],pixX[3],pixY[3]);
    g.drawLine(pixX[3],pixY[3],pixX[0],pixY[0]);
    }

};

// Класс треугольник
//
//

class ThrAng extends Geom_f
{
    int pixX[] = new int[3];
    int pixY[] = new int[3];
    int Col;
    int Pos;
    
    public ThrAng(int Rad_X, int Rad_Y, 
                 int angle, 
          int speed, 
          Color clr )
    {
    super(Rad_X, Rad_Y,angle,speed,clr);
    
        Pos=angle;
    pixX[0] = 600-Rad_X;
    pixY[0] = 200-Rad_Y;
    pixX[1] = 600+Rad_X;
    pixY[1] = 200-Rad_Y;
    pixX[2] = 600;
    pixY[2] = 200+Rad_Y;


   }
    
    public void draw(Graphics g)
    {
        
        g.setColor(clr);
    g.drawLine(pixX[0],pixY[0],pixX[1],pixY[1]);
    g.drawLine(pixX[1],pixY[1],pixX[2],pixY[2]);
    g.drawLine(pixX[2],pixY[2],pixX[0],pixY[0]);
    }

    public void stir (Graphics g)
    {        
        g.setColor(Color.blue);
    g.drawLine(pixX[0],pixY[0],pixX[1],pixY[1]);
    g.drawLine(pixX[1],pixY[1],pixX[2],pixY[2]);
    g.drawLine(pixX[2],pixY[2],pixX[0],pixY[0]);
    }
};

public class NaslCl extends Frame
{
    Color clr=new Color(255,50,50);
    ThrAng TAng;
    Line lne;
    Square Sqr;
    Toolkit toolkit;
    Timer timer;
    Graphics g;
    public NaslCl()
    {
        super("Наследование классов");
        setSize(900, 800);
        setVisible(true);
    toolkit = Toolkit.getDefaultToolkit();
        timer = new Timer();
        timer.schedule(new RemindTask(),
                   0,        //initial delay
                   1*1000);  //subsequent rate
     TAng = new ThrAng(100,100,0,10,clr);
     lne = new Line(100,100,0,10,clr);
     Sqr = new Square(100,100,0,10,clr);

    }


    public void paint(Graphics g)
    {   
    setBackground(Color.blue);
    Color clr=new Color(255,50,50);
    g.setColor(clr);
    this.g=g;
    lne.draw (g);
    Sqr.draw (g);      
    TAng.draw(g);
    }
   
    class RemindTask extends TimerTask 
    {   
        public void run() 
    {        
        lne.step(200,200,2,lne.Pos,lne.pixX,lne.pixY);  

        toolkit.beep();     
    }

    }

       
   public static void main(String ar[])
    {
    new NaslCl();
    } 


   public boolean handleEvent(Event e)
   {
      switch(e.id)
      {
         case Event.WINDOW_DESTROY:
            dispose();
            System.exit(0);
            return true;
         default:
            return super.handleEvent(e);
      }
   }
}



M
zkv
Поставил правильную подсветку кода.


Это сообщение отредактировал(а) zkv - 15.12.2007, 21:04


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
zkv
Дата 16.12.2007, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Переместил из Центра помощи по просьбе tonchitos.
PM MAIL   Вверх
Real McCoy
Дата 16.12.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



tonchitos, 
В самых первых, я бы перенёс создание объектов TAng, lne, Sqr с начало констуктора после вызова super(), т.к. при создании в конструкторе RemindTask() у класса вызовется paint(), а эти объекты в тот момент ещё не будут существовать.

Во-вторых, после данного изменения в конце метода step() (вот на этом месте: pixX[Col] = pixX[0];) возникает java.lang.ArrayIndexOutOfBoundsException, причины которой, думаю, Вы сами сможете найти.
PM MAIL   Вверх
tonchitos
Дата 16.12.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Real McCoy, спасибо большое, это правда ляпсусы. 

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

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

Код

import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Toolkit;

abstract class Geom_f
{
    int Rad_X;
    int Rad_Y;
    int angle;
    int speed;        // the speed of the rotation
    Color clr;
    
    public Geom_f(int Rad_X, int Rad_Y, 
          int angle, int speed, 
          Color clr)
    {
    this.Rad_X = Rad_X;
    this.Rad_Y = Rad_Y;
        this.angle = angle;
    this.speed = speed;
    this.clr=clr;
    }

    void step (int X_0, int Y_0, 
             int Col, int Pos[], 
             int pixX[],int pixY[])
    {

    Pos[0]+=speed;
    double angR = ((Pos[0]*StrictMath.PI)/180); // Угловое положение в радианах

    if (Pos[0]%360 == 0) 
    { 
        Pos[0] = 0; 
        angR = 0;
    }    
    double Angle = 0;    // Угловое положение точки ломаной линии
    int buf;

    for(int i=0; i<Col; i++)
    { 
        buf = (int)StrictMath.cos(angR+Angle);        
        pixX[i] = (int) X_0+Rad_X*buf;

        buf = (int)StrictMath.sin(angR+Angle);
            pixY[i] = (int) Y_0+Rad_Y*buf;
        
        Angle+=(2*StrictMath.PI)/Col;
    }
    }
    
    abstract void draw(Graphics g);
}


class Line extends Geom_f
{
    Graphics g;
    int pixX[]=new int[2];
    int pixY[]=new int[2];

    int Pos[]=new int[1];

    public Line(int Rad_X, int Rad_Y, 
        int angle, 
        int speed, 
        Color clr )
    {
    super(Rad_X, Rad_Y,angle,speed,clr);
    Pos[0]=angle;

    pixX[0] = 200-Rad_X;
    pixY[0] = 200-Rad_Y;
    pixX[1] = 200+Rad_X;
    pixY[1] = 200+Rad_Y;
     }

    public void draw(Graphics g)
    {
        g.setColor(clr);
    g.drawLine(pixX[0],pixY[0],pixX[1],pixY[1]);

    }
}

// Класс квадрат
//

class Square extends Geom_f
{
    int pixX[] = new int[4];
    int pixY[] = new int[4];
    int Pos[]=new int[1];

    public Square(int Rad_X, int Rad_Y, 
                 int angle, 
          int speed, 
          Color clr)
    {
    super(Rad_X, Rad_Y,angle,speed,clr);
    Pos[0]=angle;
    pixX[0] = 400-Rad_X;
    pixY[0] = 600-Rad_Y;
    pixX[1] = 400+Rad_X;
    pixY[1] = 600-Rad_Y;
    pixX[2] = 400+Rad_X;
    pixY[2] = 600+Rad_Y;
    pixX[3] = 400-Rad_X;
    pixY[3] = 600+Rad_Y;
    }
    
    public void draw(Graphics g)
    {    g.setColor(clr);
    g.drawLine(pixX[0],pixY[0],pixX[1],pixY[1]);
    g.drawLine(pixX[1],pixY[1],pixX[2],pixY[2]);
    g.drawLine(pixX[2],pixY[2],pixX[3],pixY[3]);
    g.drawLine(pixX[3],pixY[3],pixX[0],pixY[0]);
    }

};

// Класс треугольник
//

class ThrAng extends Geom_f
{
    int pixX[] = new int[3];
    int pixY[] = new int[3];
    int Pos[]  = new int[1];
    
    public ThrAng(int Rad_X, int Rad_Y, 
                 int angle, 
          int speed, 
          Color clr )
    {
    super(Rad_X, Rad_Y,angle,speed,clr);
        Pos[0]=angle;
    pixX[0] = 600-Rad_X;
    pixY[0] = 200-Rad_Y;
    pixX[1] = 600+Rad_X;
    pixY[1] = 200-Rad_Y;
    pixX[2] = 600;
    pixY[2] = 200+Rad_Y;

   }
    
    public void draw(Graphics g)
    {
        
        g.setColor(clr);
    g.drawLine(pixX[0],pixY[0],pixX[1],pixY[1]);
    g.drawLine(pixX[1],pixY[1],pixX[2],pixY[2]);
    g.drawLine(pixX[2],pixY[2],pixX[0],pixY[0]);
    }

};

public class NaslCl extends Frame
{
    Color clr=new Color(255,50,50);
    ThrAng TAng;
    Line lne;
    Square Sqr;
    Toolkit toolkit;
    Timer timer;
    Graphics g;

    public NaslCl()
    {
        super("Наследование классов");
     lne =  new Line   (100,100,0,10,clr);
     Sqr =  new Square (100,100,0,10,clr);
     TAng = new ThrAng (100,100,0,10,clr);
        
    setSize(900, 800);
        setVisible(true);

    toolkit = Toolkit.getDefaultToolkit();
        timer = new Timer();
        timer.schedule(new RemindTask(),
                   0,        //initial delay
                   1*1000);  //subsequent rate

    }

    public void paint(Graphics g)
    {   
    setBackground(Color.blue);
    Color clr=new Color(255,50,50);
    g.setColor(clr);
    this.g=g;
    lne.draw (g);
    Sqr.draw (g);      
    TAng.draw(g);
    }
   
    class RemindTask extends TimerTask 
    {   
        public void run() 
    {        
        lne.step  (200,200,2,lne.Pos,lne.pixX,lne.pixY);  

    //    Sqr.step  (200,200,4,Sqr.Pos,Sqr.pixX,Sqr.pixY);  
    //    TAng.step (200,200,3,TAng.Pos,TAng.pixX,TAng.pixY);  

        toolkit.beep();     
    }

    }

   public static void main(String ar[])
    {
    new NaslCl();
    } 


   public boolean handleEvent(Event e)
   {
      switch(e.id)
      {
         case Event.WINDOW_DESTROY:
            dispose();
            System.exit(0);
            return true;
         default:
            return super.handleEvent(e);
      }
   }
}



Добавлено @ 18:20
Я закрыла пока комментариями вращение квадрата и треугольника.
Линия сразу превращается в точку, а (если открыть коммент) квадрат с треуг вообще исчезают.
Что не так... smile 

Это сообщение отредактировал(а) tonchitos - 16.12.2007, 18:21


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Real McCoy
Дата 16.12.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



tonchitos, 
у Вас draw() метод для объекта Line вызывается только когда Вы создаёте объект Вашего основного класса-контейнера (в его методе paint() явным образом). Поэтому линия отрисовывется (видимо с какими-то начальными нулевыми значениями), после чего больше не перерисовывается. Т.е. надо принудительно вызывать перерисовку линии после каждого пересчёта координат.
PM MAIL   Вверх
tonchitos
Дата 16.12.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Real McCoy

если вот добавлю setBackground(Color.red);
Код

public void run() 
{        
  setBackground(Color.red);
  toolkit.beep();     
}

вот тут я же не перерисовываю, однако будет мигать - красный - синий

то есть перерисовка происходит. 
дело видимо не в этом. 

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

Это сообщение отредактировал(а) LSD - 17.12.2007, 15:28


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Real McCoy
Дата 17.12.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



tonchitos, 
я Вас умоляю: оформляйте код так, чтобы его можно было читать! Я про обрамление кода тэгами разметки форума (над полем ввода справа кновочка "Код"), про отступы и выравнивание и про code conventions.

Ну вот, я добавил setBackground(Color.red); (хотя это неправильный подход, лучше уж repaint(); туда воткнуть) и линия через несколько циклов таймера рисуется горизонтально, а ещё через несколько циклов - вертикально. Между этими состояниями она пребывает в виде точки. Мой вывод: неправильно считаются или обновляются координаты. Тут уж Вам самостоятельно надо разобраться.

PM MAIL   Вверх
tonchitos
Дата 17.12.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



пасиб smile


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

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

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


 




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


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

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