Developer от Бога

DV

четверг, 6 июля 2017 г.

Java. Графики функций - продолжение

В предыдущем примере было рассмотрено графическое представление приложения. Сейчас приступим к алгоритмам.
Все вычисления будут происходить от центральной точки. Весь алгоритм привязан к центральной точке, смещение которой будет приводить к смещению всего графика.
В примере используется метод рисования линий drawLine(). В зависимости от математических функций - просчитываем две точки x1, x2, вернее одну x1, которая идет впереди, x2 всего лишь повторяет x1 но с опозданием на шаг (например для параболы: x1=1/x2=0; x1=4/x2=1; x1=9/x2=4). Все действия проходят через интерфейс ActionListener , который сообщает классу scale какая именно была нажата кнопка, и какое действие следовательно нужно применить.


public class eventbut implements ActionListener{

@Override
public void actionPerformed(ActionEvent arg) {

AbstractButton aButton = (AbstractButton) arg.getSource();
String s=aButton.getText();
scale.positioncenterscale(s);
Graph_26_02.repaintf();
}
}

Класс scale содержит основной алгоритм построения графиков и перемещения по графику.



  1. public class scale extends JPanel {
  2. static boolean line=false;
  3. static boolean parabola=false;
  4. static boolean hiperbola=false;
  5. static int centerx=400;
  6. static int centry=400;
  7. static int step=15;
  8. static int step_line=1;
  9. static int count_step=0;
  10. static int scale_func=100;
  11. public void paint(Graphics g){
  12. System.out.println(step_line);
  13. gradient_func(g);
  14. g.setColor(new Color(0,255,0));
  15. if(line)
  16. g.drawString("Line", 50, 50);
  17. if(parabola)
  18. g.drawString("Parabola", 50, 70);
  19. if(hiperbola)
  20. g.drawString("Hiperbolaa", 50, 90);
  21. scale_div(g);
  22. if(parabola)
  23. parabola (g);
  24. if(hiperbola)
  25. hiperbola (g);
  26. if(line)
  27. line(g);
  28. graph_border(g);
  29. } public static void scale_div(boolean arg){
  30. if(arg){
  31. step+=5;
  32. }
  33. else if (arg==false){
  34. step-=5;
  35. }}
  36. public static void reset(){
  37. centerx=400;
  38. centry=400;
  39. step=5;
  40. count_step=0;
  41. scale_func=100;
  42. }
  43. public static void positioncenterscale(String arg){
  44. switch(arg){
  45. case "zoom +":scale.scale_div(true);scale_func++;break;
  46. case "zoom -":scale.scale_div(false);scale_func--;break;
  47. case "<<":centerx+=step;break;
  48. case ">>":centerx-=step;break;
  49. case "top":centry+=step;break;
  50. case "down":centry-=step;break;
  51. case "vertex -":step_line+=5;break;
  52. case "vertex +":if(step_line>5)step_line-=5;break;
  53. case "reset":reset();break;
  54. case "Line":if(line==true)line=false;else line=true;break;
  55. case "Parabola":if(parabola==true)parabola=false;else parabola=true;break;
  56. case "Hiperbola":if(hiperbola==true)hiperbola=false;else hiperbola=true;break;
  57. }
  58. }
  59. public void gradient_func(Graphics g)
  60. { int gradient=20;
  61. for(int i=3;i<=797;i++)
  62. {
  63. gradient+=(i/6);
  64. g.setColor(new Color(gradient,gradient,gradient));
  65. g.drawLine(3,i,796,i);
  66. gradient=10;
  67. }
  68. }
  69. public void graph_border(Graphics g){
  70. g.setColor(new Color(255,255,255));
  71. g.drawLine(0,0,800,0);
  72. g.drawLine(0,0,0,800);
  73. g.drawLine(800,0,800,800);
  74. g.drawLine(0,800,800,800);
  75. g.setColor(new Color(190,190,190));
  76. g.drawLine(1,1,799,1);
  77. g.drawLine(1,1,1,799);
  78. g.drawLine(799,1,799,799);
  79. g.drawLine(1,799,799,799);
  80. g.setColor(new Color(0,0,0));
  81. }
  82. public void parabola (Graphics g){
  83. int x0=0;
  84. int y0=(x0*x0);
  85. int x1=1;
  86. int y1=x1*x1;
  87. g.setColor(new Color(255,150,150));
  88. for(;(centry-y1)>=0;)
  89. {g.drawLine(centerx+x0,centry-y0,centerx+x1,centry-y1);
  90. g.drawLine(centerx-x0,centry-y0,centerx-x1,centry-y1);
  91. x0=x1;
  92. y0=y1;
  93. x1+=step_line;
  94. y1=x1*x1/scale_func;}
  95. }
  96. public void hiperbola (Graphics g){
  97. int x0=0;
  98. int y0=(x0*x0*x0);
  99. int x1=1;
  100. int y1=x1*x1*x1;
  101. g.setColor(new Color(0,255,255));
  102. for(;(((centry-y1)>=0)||((centry+y1)<=800));)
  103. {g.drawLine(centerx+x0,centry-y0,centerx+x1,centry-y1);
  104. g.drawLine(centerx-x0,centry+y0,centerx-x1,centry+y1);
  105. x0=x1;
  106. y0=y1;
  107. x1+=step_line;
  108. y1=x1*x1*x1/(scale_func*30);}
  109. }
  110. public void line (Graphics g){
  111. int x0=0;
  112. int y0=x0;
  113. int x1=1;
  114. int y1=x1;
  115. g.setColor(new Color(255,200,255));
  116. for(int i=0;i<100;i++)
  117. {g.drawLine(centerx,centry,centerx+x1,centry-y1);
  118. g.drawLine(centerx,centry,centerx-x1,centry+y1);
  119. x0=x1;
  120. y0=y1;
  121. x1+=100;
  122. y1=x1;}
  123. }
  124. public void scale_div(Graphics g){
  125. if(step==0)
  126. step=1;
  127. g.drawLine(centerx,centry,centerx,0);
  128. for(int i=0; i<=(centry/step);i++){ g.drawLine(centerx-2,centry-count_step,centerx+2,centry-count_step);
  129. count_step+=step;
  130. }
  131. count_step=0;
  132. g.drawLine(centerx,centry,800,centry);
  133. for(int i=0; i<=((800-centerx)/step);i++){
  134. g.drawLine(centerx+count_step,centry-2,centerx+count_step,centry+2);
  135. count_step+=step;
  136. }
  137. count_step=0;
  138. g.drawLine(centerx,centry,centerx,800);
  139. for(int i=0; i<=((800-centry)/step);i++){
  140. g.drawLine(centerx-2,centry-count_step,centerx+2,centry-count_step);
  141. count_step-=step;
  142. }
  143. count_step=0;
  144. g.drawLine(centerx,centry,0,centry);//center-left
  145. for(int i=0; i<=(centerx/step);i++){
  146. g.drawLine(centerx+count_step,centry-2,centerx+count_step,centry+2);
  147. count_step-=step;
  148. }
  149. count_step=0;
  150. }
  151. }
  152.  

Комментариев нет:

Отправить комментарий