Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
- package ztp2;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Random;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- *
- * @author Piotr Biskup
- */
- public class Ellipsoid extends HttpServlet {
- private class Deffect {
- private double x;
- private double y;
- private double z;
- private double r;
- public Deffect(double x, double y, double z, double r) {
- this.x = x;
- this.y = y;
- this.z = z;
- this.r = r;
- }
- public boolean pointInsideSphere(double xp, double yp, double zp){
- if( ((xp-x)*(xp-x) + (yp-y)*(yp-y) + (zp-z)*(zp-z)) <= r*r ) return true;
- return false;
- }
- }
- private List<Deffect> deffects = new ArrayList<>();
- private double a;
- private double b;
- private double c;
- private double v;
- private double g;
- private static final int points = 10_000_000;
- private int pointInsideDeffects;
- private double realMass;
- /**
- * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
- * methods.
- *
- * @param request servlet request
- * @param response servlet response
- * @throws ServletException if a servlet-specific error occurs
- * @throws IOException if an I/O error occurs
- */
- protected void processRequest(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- try (PrintWriter out = response.getWriter()) {
- out.println(realMass);
- }
- pointInsideDeffects = 0;
- deffects.clear();
- }
- // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
- /**
- * Handles the HTTP <code>GET</code> method.
- *
- * @param request servlet request
- * @param response servlet response
- * @throws ServletException if a servlet-specific error occurs
- * @throws IOException if an I/O error occurs
- */
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- double x = Double.parseDouble(request.getParameter("x"));
- double y = Double.parseDouble(request.getParameter("y"));
- double z = Double.parseDouble(request.getParameter("z"));
- double r = Double.parseDouble(request.getParameter("r"));
- Deffect d = new Deffect(x,y,z,r);
- deffects.add(d);
- //processRequest(request, response);
- }
- /**
- * Handles the HTTP <code>POST</code> method.
- *
- * @param request servlet request
- * @param response servlet response
- * @throws ServletException if a servlet-specific error occurs
- * @throws IOException if an I/O error occurs
- */
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- a = Double.parseDouble(request.getParameter("a"));
- b = Double.parseDouble(request.getParameter("b"));
- c = Double.parseDouble(request.getParameter("c"));
- v = Double.parseDouble(request.getParameter("v"));
- g = Double.parseDouble(request.getParameter("g"));
- pointInsideDeffects = monteCarlo(points);
- double ellipsoideMass = v*(1.0 - (double)pointInsideDeffects/(double)points)*ellipsoideVolume();
- double deffectsMass = g*( (double)pointInsideDeffects/(double)points)*ellipsoideVolume();
- realMass = ellipsoideMass + deffectsMass;
- processRequest(request, response);
- }
- private boolean pointInsideEllipsoide(double xp, double yp, double zp){
- if( ((xp*xp)/(a*a) + (yp*yp)/(b*b) + (zp*zp)/(c*c)) <= 1.0 ) return true;
- return false;
- }
- private double generateVariable(double axis){
- Random random = new Random();
- int minus = random.nextInt(2);
- double a = random.nextDouble()*axis;
- if(minus == 1) a=a*(-1.0);
- return a;
- }
- private int monteCarlo(int n){
- int insidePoints = 0;
- for(int i =0;i<n; i++){
- double x = generateVariable(a);
- double y = generateVariable(b);
- double z = generateVariable(c);
- if(!pointInsideEllipsoide(x, y, z))
- i--;
- else{
- for(Deffect d: deffects){
- if(d.pointInsideSphere(x, y, z))
- {
- insidePoints++;
- break;
- }
- }
- }
- }
- return insidePoints;
- }
- private double ellipsoideVolume(){
- return (4.0/3.0)*Math.PI*a*b*c;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement