2016年9月14日水曜日

開発環境

開発環境

Pythonからはじめる数学入門 (Amit Saha (著)、黒川 利明 (翻訳)、オライリージャパン)の7章(初等解析問題を解く)、7.10(プログラミングチャレンジ)、問題7-4(曲線の長さを求める)をJavaScript取り組んでみる。

問題7-4(曲線の長さを求める)

コード(Emacs)

HTML5

<div id="graph0"></div>
走破距離: <span id="answer0"></span>
<br>
<label for="dx0">
  dx =
</label>
<input id="dx0" type="number" min="0" step="0.01" value="0.001">
<br>
<label for="a0">a = </label>
<input id="a0" type="number"  step="0.1" value="-5">
<label for="b0">b = </label>
<input id="b0" type="number"  step="0.1" value="10">

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.2/d3.min.js"></script>
<script src="array.js"></script>
<script src="sample4.js"></script>

JavaScript

(function () {
    'use strict';
    var fx,
        f1x,
        width = 600,
        height = 600,
        padding = 50,
        xmin = -10,
        xmax = 10,
        ymin = -250,
        ymax = 250,
        xscale,
        yscale,
        xaxis,
        yaxis,
        svg,
        div_graph = document.querySelector('#graph0'),
        span_answer = document.querySelector('#answer0'),
        input_dx = document.querySelector('#dx0'),
        input_a = document.querySelector('#a0'),
        input_b = document.querySelector('#b0'),
        inputs = [input_dx, input_a, input_b],
        getPoints,
        draw,
        integral,
        output;

    xscale = d3.scaleLinear()
        .domain([xmin, xmax])
        .range([padding, width - padding]);
    yscale = d3.scaleLinear()
        .domain([ymin, ymax])
        .range([height - padding, padding]);
    xaxis = d3.axisBottom().scale(xscale);
    yaxis = d3.axisLeft().scale(yscale);

    fx = function (x) {
        return 2 * Math.pow(x, 2) + 3 * x + 1;
    };
    f1x = function (x) {
        return 4 * x + 3;
    };
    getPoints = function () {
        return Array.range(-10, 10, 0.05).map(
            function (x) {
                return [x, fx(x)];
            });
    };
    draw = function () {
        var points = getPoints();

        div_graph.innerHTML = '';
        svg = d3.select('#graph0')
            .append('svg')
            .attr('width', width)
            .attr('height', height);

        svg.selectAll('circle')
            .data(points)
            .enter()
            .append('circle')
            .attr('cx', function (d) {
                return xscale(d[0]);
            })
            .attr('cy', function (d) {
                return yscale(d[1]);
            })
            .attr('r', 1)
            .attr('fill', 'blue');

        svg.append('g')
            .attr('transform', 'translate(0, ' + (height / 2) + ')')
            .call(xaxis);
        svg.append('g')
            .attr('transform', 'translate(' + (width / 2) + ', 0)')
            .call(yaxis);
    };
    integral = function (f, a, b, dx) {
        var answer = 0;

        Array.range(a, b, dx).forEach(function (x) {
            answer += dx * f(x);
        });
        return answer;
    };
    output = function () {
        var dx = parseFloat(input_dx.value),
            a = parseFloat(input_a.value),
            b = parseFloat(input_b.value);

        xmax = Math.max(Math.abs(a), Math.abs(b)) + 1;
        xmin = -xmax;

        draw();
        svg.append('circle')
            .attr('cx', xscale(a))
            .attr('cy', yscale(fx(a)))
            .attr('r', 5)
            .attr('fill', 'green');
        svg.append('circle')
            .attr('cx', xscale(b))
            .attr('cy', yscale(fx(b)))
            .attr('r', 5)
            .attr('fill', 'green');    span_answer.innerText =
            integral(function (x) {
                return Math.sqrt(1 + Math.pow(f1x(x), 2));
            }, a, b, dx);    
    };
    inputs.forEach(function (input) {
        input.onchange = output;
    });

    output();
}());
走破距離:

0 コメント:

コメントを投稿