Versio

Windroos

Overzicht Reageren

Robin de Vries

Robin de Vries

07/12/2008 14:23:00
Quote Anchor link
Ik ben bezig met een weerwebsite die live hangt aan een weerstation. Ik zoek hierbij een windroos via de gd bibliotheek. Dus als ik de waarde 360 opgeef. dan gaat de wijzer naar het noorden... 180 zuid, etc..

ken iemand zo'n script?
 
PHP hulp

PHP hulp

25/05/2012 19:41:01
Gesponsorde koppelingen:
 
Arjan Kapteijn

Arjan Kapteijn

07/12/2008 14:27:00
Quote Anchor link
http://www.aditus.nu/jpgraph/windroses.php

JPGraph heeft ze, maar je kunt het ook redelijk eenvoudig zelf maken.
 
Riemer

Riemer

07/12/2008 14:27:00
Quote Anchor link
Je zou eens kunnen kijken naar de sinus en cosinus functies om Radians te converteren naar een Vector.
Geen nood, er is een deg2rad functie in PHP.
 
Robin de Vries

Robin de Vries

07/12/2008 14:30:00
Quote Anchor link
@Arjan, ik gebruik al JPGraph, alleen dit zit in de pro-versie...

@Riemer, ik ben niet zo goed in gd etc...
 
Riemer

Riemer

07/12/2008 14:41:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$X
= sin(deg2rad( $degrees)) * $length + $start_X;
$Y =-cos(deg2rad( $degrees)) * $length + $start_Y;
?>


Als je nu een lijntje tekent met de imageline() functie van $start_X en $start_Y naar $X en $Y, wijst deze naar de goeie richting ($degrees) met lengte $length met $start_X en $start_Y als begin posities.

Om er een functie van te maken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
/*
 * $image = de image resource
 * $color = de kleur van de lijn
 * $degrees = de graden waar de lijn heen moet wijzen
 * $length = lengte van de lijn
 * $start_X en start_Y start positie van de lijn
 */

function windroos( $image, $color, $degrees, $length, $start_X, $start_Y)
{

    $X = sin(deg2rad( $degrees)) * $length + $start_X;
    $Y =-cos(deg2rad( $degrees)) * $length + $start_Y;

    imageline( $image, $start_X, $start_Y, $X, $Y, $color);
}

?>

Kunnen wat fouten in zitten aangezien het al weer een tijdje is dat ik met PHP heb gewerkt :P

edit: er waren wat foutjes dus...
Gewijzigd op 01/01/1970 01:00:00 door Riemer
 
Robin de Vries

Robin de Vries

07/12/2008 17:09:00
Quote Anchor link
en hoe voer je deze functie uit? zou je het ietsje verder willen uitwerken?
 
Yorick17

yorick17

07/12/2008 20:11:00
Quote Anchor link
waarom zo moeilijk iedereen? Je kunt toch gewoon 4 afbeeldingen maken en aan de hand van de data bepaal je welk plaatje je laat zien. De vier plaatjes hangen natuurlijk af van hoe gedetailleerd je de windroos wilt maken
 
Nicoow Unknown

Nicoow Unknown

07/12/2008 21:00:00
Quote Anchor link
@yorick, Hoeveel windrichting heb jij?
ik kom toch echt op minimaal 8, maar dit zou een veel nettere oplossing wezen, en opzich kan je ook een pijl op een plaatje zetten, en die dan om z'n as laten draaien, alleen weet ik niet hoe je in php een hoek meegeeft.
Dan kan je namelijk met een simpele formule de juiste windrichting laten zien.
 
Riemer

Riemer

07/12/2008 21:12:00
Quote Anchor link
@Robin de Vries, ik ging er van uit dat je al enig verstand had van de GD library hoe je bijvoorbeeld een image kan maken en dergelijke.
Maar goed hier is een wat meer uitgebreider voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

//We maken hier een PNG file
header ("Content-type: image/png");

/*
 * $image = de image resource
 * $degrees = de graden waar de lijn heen moet wijzen
 * $length = lengte van de lijn
 * $start_X en start_Y start positie van de lijn
 * $color = de kleur van de lijn
 */

function windroos( $image, $degrees, $length, $start_X, $start_Y, $color)
{

    $X = sin(deg2rad( $degrees)) * $length + $start_X;
    $Y =-cos(deg2rad( $degrees)) * $length + $start_Y;

    imageline( $image, $start_X, $start_Y, $X, $Y, $color);
}


//Maak een image. de 50 en 50 zijn de hoogte en breedte van de image
$Image = imagecreatetruecolor( 50, 50);

//Achtergrond en voorgrond kleuren
$Background = imagecolorallocate( $Image, 255, 255, 255);
$Foreground = imagecolorallocate( $Image,   0,   0,   0);

//Vul de image met de achtergrond kleur
imagefill( $Image, 0, 0, $Background);

//Aanroep van de functie windroos
windroos( $Image, 50, 20, 25, 25, $Foreground); //We willen dat de functie kleurt op $Image, het is 50 graden gedraait, lengte is 10, de middenpunt is 25-25 en de kleur die de lijn moet hebben is $Foreground

//Dit laat het plaatje weergeven

ImagePNG( $Image);
ImageDestroy( $Image);

?>


Het is een apart php file die een PNG plaatje genereert. Je zou dan deze plaatje neer kunnen zetten in een ander document door de IMG tag te gebruiken zoals:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<img src="windroos.php" />

waar windroos.php de bovengenoemde php script is.

