##############################################################
#Modul fuer kariertes Papier
#Letzte Aenderung: 12.08.2011
##############################################################
use POSIX qw /floor ceil/;
use Math::Trig;
use strict;
use warnings;

my $gittersetzen    = 0;
my $matheheftsetzen = 0;

sub setgitter {
	my ($wert) = @_;
	if ( $gittersetzen == 3 ) {
		if   ( $wert == 1 ) { $gittersetzen = $gittersetzen; }
		else                { $gittersetzen = $wert; }
	}
	else { $gittersetzen = $wert; }

}

sub getgitter { return $gittersetzen; }

sub setmatheheft {
	my ($wert) = @_;
	if ( $matheheftsetzen == 3 ) {
		if   ( $wert == 1 ) { $matheheftsetzen = $matheheftsetzen; }
		else                { $matheheftsetzen = $wert; }
	}
	else { $matheheftsetzen = $wert; }
	setgitter(2)

}

sub getmatheheft { return $matheheftsetzen; }

sub kariert {
	my (
		$layer,       $farbe,       $linienstaerke, $linienart,
		$xminkariert, $yminkariert, $xmaxkariert,   $ymaxkariert,
		$abstandx,    $dickx,       $ganzdickx,     $abstandy,
		$dicky,       $ganzdicky
	) = @_;
	my (
		$xminersatz,     $xmaxersatz,  $yminersatz,
		$ymaxersatz,     $dickersatzx, $ganzdickersatzx,
		$abstandxersatz, $dickersatzy, $ganzdickersatzy,
		$abstandyersatz
	);

	settexthier("");
	setgrossskalierung( $xmaxkariert - $xminkariert,
		$ymaxkariert - $yminkariert );

	setachsengraph( $xminkariert, $yminkariert, $xmaxkariert, $ymaxkariert );
	setmaxberechnung(0);

	if ( $abstandx == 0 ) {
		$abstandx = aufrunden( $xmaxkariert * 10000, 1 ) / 10000;
		$abstandx = schoenetabelle( $abstandx * 10000 ) / 10000;

	}
	if ( $abstandy == 0 ) {
		$abstandy = aufrunden( $ymaxkariert * 10000, 1 ) / 10000;
		$abstandy = schoenetabelle( $abstandy * 10000 ) / 10000;

	}
	if ( $dickx == 0 ) {
		$dickersatzx    = $abstandx;
		$abstandxersatz = 0;
	}
	else {
		$dickersatzx    = $dickx;
		$abstandxersatz = $abstandx;
	}
	if ( $dicky == 0 ) {
		$dickersatzy    = $abstandy;
		$abstandyersatz = 0;
	}
	else {
		$dickersatzy    = $dicky;
		$abstandyersatz = $abstandy;
	}

	$xminersatz = $xminkariert / $abstandx;
	$xmaxersatz = $xmaxkariert / $abstandx;
	$yminersatz = $yminkariert / $abstandy;
	$ymaxersatz = $ymaxkariert / $abstandy;

	paarohneminmax( getschnitt("x"), getschnitt("y") );
	paarohneminmax( $xminersatz,     $yminersatz );
	paarohneminmax( $xmaxersatz,     $ymaxersatz );
	schreibeinarray(
		$layer,
		sprintf(
"\\psgrid[xunit=%g, yunit=%g, gridwidth=%gpt, gridcolor=%s, griddots=0, gridlabels=0pt, subgriddiv=0, subgridwidth=0pt, subgridcolor=%s, subgriddots=0]%s%%",
			$abstandx, $abstandy, $linienstaerke,
			$farbe,    $farbe,    gettexthier()
		)
	);
	settexthier("");

	#Die zweite dicke Linie wird gezeichnet
	if ( $dickersatzx == 0 ) {
		$xminersatz = $xminkariert;
		$xmaxersatz = $xmaxkariert;
	}
	else {
		if ( $dickersatzx > $xmaxkariert ) {
			$dickersatzx = 0;
			$xminersatz  = $xminkariert;
			$xmaxersatz  = $xmaxkariert;
		}
		else {
			$xminersatz = $xminkariert / $dickersatzx;
			$xmaxersatz = $xmaxkariert / $dickersatzx;
		}
	}
	if ( $dickersatzy == 0 ) {
		$yminersatz = $yminkariert;
		$ymaxersatz = $ymaxkariert;
	}
	else {
		if ( $dickersatzy > $ymaxkariert ) {
			$dickersatzy = 0;
			$yminersatz  = $yminkariert;
			$ymaxersatz  = $ymaxkariert;
		}
		else {
			$yminersatz = $yminkariert / $dickersatzy;
			$ymaxersatz = $ymaxkariert / $dickersatzy;
		}
	}
	if ( ( $dickx != 0 ) || ( $dicky != 0 ) ) {
		drei(
			getschnitt("x"), getschnitt("y"),
			$xminersatz,     $yminersatz,
			$xmaxersatz,     $ymaxersatz
		);

		schreibeinarray(
			$layer,
			sprintf(
"\\psgrid[xunit=%g, yunit=%g, gridwidth=%gpt, gridcolor=%s!100, griddots=0, gridlabels=0pt, subgriddiv=0, subgridwidth=0pt, subgridcolor=%s,
 subgriddots=0]%s%% ",
				$dickersatzx, $dickersatzy, $linienstaerke * 2, $farbe, $farbe,
				gettexthier()
			)
		);

	}

	#	Die ganz dicke Linie wird gezeichnet
	if ( $ganzdickx == 0 ) {
		$ganzdickersatzx = $abstandx;
		$abstandxersatz  = 0;
	}
	else {
		$ganzdickersatzx = $ganzdickx;
		$abstandxersatz  = $abstandx;
	}
	if ( $ganzdicky == 0 ) {
		$ganzdickersatzy = $abstandy;
		$abstandyersatz  = 0;
	}
	else {
		$ganzdickersatzy = $ganzdicky;
		$abstandyersatz  = $abstandy;
	}
	if ( $ganzdickersatzx == 0 ) {
		$xminersatz = $xminkariert;
		$xmaxersatz = $xmaxkariert;
	}
	else {
		if ( $ganzdickersatzx > $xmaxkariert ) {
			$ganzdickersatzx = 0;
			$xminersatz      = $xminkariert;
			$xmaxersatz      = $xmaxkariert;
		}
		else {
			$xminersatz = $xminkariert / $ganzdickersatzx;
			$xmaxersatz = $xmaxkariert / $ganzdickersatzx;
		}
	}
	if ( $ganzdickersatzy == 0 ) {
		$yminersatz = $yminkariert;
		$ymaxersatz = $ymaxkariert;
	}
	else {
		if ( $ganzdickersatzy > $ymaxkariert ) {
			$ganzdickersatzy = 0;
			$yminersatz      = $yminkariert;
			$ymaxersatz      = $ymaxkariert;
		}
		else {
			$yminersatz = $yminkariert / $ganzdickersatzy;
			$ymaxersatz = $ymaxkariert / $ganzdickersatzy;
		}
	}
	if ( ( $ganzdickx != 0 ) || ( $ganzdicky != 0 ) ) {
		drei(
			getschnitt("x"), getschnitt("y"),
			$xminersatz,     $yminersatz,
			$xmaxersatz,     $ymaxersatz
		);
		schreibeinarray(
			$layer,
			sprintf(
"\\psgrid[xunit=%g, yunit=%g, gridwidth=%gpt, gridcolor=%s!100, griddots=0, gridlabels=0pt, subgriddiv=0, subgridwidth=0pt, subgridcolor=%s, subgriddots=0]%s%% ",
				$ganzdickersatzx, $ganzdickersatzy, $linienstaerke * 3,
				$farbe,           $farbe,           gettexthier()
			)
		);

	}
	setmaxberechnung(1);
	settexthier("");

	minmax(
		$xminkariert - $dickx,
		$yminkariert - $dicky,
		$xmaxkariert + $dickx,
		$ymaxkariert + $dicky
	);
	minmax(
		$xminkariert + $dickx,
		$yminkariert + $dicky,
		$xmaxkariert - $dickx,
		$ymaxkariert - $dicky
	);

}

