Languages
[Edit]
PL

JavaScript - jak u┼╝y─ç metody Monte Carlo do obliczenia liczby pi?

0 points
Created by:
Dirask JS Member
3460

Za pomoc─ů JavaScript mo┼╝na obliczy─ç pole powierzchni (ca┼éka oznaczona) w nast─Öpuj─ůcy spos├│b.

1. Przykład obliczenia pola powierzchni koła

G┼é├│wn─ů ide─ů tej metody jest:

  1. du┼╝a ilo┼Ť─ç losowych┬ápunkt├│w
  2. sprawdzanie, czy ka┼╝dy nast─Öpny punkt znajduje si─Ö wewn─ůtrz okr─Ögu, czy nie,
  3. obliczenie wsp├│┼éczynnika, dziel─ůc liczb─Ö punkt├│w wewn─ůtrz okr─Ögu przez liczb─Ö punkt├│w na zewn─ůtrz,
  4. pomno┼╝enie wsp├│┼éczynnika przez pole powierzchni kwadratu - w ten spos├│b z proporcji mo┼╝na otrzyma─ç przybli┼╝on─ů warto┼Ť─ç pola┬ápowierzchni─Ö ko┼éa,
  5. użycie przekształconego wzoru pola powierzchni koła, aby obliczyć liczbę PI.

Uwaga:

Im d┼éu┼╝ej trwa symulacja, tym wyniki s─ů bardziej precyzyjne.

// ONLINE-RUNNER:browser;

<!doctype html>
<html>
<head>
  <style>

    #my-canvas { border: 1px solid gray; }

  </style>
  <script>

    function randomizePoint(range) {
        return range * (Math.random() - 0.5);
    }

    // Metoda, kt├│ra sprawdza czy punkt znajduje si─Ö wewn─ůtrz okr─Ögu 
    // o ┼Ťrodku w punkcie (0, 0).

    function checkCondition(circleRadius, pointX, pointY) {
    	var pointRadius = Math.sqrt(pointX * pointX + pointY * pointY);

      	if (pointRadius <= circleRadius) {
        	return true;
        }

      	return false;
    }

    window.Drawer = function(canvas) {
        var context = canvas.getContext('2d');

        var xCenter = canvas.width / 2;
        var yCenter = canvas.height / 2;

        this.clearCanvas = function() {
            context.clearRect(0, 0, canvas.width, canvas.height);
        };

        this.drawPoint = function(x, y, color) {

            var tmpX = Math.round(xCenter + x - 1);
            var tmpY = Math.round(yCenter + y - 1);

            context.strokeStyle = '#fff';
            context.fillStyle = color || '#000';

            context.fillRect(tmpX, tmpY, 2, 2);
        };

        this.drawCircle = function(x, y, radius) {

            var tmpX = Math.round(xCenter + x - 1);
            var tmpY = Math.round(yCenter + y - 1);

            context.lineWidth = 0.5;
            context.strokeStyle = '#ff0000';
            context.fillStyle = '#fff';

            context.beginPath();
            context.arc(tmpX, tmpY, radius, 0, 2 * Math.PI);
            context.stroke();
        };
    };

  </script>
</head>
<body>
  <canvas id="my-canvas" width="300" height="300"></canvas>
  <script>

    var canvas = document.querySelector('#my-canvas');

    var drawer = new Drawer(canvas);

    var squareArea = canvas.width * canvas.height;
    var circleRadius = 150;

    var squarePointsCount = 0;
    var circlePointsCount = 0;

    drawer.clearCanvas();
    drawer.drawCircle(0, 0, circleRadius);

    function makeIteration() {

        for(var i = 0; i < 100; ++i) {

          	 // losowe współrzędne z zakresu od -150 do +150
            var pointX = randomizePoint(canvas.width);
    	    var pointY = randomizePoint(canvas.height);

            if (checkCondition(circleRadius, pointX, pointY)) {
                drawer.drawPoint(pointX, pointY, 'red');

                circlePointsCount += 1;
            } else {
                drawer.drawPoint(pointX, pointY, 'silver');
            }

            squarePointsCount += 1;
        }

        // większa liczba iteracji zwiększa precyzję obliczeń 

        var randomPointsProportion = circlePointsCount / squarePointsCount;

      	var computatedCircleArea = randomPointsProportion * squareArea;
        var computatedPI = computatedCircleArea / (circleRadius * circleRadius);

      	var computationError = Math.abs(Math.PI - computatedPI);

        console.clear();

        console.log('Liczba PI:');
      	console.log(' Oczekiwana: ' + Math.PI);
      	console.log(' Obliczona: ' + computatedPI);
        console.log(' B┼é─ůd: ' + computationError);
    }

    setInterval(makeIteration, 100);

  </script>
</body>
</html>

Referencje

  1. Metoda Monte Carlo - Wikipedia
Native Advertising
­čÜÇ
Get your tech brand or product in front of software developers.
For more information Contact us
Dirask - we help you to
solve coding problems.
Ask question.

ÔŁĄ´ŞĆ­čĺ╗ ­čÖé

Join