@yorick, denk eens een situatie in waarbij je een grote bereik wilt van richtingen en de lengte ook nog eens variabel kan zijn. Zal aardig wat plaatjes zijn. Verder, zo moeilijk is dit nou ook weer niet :)

@nico, in feite met die sin en cos functies van hierboven roteer ik de punt waar de lijn heen moet wijzen conform de aantal graden. Je zou het idd het bovenstaande kunnen uitbreiden om er een simpele pijl van te maken.
Gewijzigd op 01/01/1970 01:00:00 door Riemer
 
Nicoow Unknown

Nicoow Unknown

07/12/2008 21:47:00
Quote Anchor link
ik heb ooit met python een snelheidsmeter gemaakt, maar daar word is de hoek automatisch al een parameter.
Recht naar boven is nul, links om is -0.1 tot -179.9 en rechts om is 0 tot 180
Dus toen heb ik eerst een tabel met bepaalde hoeken gemaakt, en de daarbij behorende snelheid,
Daarna even een grafiekje getekend, en aan de hand daarvan een formule opgesteld om de hoek te bepalen aan de hand van de ingevoerde snelheid, maar volgens mij gaat dat met php toch iets anders als ik dit zo zie =þ
 
Riemer

Riemer

07/12/2008 23:24:00
Quote Anchor link
Dit is een beetje toegepaste S.O.S. Castoa (goniometrie).
Zover ik weet heeft PHP geen standaard functie om rotaties te maken, dus hier doe ik het handmatig.
Wat wij hier willen is de coördinaten(X,Y) van de eindpunt van een lijn die een bepaalde lengte heeft en een bepaalde hoek. De systeem die ik nu gebruik is dat 0 graden noord is, oost = 90 zuid = 180 en west = 270. Door de soscastoa trucjes toe te passen kunnen wij deze eindpunt bepalen en een lijn trekken tussen deze punt en de begin punt. de min in de "y = -cos" gedeelte is omdat er een ander coördinaat stelsel is in plaatjes, waarbij 0 boven is en hoogte-1 = de onderkant terwijl het andersom is wat je waarschijnlijk is geleerd bij wiskunde lessen.
 
Luc Zontrop

Luc Zontrop

08/12/2008 08:54:00
Quote Anchor link
Zoiets:
Voorbeeld
Laatste image: hier werd een q meegegeven van 360. (te groot)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
if (isset($_GET['q']) && is_numeric($_GET['q'])){
    $ana_value =$_GET['q'];
    if($ana_value>=0 && $ana_value<=359){
        header("Content-type: image/jpg");
        $bgImg = imageCreateFromJpeg("images/wind.jpg");      
        $black_alpha=imagecolorallocatealpha($bgImg, 0,0,0,30);
        $red = imagecolorallocatealpha($bgImg, 255, 0,0,20);
        
        $p= (($ana_value-90)*2);

        $x1 = round((cos(($p-20) * 3.14/360)*20)+165,0);  // punt 1 voor polygon
        $y1 = round((sin(($p-20) * 3.14/360)*20)+162,0);
        
        $x2 = round((cos(($p+20) * 3.14/360)*20)+165,0);  // punt 2 voor polygon
        $y2 = round((sin(($p+20) * 3.14/360)*20)+162,0);
        
        $x3 = round((cos($p * 3.14/360)*150)+165,0);         // punt 3 voor polygon
        $y3 = round((sin($p * 3.14/360)*150)+162,0);

        //array maken voor berekende polygon punten
        $values = array(
                   $x1,  $y1,  // Point 1 (x, y)  //wijzer coordinaten
                   $x2,  $y2, // Point 2 (x, y)
                   $x3,  $y3,  // Point 3 (x, y)
                   );
        $values_shadow = array(
                   $x1+1,  $y1+1,  // Point 1 (x, y)  //schaduw voor wijzer
                   $x2+1,  $y2+1, // Point 2 (x, y)
                   $x3+1,  $y3+1,  // Point 3 (x, y)
                   );

        // een rode wijzer tekenen
        imagefilledpolygon($bgImg, $values_shadow, 3, $black_alpha); // schaduw tekenen
        imagefilledpolygon($bgImg, $values, 3, $red); // de wijzer tekenen
        
        //laat plaatje zien

        Imagejpeg($bgImg,"",100);

        //en destroy het weer
        imagedestroy($bgImg);
        }
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Luc Zontrop
 
Riemer

Riemer

08/12/2008 09:49:00
Quote Anchor link
@Tumbler, 2xPI radians/360 graden wordt het zelfde behandeld als 0 radians/0 graden in sinus cosinus functies.

Verder waarom deze code?: $p= (($ana_value-90)*2); door de sin en cos om te draaien en een - te zetten voor de cos bereik je hetzelfde. Het is de omgekeerde-T superscript functie als je begrijpt wat ik bedoel.

Maar goed, misschien is het wat meer praktischer voor de topic starter ja.
Gewijzigd op 01/01/1970 01:00:00 door Riemer
 
Robin de Vries

Robin de Vries

08/12/2008 12:36:00
Quote Anchor link
@Tumbler, ziet er netjes uit. Heb je ook de extra benodigde bestanden?
 
Luc Zontrop

Luc Zontrop

08/12/2008 16:32:00
Quote Anchor link
http://users.telenet.be/tumbler/windroos.zip

@ riemer: kben geen wiskundeknobbel :)
Gewijzigd op 01/01/1970 01:00:00 door Luc Zontrop
 



Overzicht Reageren

Get Adobe Flash player