NAME

Quiq::Math - Mathematische Funktionen

BASE CLASS

Quiq::Object

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.151

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.