Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Расположения вектора, при нелинейном перемещении, Не могу прощитать траекторию 
:(
    Опции темы
GIK
Дата 2.11.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


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

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



Всем добрього времени суток. Я хочу реализовать в аплете визуальный эффект движения трехмерных фигур. Для начала создал трехменрную систему координат, или три вектора направленные в разные сторону из одной точки. Передаижение возможно (пока) с помощью четырех кнопок "Передвижение на север" , "Передвижение на юг" , "Передвижение на запад" , "Передвижение на восток". Векторы перемещаются следующим образом: Начало всех векторов никуда не перемещается, вектор X (изначально направлен на восток) может перемещатся в разные стороны, вектор Y перемещается только на запад-восток (перемещение на север-ЮГ дает результат вращение вокруг своей оси), вектор Z направлен на ЮГ (как бы на экран монитора), этот вектор перемещается только на север-ЮГ.
Немного о полюсах smile , вобщем передвижение на север, это передвижение как бы в даль, или от монитора, на ЮГ соответственно к монитору. 
Как производится ращет проекций: К примеру происходит перемещение на север, и к примеру ращитывам координаты для X вектора. По нажатию на кнопке "Перемещение на север", проекция
(мнимая проекция) увеличивается на 1 (один пиксел), растояние вектора извесно (установил в 120), ращитывю проекцию к оси X окна браузера, беру длину вектора, возвожу в квадрат, вычитаю квадрат перемещения на север, итог квадрат проекции к X, но если вектор до этого был перемещен к примеру на запад, то проекция должна ращитыватся так:  квадрат длину вектора мину квадрат перемещения на запад (вектор X как бы поднимается от своей плоскости), итог квадрат катета, который находится на плоскости по X и Z. Теперь вычитаем квадрат перемещения на север, извлекааем из под корня и получаем гтовую проекцию к оси X

Проблема: Так вот представте теперь перемещение на север вектора Z, да есть готовая проекция к оси X окна браузера, она как раз равна этому перемещению, НО допусти произошло перемещение на западВосток, при этом вектор Z не изменяет координаты, а вот при последющем перемещение на северЮг, просто со значение этого передвижения уже не катит, так как происхлдит ИЗМЕНЕНИЕ НАПРАВЛЕНИЯ ВЕКТОРА оно равно углу, противолежащий катет которого равен значению передвижения на западВосток. Так вот ни этот угол, и как следствие проекция к плоскости (где изначкально лежали вектора X и Z) я не могу знать, или не хочу.........
Медитировал часа 2, не помогло, а влезать в книги по высшей математике, вообще неохота, потому что там и так намудренно всякого лишнего..........
Вот код на JAVA, истественно глючный.
Код

/*
<applet code="Gik3DGraphics.class" width=500 height=500> 
<param name="img" value="gaioz.jpg"> 
</applet>
*/
 

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
 

 public class Gik3DGraphics extends Applet{

 int Length_of_an_axis_x = 120; //они же гипотенузы :), в вычислении проекций 
 int Length_of_an_axis_y = 120;
 int Length_of_an_axis_z = 120;
 
 //for axis X
 int x_to_axis_x    = 120;      //енто начало, или точка ноль если хотите
 int Endx_to_axis_x = 120+120;  //енто, как нестранно конец отрезка 
 int y_to_axis_x    = 120+120;
 int Endy_to_axis_x = 120+120;   //Хреново, что вектор у направлен к уменьшению значения координат, ну неудобно млин.....  
   
 //for axis Y
 int x_to_axis_y    = 120;      
 int Endx_to_axis_y = 120;  
 int y_to_axis_y    = 120+120;
 int Endy_to_axis_y = 120;     
 
  //for axis Z
 int x_to_axis_z    = 120;      
 int Endx_to_axis_z = 120;  
 int y_to_axis_z    = 120+120;
 int Endy_to_axis_z = 120+120;     

 //Изменения  
 int ChangesForNortEndSouth=0; //Вот собственно и оно, ПОПИКСЕЛЬНОЕ ИЗМЕНЕНИЕ КООРДИНАТ, моя фича :)
 int ChangesForWestEndEast=0; 
  
 Button NorthButton, SouthButton, WestButton, EastButton; 
 
 ListenerForMovementOnNorth LisForMovOnNor; //Объекты принимающие координаты изменений (имена сокращенны до трек символов)
 ListenerForMovementOnSouth LisForMovOnSou;
 ListenerForMovementOnWest LisForMovOnWes;
 ListenerForMovementOnEast LisForMovOnEas;


 String mas1="NoClick", mas2="NoClick";

 public void init(){
  NorthButton = new Button("Movement on North"); 
  SouthButton = new Button("Movement on South"); 
  WestButton  = new Button("Movement on West"); 
  EastButton  = new Button("Movement on East");
                  
  LisForMovOnNor = new ListenerForMovementOnNorth(this); 
  LisForMovOnSou = new ListenerForMovementOnSouth(this); 
  LisForMovOnWes = new ListenerForMovementOnWest(this); 
  LisForMovOnEas = new ListenerForMovementOnEast(this); 
            
  setLayout(new FlowLayout(FlowLayout.RIGHT, 12,12));
           
  NorthButton.addActionListener(LisForMovOnNor);
  SouthButton.addActionListener(LisForMovOnSou);
  WestButton.addActionListener(LisForMovOnWes);
  EastButton.addActionListener(LisForMovOnEas);      
         
  add(NorthButton); add(SouthButton); add(WestButton); add(EastButton); 
 }  

 public void paint(Graphics g){
 //Все ращеты производилиь в LIstenerах, а именно Endы 
  g.setColor(new Color(12,12,12));
  g.drawLine(x_to_axis_x, y_to_axis_x, Endx_to_axis_x, Endy_to_axis_x);
  g.setColor(new Color(15,11,10));  
  g.drawLine(x_to_axis_y, y_to_axis_y, Endx_to_axis_y, Endy_to_axis_y);
  g.setColor(new Color(9,8,111)); 
  g.drawLine(x_to_axis_z, y_to_axis_z, Endx_to_axis_z, Endy_to_axis_z);
   
  g.drawString("rejection from a plane on north and south" + "=" + mas1, 210, 310);   
  g.drawString("rejection from a plane on west and east" + "=" + mas2, 210, 340);  
 }

}


 //Объект для обработки событий от "Movement on North"
 class ListenerForMovementOnNorth implements ActionListener{

  Gik3DGraphics G3DG;
  int ChangesForNortEndSouth;
  int ChangesForWestEndEast;
 
  int Length_of_an_axis_x;
  int Length_of_an_axis_y;
  int Length_of_an_axis_z;

  int Endx_to_axis_x=0;
  int Endy_to_axis_x=0; 
  int Endx_to_axis_y=0;
  int Endy_to_axis_y=0; 
  int Endx_to_axis_z=0;
  int Endy_to_axis_z=0; 
  
  static double forMath;
  
 public ListenerForMovementOnNorth(Gik3DGraphics G3DG){ 
 this.G3DG=G3DG;
                 
 }
 public void actionPerformed(ActionEvent evt){

 ChangesForNortEndSouth=G3DG.ChangesForNortEndSouth;
 ChangesForNortEndSouth++;
 G3DG.ChangesForNortEndSouth = ChangesForNortEndSouth;
 ChangesForWestEndEast = G3DG.ChangesForWestEndEast; //Используем значение, для вычислений сдесь
 Length_of_an_axis_x=G3DG.Length_of_an_axis_x;
 Length_of_an_axis_y=G3DG.Length_of_an_axis_y;
 Length_of_an_axis_z=G3DG.Length_of_an_axis_z;

 //for Vector X
 //Endx_to_axis_x принимает на время значение проекции.
 if(ChangesForNortEndSouth<120 && ChangesForNortEndSouth!=-120) //Если равен 120, то проекция дошла до предела (равна гипотенузе)
 { 
  Endx_to_axis_x = (Length_of_an_axis_x*Length_of_an_axis_x)-(ChangesForNortEndSouth*ChangesForNortEndSouth); 
  forMath = Math.sqrt((Endx_to_axis_x)-(ChangesForWestEndEast*ChangesForWestEndEast));
  Endx_to_axis_x=(int) forMath + 120; //Плюс начало координат

  Endy_to_axis_x =  (120+120) - ChangesForWestEndEast;
  G3DG.Endx_to_axis_x=Endx_to_axis_x; //Вычислили - всавили 
  G3DG.Endy_to_axis_x=Endy_to_axis_x; //Вычислили - всавили  
 } 
 
 //for Vector Z
 if(ChangesForNortEndSouth<120 && ChangesForNortEndSouth!=-120)
 {   
    Endx_to_axis_z = 120 + ChangesForNortEndSouth; 
    Endy_to_axis_z = (120+120) - ChangesForNortEndSouth; 
   
    G3DG.Endx_to_axis_z=Endx_to_axis_z; //Вычислили - всавили     
    G3DG.Endy_to_axis_z=Endy_to_axis_z;       
 } 

 G3DG.mas1 = "" + ChangesForNortEndSouth; 
 G3DG.mas2 = "" + ChangesForWestEndEast; 
 G3DG.repaint(); 
 }  
}


 //Объект для обработки событий от "Movement on South"
class ListenerForMovementOnSouth implements ActionListener{

  Gik3DGraphics G3DG;
  int ChangesForNortEndSouth;
  int ChangesForWestEndEast;
 
  int Length_of_an_axis_x;
  int Length_of_an_axis_y;
  int Length_of_an_axis_z;

  int Endx_to_axis_x=0;
  int Endy_to_axis_x=0; 
  int Endx_to_axis_y=0;
  int Endy_to_axis_y=0; 
  int Endx_to_axis_z=0;
  int Endy_to_axis_z=0; 
 
   static double forMath;   //Для получения double значения от квадратного корня
 
 public ListenerForMovementOnSouth(Gik3DGraphics G3DG){
 this.G3DG=G3DG;
 }
 public void actionPerformed(ActionEvent evt){ 
 //Сдесь получим все значения из объектов
  ChangesForNortEndSouth=G3DG.ChangesForNortEndSouth;
  ChangesForNortEndSouth--;
  G3DG.ChangesForNortEndSouth = ChangesForNortEndSouth;
  ChangesForWestEndEast=G3DG.ChangesForWestEndEast;
  Length_of_an_axis_x=G3DG.Length_of_an_axis_x;
  Length_of_an_axis_y=G3DG.Length_of_an_axis_y;
  Length_of_an_axis_z=G3DG.Length_of_an_axis_z; 

  //for Vektor X
if(ChangesForNortEndSouth!=120 && ChangesForWestEndEast!=120)

  Endx_to_axis_x = (Length_of_an_axis_x*Length_of_an_axis_x)-(ChangesForNortEndSouth*ChangesForNortEndSouth); 
  forMath = Math.sqrt((Endx_to_axis_x)-(ChangesForWestEndEast*ChangesForWestEndEast));   
  Endx_to_axis_x=(int) forMath +120;
  Endy_to_axis_x = (120+120)-ChangesForWestEndEast; //Вычет 
  
  G3DG.Endx_to_axis_x=Endx_to_axis_x; //Вычислили - всавили 
  G3DG.Endy_to_axis_x=Endy_to_axis_x; //Вычислили - всавили  
}

//Сдесь собствнно проблема
 //for Vector Z
 if(ChangesForNortEndSouth<=120 && ChangesForWestEndEast!=120) 
 {  
    Endx_to_axis_z = (Length_of_an_axis_z * Length_of_an_axis_z) - (ChangesForNortEndSouth * ChangesForNortEndSouth);
    Endx_to_axis_z = ((Length_of_an_axis_z * Length_of_an_axis_z) - (ChangesForWestEndEast * ChangesForWestEndEast)) - Endx_to_axis_z;
    forMath = Math.sqrt(Endx_to_axis_z);   
    Endx_to_axis_z = 120+ (int) forMath;
    Endy_to_axis_z=(120+120) - ChangesForWestEndEast; 
    G3DG.Endx_to_axis_z=Endx_to_axis_z; 
    G3DG.Endy_to_axis_z=Endy_to_axis_z;   
 }

  G3DG.mas1 = "" + ChangesForNortEndSouth; 
  G3DG.mas2 = "" + ChangesForWestEndEast;   
  G3DG.repaint(); 
 }  
}


