Quiq::Math - Mathematische Funktionen
Quiq::Object
$m = $class->new;
Math-Objekt
Instantiiere ein Objekt der Klasse und liefere eine Referenz auf dieses Objekt zurück. Da die Klasse ausschließlich Klassenmethoden enthält, hat das Objekt nur die Funktion, eine abkürzende Aufrufschreibweise zu ermöglichen.
$pi = $this->pi;
$y = $this->roundTo($x,$n); $y = $this->roundTo($x,$n,$normalize);
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().
$n = $this->roundToInt($x);
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
($minRounded,$maxRounded) = $this->roundMinMax($min,$max);
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.
8.53, 8.73 -> 8.5, 8.8
8.53, 8.53 -> 7, 10
$gcd = $this->gcd($a,b);
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.
$rad = $this->degreeToRad($degree);
$degree = $this->radToDegree($rad);
($latitude,$longitude) = $this->geoMidpoint(\@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.
Breite und Länge des geografischen Mittelpunkts
Berechne den geografischen Mittelpunkt der Geo-Koordination (plus optionaler Gewichtung) und liefere diesen zurck.
Beschreibung des Alogrithmus siehe http://www.geomidpoint.com/example.html
$dezDeg = $this->geoToDegree($deg,$min,$sec,$dir);
Wandele eine geographische Ortsangabe in Grad, Minuten, Sekunden, Himmelsrichtung in eine dezimale Gradzahl und liefere diese zurück.
50 6 44 N -> 50.11222 50 6 44 S -> -50.11222
$km = $this->geoDistance($lat1,$lon1,$lat2,$lon2);
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) )
Prof. Dirk Reichhardt - Hinweise zur Berechnung von Abständen
Blog Martin Kompf - Entfernungsberechnung
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
$km = $this->latitudeDistance($lat);
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.
$factor = $this->valueToPixelFactor($length,$min,$max)
Faktor
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.
$factor = $this->pixelToValueFactor($length,$min,$max);
Faktor (Float)
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.
$x = $this->valueToPixelX($width,$xMin,$xMax,$xVal);
valueToPixel()
Transformiere Wert $xVal in eine Pixelkoordinate auf einer X-Pixelachse der Breite $width. Das Minimum des Wertebereichs ist $xMin, Maximum ist $xMax. Die gelieferten Werte liegen im Bereich 0 .. $width-1.
$y = $this->valueToPixelY($height,$yMin,$yMax,$yVal);
Transformiere Wert $yVal in eine Pixelkoordinate auf einer Y-Pixelachse der Höhe $height. Das Minimum des Wertebereichs ist $yMin, das Maximum $yMax. Die gelieferten Werte liegen im Bereich $height-1 .. 0. Diese Methode geht von einem Kartesischen Koordinatensystem, also von einem Ursprung unten links aus.
$y = $this->valueToPixelYTop($height,$yMin,$yMax,$yVal);
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.
$y = $this->interpolate($x0,$y0,$x1,$y1,$x);
Float
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
$bool = $this->isNumber($str);
$val = $this->spikeValue($v1,$v2,$v3,$t1,$t3);
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.
1.165
Frank Seitz, http://fseitz.de/
Copyright (C) 2019 Frank Seitz
This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Quiq, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Quiq
CPAN shell
perl -MCPAN -e shell install Quiq
For more information on module installation, please visit the detailed CPAN module installation guide.