sub grid {
	my (
		$layer,    $farbe,    $linienstaerke, $linienart,
		$xmingrid, $ymingrid, $xmaxgrid,      $ymaxgrid,
		$abstandx, $dickx,    $ganzdickx,     $abstandy,
		$dicky,    $ganzdicky
	) = @_;

	drei(
		getschnitt("x"),
		getschnitt("y"),
		$xmingrid / $abstandx,
		$ymingrid / $abstandy,
		$xmaxgrid / $abstandx,
		$ymaxgrid / $abstandy
	);
	setgrossskalierung( $xmaxgrid - $xmingrid, $ymaxgrid - $ymingrid );
	schreibeinarray(
		$layer,
		sprintf(
"\\psgrid[xunit=%g, yunit=%g, gridwidth=%gpt, gridcolor=%s, griddots=%g, gridlabels=0pt, gridlabelcolor=%s, subgriddiv=0, subgriddots=0]%s%% ",
			$abstandx, $abstandy, $linienstaerke, $farbe,
			$dickx,    $farbe,    gettexthier()
		)
	);
	settexthier("");

}

sub millimeterpapier {
	my ( $layer, $farbe, $xminheft, $yminheft, $xmaxheft, $ymaxheft ) = @_;
	kariert(
		$layer,    $farbe,    0.25, "solid", $xminheft, $yminheft,
		$xmaxheft, $ymaxheft, 0.1,  0.5,     1,         0.1,
		0.5,       1
	);
}

sub matheheft {
	my ( $layer, $farbe, $xminheft, $yminheft, $xmaxheft, $ymaxheft ) = @_;
	kariert(
		$layer,    $farbe,    0.5, "solid", $xminheft, $yminheft,
		$xmaxheft, $ymaxheft, 0.5, 0,       0,         0.5,
		0,         0
	);
}
1;

