Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1. import javax.servlet.http.HttpServlet;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6. import java.util.ArrayList;
  7.  
  8. /**
  9. * @author Wojciech Jargieło
  10. * @version 1
  11. */
  12.  
  13. public class Ellipsoid extends HttpServlet {
  14.  
  15. private static final long serialVersionUID = 1L;
  16.  
  17. private ArrayList<Defect> defect = new ArrayList<Defect>();
  18. private double a = 0;
  19. private double b = 0;
  20. private double c = 0;
  21. private double g = 0;
  22. private double v = 0;
  23. private double x = 0;
  24. private double y = 0;
  25. private double z = 0;
  26. private double r = 0;
  27. private static final int n = 10000000;
  28.  
  29. @Override
  30. protected void doPost(HttpServletRequest request, HttpServletResponse res)
  31. throws IOException {
  32. res.setContentType("text/html;charset=UTF-8");
  33. PrintWriter writer = res.getWriter();
  34. double result;
  35.  
  36. a = Double.parseDouble(request.getParameter("a"));
  37. b = Double.parseDouble(request.getParameter("b"));
  38. c = Double.parseDouble(request.getParameter("c"));
  39. g = Double.parseDouble(request.getParameter("g"));
  40. v = Double.parseDouble(request.getParameter("v"));
  41.  
  42. result = monteCarlo(g, v);
  43.  
  44. writer.print(result);
  45. }
  46.  
  47. @Override
  48. protected void doGet(HttpServletRequest request, HttpServletResponse res) {
  49. x = Double.parseDouble(request.getParameter("x"));
  50. y = Double.parseDouble(request.getParameter("y"));
  51. z = Double.parseDouble(request.getParameter("z"));
  52. r = Double.parseDouble(request.getParameter("r"));
  53.  
  54. defect.add(new Defect(x, y, z, r));
  55. }
  56.  
  57. protected static class Defect {
  58.  
  59. private double x;
  60. private double y;
  61. private double z;
  62. private double r;
  63.  
  64. Defect(double x, double y, double z, double r) {
  65. this.setX(x);
  66. this.setY(y);
  67. this.setZ(z);
  68. this.setR(r);
  69. }
  70.  
  71. double getX() {
  72. return x;
  73. }
  74.  
  75. void setX(double x) {
  76. this.x = x;
  77. }
  78.  
  79. double getY() {
  80. return y;
  81. }
  82.  
  83. void setY(double y) {
  84. this.y = y;
  85. }
  86.  
  87. double getZ() {
  88. return z;
  89. }
  90.  
  91. void setZ(double z) {
  92. this.z = z;
  93. }
  94.  
  95. double getR() {
  96. return r;
  97. }
  98.  
  99. void setR(double r) {
  100. this.r = r;
  101. }
  102. }
  103.  
  104. /**
  105. * Metoda pozwala na obliczenie masy Ellipsoidy z wykorzysatniem MC
  106. *
  107. * @param g double
  108. * @param v double
  109. * @return double
  110. */
  111. private double monteCarlo(double g, double v) {
  112.  
  113. int ellipsoidHits = 0;
  114. int defectHits = 0;
  115. int n = Ellipsoid.n;
  116. double volumeEllipsoid;
  117. double volumeDefects;
  118. double volumeCube = (2.0 * a) * (2.0 * b) * (2.0 * c);
  119. double x0;
  120. double y0;
  121. double z0;
  122. double mass;
  123.  
  124. for (int i = 0; i < n; i++) {
  125. x0 = getRandomNumber(-a, a);
  126. y0 = getRandomNumber(-b, b);
  127. z0 = getRandomNumber(-c, c);
  128.  
  129. if (inEllipsoid(x0, y0, z0)) {
  130. ellipsoidHits += 1;
  131. if (inDefect(x0, y0, z0)) {
  132. defectHits += 1;
  133. }
  134. }
  135. }
  136. volumeEllipsoid = volumeCube * ellipsoidHits / n;
  137. volumeDefects = volumeEllipsoid * defectHits / ellipsoidHits;
  138. mass = (volumeEllipsoid - volumeDefects) * v + volumeDefects * g;
  139. return mass;
  140. }
  141.  
  142. /**
  143. * losowanie liczb z przedziału ograniczonego przez prostopadłościan
  144. *
  145. * @param a double
  146. * @param b double
  147. * @return boolean
  148. */
  149. private double getRandomNumber(double a, double b) {
  150.  
  151. return Math.random() * (b - a) + a;
  152. }
  153.  
  154. /**
  155. * Sprawdzenie czy wylosowany pkt. znajduje się w defekcie
  156. *
  157. * @param x0 double
  158. * @param y0 double
  159. * @param z0 double
  160. * @return boolean
  161. */
  162. private boolean inDefect(double x0, double y0, double z0) {
  163.  
  164. for (Defect d : defect) {
  165. if (Math.sqrt((x0 - d.getX()) * (x0 - d.getX()) + (y0 - d.getY()) *
  166. (y0 - d.getY()) + (z0 - d.getZ()) * (z0 - d.getZ()))
  167. <= d.getR()) {
  168. return true;
  169. }
  170. }
  171. return false;
  172. }
  173.  
  174. /**
  175. * (x*x/a*a) + (y*y/b*b) + (z*z/c*c) <= 1
  176. * Sprawdzenie czy wylosowany pkt. znajduje się w Ellipsoidzie
  177. *
  178. * @param x0 double
  179. * @param y0 double
  180. * @param z0 double
  181. * @return boolean
  182. */
  183. private boolean inEllipsoid(double x0, double y0, double z0) {
  184.  
  185. if ((x0 * x0 / (a * a)) + ((y0 * y0) / (b * b)) + ((z0 * z0) / (c * c))
  186. <= 1) {
  187. return true;
  188. }
  189.  
  190. return false;
  191. }
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement