fieldscatterex1.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    <?php // content="text/plain; charset=utf-8"
    require_once ('jpgraph/jpgraph.php');
    require_once ('jpgraph/jpgraph_scatter.php');

    $polex = 6;
    $poley = 40;

    function FldCallback($x,$y,$a) {
        GLOBAL $polex, $poley;
        $maxr = 3000;

        // Size and arrow size is constant
        $size="";
        $arrowsize="";

        // Since we have different scales we need the data points
        // to be of the same magnitude to give it a distance
        // interpretation.
        $x *= 10;

        // Colors gets colder the further out we go from the center
        $r = ($x-$polex*10)*($x-$polex*10)+($y-$poley)*($y-$poley);
        $f = $r/$maxr;
        if( $f > 1 ) $f=1;
        $red = floor((1-$f)*255);
        $blue = floor($f*255);
        $color = array($red,0,$blue);
        //echo "x=$x, y=$y, blue=$blue, red=$red<br>";
        return array($color,$size,$arrowsize);
    }

    // Create data for a simulated pseudo-magnetic radient field
    $datax = array();
    $datay = array();
    $angle = array();
    for($x=1; $x < 10; ++$x ) {
        for($y=10; $y<100; $y += 10) {
        $a = -1;
        if( $x==$polex && $y==$poley ) continue;
        if( $x==$polex ) {
            if( $y > $poley ) $a=90;
            else $a = 270;
        }
        if( $y==$poley ) {
            if( $x  > $polex ) $a=0;
            else  $a=180;
        }
        if( $a == -1 ) {
            $d1 = $y-$poley;
            $d2 = ($polex-$x)*20;
            if( $y < $poley ) $d2 *= -1;
            $h = sqrt($d1*$d1+$d2*$d2);
            $t = -$d2/$h;
            $ac = acos($t);
            if( $y < $poley ) $ac += M_PI;
            $a = $ac * 180/M_PI;
        }
        $datax[] = $x;
        $datay[] = $y;
        $angle[] = $a;
        }
    }

    // Setup the graph
    $graph = new Graph(300,200);
    $graph->SetScale("intlin",0,100,0,10);
    $graph->SetMarginColor('lightblue');

    // ..and titles
    $graph->title->Set("Field plot");

    // Setup the field plot
    $fp = new FieldPlot($datay,$datax,$angle);

    // Setup formatting callback
    $fp->SetCallback('FldCallback');

    // First size argument is length (in pixels of arrow)
    // Second size argument is roughly size of arrow. Arrow size is specified as
    // an integer in the range [0,9]
    $fp->arrow->SetSize(20,2);
    $fp->arrow->SetColor('navy');

    $graph->Add($fp);

    // .. and output
    $graph->Stroke();

    ?>