//Объект для обработки событий от "Movement on West"
class ListenerForMovementOnWest implements ActionListener{
  Gik3DGraphics G3DG;
  int ChangesForNortEndSouth;
  int ChangesForWestEndEast;
 
  int Length_of_an_axis_x;
  int Length_of_an_axis_y;
  int Length_of_an_axis_z;

  int Endx_to_axis_x=0;
  int Endy_to_axis_x=0; 
  int Endx_to_axis_y=0;
  int Endy_to_axis_y=0; 
  int Endx_to_axis_z=0;
  int Endy_to_axis_z=0; 
  static double forMath;  
 
 public ListenerForMovementOnWest(Gik3DGraphics G3DG){
 this.G3DG=G3DG;
 }
 public void actionPerformed(ActionEvent evt){  
 ChangesForWestEndEast = G3DG.ChangesForWestEndEast;
 ChangesForWestEndEast++;
 G3DG.ChangesForWestEndEast=ChangesForWestEndEast;
 ChangesForNortEndSouth = G3DG.ChangesForNortEndSouth;
 Length_of_an_axis_x=G3DG.Length_of_an_axis_x;
 Length_of_an_axis_y=G3DG.Length_of_an_axis_y;

  //for Vektor X
if(ChangesForWestEndEast<120)
{
 Endx_to_axis_x = (Length_of_an_axis_x*Length_of_an_axis_x)-(ChangesForNortEndSouth*ChangesForNortEndSouth);
 forMath = Math.sqrt((Endx_to_axis_x)-(ChangesForWestEndEast*ChangesForWestEndEast));
 Endx_to_axis_x=(int) forMath+120;
 Endy_to_axis_x = (120+120)-G3DG.ChangesForWestEndEast; 
 G3DG.Endx_to_axis_x=Endx_to_axis_x; 
 G3DG.Endy_to_axis_x=Endy_to_axis_x; 
}else {
  ChangesForWestEndEast=0;     
}
 
 //for Vector Y
if(ChangesForWestEndEast<120 && ChangesForWestEndEast!=-120)
 {
  Endy_to_axis_y = (Length_of_an_axis_y*Length_of_an_axis_y)-(ChangesForWestEndEast*ChangesForWestEndEast);    
  forMath = Math.sqrt(Endy_to_axis_y); 
  Endy_to_axis_y = (120+120) - (int) forMath;

  Endx_to_axis_y = 120 - ChangesForWestEndEast; 
  G3DG.Endx_to_axis_y=Endx_to_axis_y; //Вычислили - всавили 
  G3DG.Endy_to_axis_y=Endy_to_axis_y; //Вычислили - всавили  
 } 
 
 G3DG.mas1 = "" + ChangesForNortEndSouth; 
 G3DG.mas2 = "" + ChangesForWestEndEast; 
 G3DG.repaint(); 
 }  
}

