Windroos
ken iemand zo'n script?
http://www.aditus.nu/jpgraph/windroses.php
JPGraph heeft ze, maar je kunt het ook redelijk eenvoudig zelf maken.
JPGraph heeft ze, maar je kunt het ook redelijk eenvoudig zelf maken.
Geen nood, er is een deg2rad functie in PHP.
@Riemer, ik ben niet zo goed in gd etc...
Code (php)
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
}
?>
/*
* $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
en hoe voer je deze functie uit? zou je het ietsje verder willen uitwerken?
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
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.
Maar goed hier is een wat meer uitgebreider voorbeeld:
Code (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
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);
?>
//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:
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
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 =þ
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.
Voorbeeld
Laatste image: hier werd een q meegegeven van 360. (te groot)
Code (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
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);
}
}
?>
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
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
@Tumbler, ziet er netjes uit. Heb je ook de extra benodigde bestanden?
http://users.telenet.be/tumbler/windroos.zip
@ riemer: kben geen wiskundeknobbel :)
@ riemer: kben geen wiskundeknobbel :)
Gewijzigd op 01/01/1970 01:00:00 door Luc Zontrop