NAME
Quiq::Math - Mathematische Funktionen
BASE CLASS
METHODS
Konstanten
pi() - Liefere PI
Synopsis
$pi = $class->pi;
Rundung
roundTo() - Runde Zahl auf n Nachkommastellen
Synopsis
$y = $class->roundTo($x,$n);
$y = $class->roundTo($x,$n,$normalize);
Description
Runde $x auf $n Nachkommastellen und liefere das Resultat zurück.
Ist $normalize "wahr", wird die Zahl nach der Rundung mit normalizeNumber() normalisiert.
Bei $n > 0 rundet die Methode mittels
$y = sprintf '%.*f',$n,$x;
bei $n == 0 mittels roundToInt().
roundToInt() - Runde Zahl zu Ganzer Zahl (Integer)
Synopsis
$n = $class->roundToInt($x);
Description
Runde Zahl $x zu ganzer Zahl und liefere das Resultat zurück, nach folgender Regel:
Für Nachkommastellen < .5 runde ab, für Nachkommastellen >= .5 runde auf. Für negative $x ist es umgekehrt.
Folgender Ansatz funktioniert nicht
$n = sprintf '%.0f',$x;
denn dieser gibt inkonsistente Ergebnisse
0.5 => 0
1.5 => 2
2.5 => 2
roundMinMax() - Runde Breichsgrenzen auf nächsten geeigneten Wert
Synopsis
($minRounded,$maxRounded) = $class->roundMinMax($min,$max);
Description
Die Methode rundet $min ab und $max auf, so dass geeignete Bereichsgrenzen für eine Diagrammskala entstehen.
Sind $min und $max gleich, schaffen wir einen künstlichen Bereich ($min-1,$max+1).
Die Rundungsstelle leitet sich aus der Größe des Bereichs $max-$min her.
Examples
8.53, 8.73 -> 8.5, 8.8
8.53, 8.53 -> 7, 10
Größter gemeinsamer Teiler
gcd() - Größter gemeinsamer Teiler
Synopsis
$gcd = $class->gcd($a,b);
Description
Berechne den größten gemeinsamen Teiler (greatest common divisor) der beiden natürlichen Zahlen $a und $b und liefere diesen zurück. Die Methode ist nach dem Euklidschen Algorithmus implementiert.
Bogenmaß
degreeToRad() - Wandele Grad in Bogenmaß (rad)
Synopsis
$rad = $class->degreeToRad($degree);
radToDegree() - Wandele Bogenmaß (rad) in Grad
Synopsis
$degree = $class->radToDegree($rad);
Geo-Koordinaten
geoMidpoint() - Mittelpunkt von Geo-Postionen
Synopsis
($latitude,$longitude) = $class->geoMidpoint(\@coordinates);
Arguments
- @coordinates
-
Array von Geo-Koordinaten. Eine einzelne Geo-Koordinate ist ein Tipel [$latitude,$logitude,$weight], wobei die Gewichtung $weight optional ist. Fehlt die Gewichtung, wird als Wert 1 angenommen.
Returns
Breite und Länge des geografischen Mittelpunkts
Description
Berechne den geografischen Mittelpunkt der Geo-Koordination (plus optionaler Gewichtung) und liefere diesen zurck.
Beschreibung des Alogrithmus siehe http://www.geomidpoint.com/example.html
geoToDegree() - Wandele Geo-Ortskoordinate in dezimale Gradangabe
Synopsis
$dezDeg = $class->geoToDegree($deg,$min,$sec,$dir);
Description
Wandele eine geographische Ortsangabe in Grad, Minuten, Sekunden, Himmelsrichtung in eine dezimale Gradzahl und liefere diese zurück.
Example
50 6 44 N -> 50.11222
50 6 44 S -> -50.11222
geoDistance() - Entfernung zw. zwei Punkten auf der Erdoberfäche
Synopsis
$km = $class->geoDistance($lat1,$lon1,$lat2,$lon2);
Description
Berechne die Entfernung zwischen den beiden Geokoordinaten ($lat1,$lon1) und (lat2,$lon2) und liefere die Distanz in Kilometern zurück. Die Angabe der Geokoordinaten ist in Grad.
Der Berechnung liegt die Formel zugrunde:
km = 1.852*60*180/pi*acos(
sin($lat1*pi/180)*sin($lat2*pi/180)+
cos($lat1*pi/180)*cos($lat2*pi/180)*cos(($lon2-$lon1)*pi/180)
)
See Also
Examples
Abstand zw. zwei Längengraden (359. und 360.) am Äquator:
sprintf '%.2f',Quiq::Math->geoDistance(0,359,0,360);
# -> 111.12
Abstand zw. zwei Längengraden am Pol:
Quiq::Math->geoDistance(90,359,90,360);
# -> 0
latitudeDistance() - Abstand zwischen zwei Längengraden
Synopsis
$km = $class->latitudeDistance($lat);
Description
Liefere den Abstand zwischen zwei Längengraden bei Breitengrad $lat. Die Methode ist eigentlich nicht nötig, da sie einen Spezialfall der Mehode geoDistance() behandelt. Die Formel stammt von Wilhelm Petersen.
Welt/Pixel-Koordinaten
valueToPixelFactor() - Umrechnungsfaktor Wertebereich in Pixelkoordinaten
Synopsis
$factor = $class->valueToPixelFactor($length,$min,$max)
Returns
Faktor
Description
Liefere den Faktor für die Umrechung von Wertebereich in Pixelkoordinaten. Die Werte werden transformiert auf einen Bildschirmabschnitt der Länge $length, dessen Randpunkte den Werten $min und $max entsprechen.
pixelToValueFactor() - Umrechnungsfaktor von Pixel in Wertebereich
Synopsis
$factor = $class->pixelToValueFactor($length,$min,$max);
Returns
Faktor
Description
Liefere den Faktor für die Umrechung von Pixel in Werte entlang eines Bildschirmabschnitts der Länge $length, dessen Randpunkt dem Werteberich $min und $max entsprechen.
valueToPixelX() - Transformiere Wert in X-Pixelkoordinate
Synopsis
$x = $class->valueToPixelX($width,$xMin,$xMax,$xVal);
Alias
valueToPixel()
Description
Transformiere Wert $xVal in eine Pixelkoordinate auf einer X-Pixelachse der Breite $width. Das Minimum des Wertebereichs ist $xMin und das Maximum ist $xMax. Die gelieferten Werte liegen im Bereich 0 .. $width-1.
valueToPixelY() - Transformiere Wert in Y-Pixelkoordinate
Synopsis
$y = $class->valueToPixelY($height,$yMin,$yMax,$yVal);
Description
Transformiere Wert $yVal in eine Pixelkoordinate auf einer Y-Pixelachse der Höhe $height. Das Minimum des Wertebereichs ist $yMin und das Maximum ist $yMax. Die gelieferten Werte liegen im Bereich $height-1 .. 0.
Interpolation
interpolate() - Ermittele Wert durch lineare Interpolation
Synopsis
$y = $class->interpolate($x0,$y0,$x1,$y1,$x);
Returns
Float
Description
Berechne durch lineare Interpolation den Wert y=f(x) zwischen den gegebenen Punkten y0=f(x0) und y1=f(x1) und liefere diesen zurück.
Siehe: http://de.wikipedia.org/wiki/Interpolation_%28Mathematik%29#Lineare_Interpolation
Zahlen
isNumber() - Prüfe, ob Skalar eine Zahl darstellt
Synopsis
$bool = $class->isNumber($str);
Spike Test
spikeValue() - Berechne Spike-Wert
Synopsis
$val = $class->spikeValue($v1,$v2,$v3,$t1,$t3);
Description
Berechnung gemäß der Mail von Wilhelm Petersen vom 2017-05-03:
$v = (abs($v2-($v3+$v1)/2)-abs(($v3-$v1)/2))/($t3/60-$t1/60);
Die Parameter $t1 und $t2 werden in Sekunden angeben, die Funktion rechnet jedoch in Minuten, daher die Division durch 60.
VERSION
1.132
AUTHOR
Frank Seitz, http://fseitz.de/
COPYRIGHT
Copyright (C) 2019 Frank Seitz
LICENSE
This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.