//Объект для обработки событий от "Movement on East"
class ListenerForMovementOnEast implements ActionListener{

   Gik3DGraphics G3DG;
  int ChangesForNortEndSouth;
  int ChangesForWestEndEast;
 
  int Length_of_an_axis_x;
  int Length_of_an_axis_y;
  int Length_of_an_axis_z;

  int Endx_to_axis_x=0;
  int Endy_to_axis_x=0; 
  int Endx_to_axis_y=0;
  int Endy_to_axis_y=0; 
  int Endx_to_axis_z=0;
  int Endy_to_axis_z=0; 

  static double forMath;
 public ListenerForMovementOnEast(Gik3DGraphics G3DG){
 this.G3DG=G3DG;
 }
 public void actionPerformed(ActionEvent evt){ 
 ChangesForWestEndEast = G3DG.ChangesForWestEndEast; 
 ChangesForWestEndEast--;                            
 G3DG.ChangesForWestEndEast=ChangesForWestEndEast;  
 ChangesForNortEndSouth = G3DG.ChangesForNortEndSouth; 
 Length_of_an_axis_x=G3DG.Length_of_an_axis_x;
 Length_of_an_axis_y=G3DG.Length_of_an_axis_y;


 if(ChangesForWestEndEast<120){        
 Endx_to_axis_x = (Length_of_an_axis_x*Length_of_an_axis_x) 
 -(ChangesForNortEndSouth*ChangesForNortEndSouth); //Квадрат длины вектора минус квадрат проекции
 forMath = Math.sqrt((Endx_to_axis_x)-(ChangesForWestEndEast*ChangesForWestEndEast));
 Endx_to_axis_x=(int) forMath+120;
 Endy_to_axis_x = (120+120)-G3DG.ChangesForWestEndEast; //Вычет 
 G3DG.Endx_to_axis_x=Endx_to_axis_x; //Вычислили - всавили 
 G3DG.Endy_to_axis_x=Endy_to_axis_x; //Вычислили - всавили  
}


//for Vector Y
if(ChangesForWestEndEast<120)
{
 Endy_to_axis_y = (Length_of_an_axis_y*Length_of_an_axis_y)-(ChangesForWestEndEast*ChangesForWestEndEast); //СТОЛБ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!, начало от точки "О" c координатой Y = 120+120
 forMath = Math.sqrt(Endy_to_axis_y); //Поскольку Y не изменяется при движении на север-юг, а вертится вокруг своей оси
 Endy_to_axis_y = (120+120) - (int) forMath;

  Endx_to_axis_y = 120 - ChangesForWestEndEast; 
  G3DG.Endx_to_axis_y=Endx_to_axis_y; //Вычислили - всавили 
  G3DG.Endy_to_axis_y=Endy_to_axis_y; //Вычислили - всавили  
  



 G3DG.mas1 = "" + ChangesForNortEndSouth; 
 G3DG.mas2 = "" + ChangesForWestEndEast; 
 G3DG.repaint(); 
 }  
}
 

 



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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