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

, вобщем передвижение на север, это передвижение как бы в даль, или от монитора, на ЮГ соответственно к монитору.
Как производится ращет проекций: К примеру происходит перемещение на север, и к примеру ращитывам координаты для
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(); } }
|