The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Quiq::Math - Mathematische Funktionen

BASE CLASS

Quiq::Object

METHODS

Konstruktor

new() - Instantiiere Objekt

Synopsis

  $m = $class->new;

Returns

Math-Objekt

Description

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.

Konstanten

pi() - Liefere PI

Synopsis

  $pi = $this->pi;

Rundung

roundTo() - Runde Zahl auf n Nachkommastellen

Synopsis

  $y = $this->roundTo($x,$n);
  $y = $this->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 = $this->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) = $this->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 = $this->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 = $this->degreeToRad($degree);

radToDegree() - Wandele Bogenmaß (rad) in Grad

Synopsis

  $degree = $this->radToDegree($rad);

Geo-Koordinaten

geoMidpoint() - Mittelpunkt von Geo-Postionen

Synopsis

  ($latitude,$longitude) = $this->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 zurück.

Beschreibung des Alogrithmus siehe http://www.geomidpoint.com/example.html

geoToDegree() - Wandele Geo-Ortskoordinate in dezimale Gradangabe

Synopsis

  $dezDeg = $this->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 = $this->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 = $this->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 = $this->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 = $this->pixelToValueFactor($length,$min,$max);

Returns

Faktor (Float)

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 = $this->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, Maximum ist $xMax. Die gelieferten Werte liegen im Bereich 0 .. $width-1.

valueToPixelY() - Transformiere Wert in Y-Pixelkoordinate

Synopsis

  $y = $this->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, 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.

valueToPixelYTop() - Transformiere Wert in Y-Pixelkoordinate

Synopsis

  $y = $this->valueToPixelYTop($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 = $this->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 = $this->isNumber($str);

Spike Test

spikeValue() - Berechne Spike-Wert

Synopsis

  $val = $this->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.191

AUTHOR

Frank Seitz, http://fseitz.de/

COPYRIGHT

Copyright (C) 2020 Frank Seitz

LICENSE

This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.