##################################################################
# Modul fuer die Regressionsanalyse
# Letzte Aenderung: 06.01.2012
##################################################################
use POSIX qw /floor ceil/;
use Math::Trig;
use strict;
use warnings;

my $anzahlpunkte = 0;
my @regressionx  = ();
my @regressiony  = ();
my @regressionz  = ();
my ( $xmax, $ymax, $zmax );

$xmax = $ymax = $zmax = 0;

sub oeffneregression {
	my $i = 0;
	for ( $i = 0 ; $i <= 150 ; $i++ ) {
		$regressionx[$i] = 0;
		$regressiony[$i] = 0;
		$regressionz[$i] = 0;
	}
}

sub schreiberegression {
	my ( $x, $y, $z, $n ) = @_;
	$regressionx[$n] = $x;
	$regressiony[$n] = $y;
	$regressionz[$n] = $z;
	$xmax = max( $xmax, $x );
	$ymax = max( $ymax, $y );
	if ( istzahl($z) == 1 ) {
		$zmax = max( $zmax, $z );
	}
}

sub leseregression {
	my ( $stelle, $n ) = @_;
	if    ( $stelle eq "x" ) { return $regressionx[$n]; }
	elsif ( $stelle eq "y" ) { return $regressiony[$n]; }
	elsif ( $stelle eq "z" ) { return $regressionz[$n]; }
	else                     { return "ERROR"; }
}

sub schliesseregression {
	my ($wert) = @_;
	$anzahlpunkte = $wert;
}

sub regression {
	my ( $layer, $grad, $linienart, $linienstaerke, $farbe, $parameter ) = @_;

	my ( $xsum, $ysum, $i, $xavg, $yavg, $dx, $dy, $a, $b, $factor, $offset );

	$xsum = $ysum = $xavg = $yavg = $a = $b = 0;

	for ( $i = 1 ; $i <= $anzahlpunkte ; $i++ ) {
		$xsum = $xsum + $regressionx[$i];
		$ysum = $ysum + $regressiony[$i];
	}

	$xavg = $xsum / $anzahlpunkte;
	$yavg = $ysum / $anzahlpunkte;

	for ( $i = 1 ; $i <= $anzahlpunkte ; $i++ ) {
		$dx = $regressionx[$i] - $xavg;
		$dy = $regressiony[$i] - $yavg;
		$a  = $a + ( $dx * $dy );
		$b  = $b + ( $dx * $dx );
	}

	$factor = $a / $b;

	$offset = $yavg - $factor * $xavg;

	my $func = "";

	if ( $offset < 0 ) {
		$func = $factor . "*x-" . abs($offset);
	}
	else {
		$func = $factor . "*x+" . $offset;
	}

	graph( $layer, $func, 0, 0, "", $xmax, $ymax, "", $linienart,
		$linienstaerke, $farbe, $parameter . ",algebraic" );

}

1;

