##################################################################
# Modul für Zeichenroutinen
#
# Letzte Aenderung: 12.01.2012
##################################################################
use POSIX qw /floor ceil/;
use Math::Trig;
use strict;
use warnings;

# Linie zeichnen zwischen zwei Punkten
sub linie {
	my ( $layer, $x1, $y1, $z1, $x2, $y2, $z2, $linienart, $linienstaerke,
		$farbe, $parameter, $pfeilart )
	  = @_;
	settexthier("");

	if ( $linienart ne "" ) {
		if (   ( istzahl($x1) == 1 )
			&& ( istzahl($y1) == 1 )
			&& ( istzahl($x2) == 1 )
			&& ( istzahl($y2) == 1 ) )
		{
			minmax( $x1 - 1, $y1 - 1, $x2 + 1, $y2 + 1 );
		}
	}

	my $pstricksersatz3d = get3dpstricks();
	my $pstricksersatz   = getpstricks();

	setachsengraph( $x1, $y1, $x1, $y1 );
	setachsengraph( $x2, $y2, $x2, $y2 );

	if ( istzahl($linienstaerke) == 1 ) {

		if ( $linienstaerke > 0 ) {
			if ( ( $z1 eq "" ) || ( $z2 eq "" ) ) {
				paar( $x1, $y1 );
				paar( $x2, $y2 );
				setpstricks(0);
				set3dpstricks(0);

			}
			else {
				tripel( $x1, $y1, $z1 );
				tripel( $x2, $y2, $z2 );
				setachsengraph3d( $x1, $y1, $z1, $x1, $y1, $z1 );
				setachsengraph3d( $x2, $y2, $z2, $x2, $y2, $z2 );

			}

			liniekopf( $layer, $linienart, $linienstaerke, $farbe, $parameter,
				$pfeilart, gettexthier() );

			settexthier("");
		}
	}
	else {
		if ( ( $z1 eq "" ) || ( $z2 eq "" ) ) {
			paar( $x1, $y1 );
			paar( $x2, $y2 );
			setpstricks(0);
			set3dpstricks(0);

		}
		else {
			tripel( $x1, $y1, $z1 );
			tripel( $x2, $y2, $z2 );
			setachsengraph3d( $x1, $y1, $z1, $x1, $y1, $z1 );
			setachsengraph3d( $x2, $y2, $z2, $x2, $y2, $z2 );

		}

		liniekopf( $layer, $linienart, $linienstaerke, $farbe, $parameter,
			$pfeilart, gettexthier() );

		settexthier("");
	}
	setpstricks(0);
	set3dpstricks($pstricksersatz3d);
	setpstricks($pstricksersatz);
}

sub linietext {
	my (
		$layer,       $x1,        $y1,            $z1,
		$x2,          $y2,        $z2,            $abstandx,
		$abstandy,    $abstandz,  $text,          $winkel,
		$ausrichtung, $linienart, $linienstaerke, $farbe,
		$parameter,   $pfeilart
	) = @_;

	my ( $dx, $dy, $dz );

	if ( ( $z1 eq "" ) && ( $z2 eq "" ) ) {
		if ( $x1 == $x2 ) {
			if ( $abstandy == 0.2 ) {
				$dy = ( ( $y2 - $y1 ) / 2 );
			}
			else {
				$dy = ( ( $y2 - $y1 ) / 2 ) + $abstandy;
			}
		}
		else {
			$dy = ( ( $y2 - $y1 ) / 2 ) + $abstandy;
		}
		if ( $y1 == $y2 ) {
			if ( $abstandx == 0.2 ) {
				$dx = ( ( $x2 - $x1 ) / 2 );
			}
			else {
				$dx = ( ( $x2 - $x1 ) / 2 ) + $abstandx;
			}

		}
		else {
			$dx = ( ( $x2 - $x1 ) / 2 ) + $abstandx;
		}
	}
	else {
		$dy = ( ( $y2 - $y1 ) / 2 ) + $abstandy;
		$dx = ( ( $x2 - $x1 ) / 2 ) + $abstandx;
	}

	if ( ( $z1 ne "" ) && ( $z2 ne "" ) ) {
		$dz = ( ( $z2 - $z1 ) / 2 ) + $abstandz;
		beschriftung3d( $layer, $farbe, $x1 + $dx, $y1 + $dy, $z1 + $dz,
			$winkel, $ausrichtung, $text );

		minmax3d( $x1 - $dx, $y1 - $dy, $z1 - $dz, $x1 + $dx, $y1 + $dy,
			$z1 + $dz );

		minmax3d( $x1 + $dx, $y1 + $dy, $z1 + $dz, $x1 - $dx, $y1 - $dy,
			$z1 - $dz );

	}
	else {
		beschriftung( $layer, $farbe, $x1 + $dx, $y1 + $dy, $winkel,
			$ausrichtung, $text );
	}

	linie( $layer, $x1, $y1, $z1, $x2, $y2, $z2, $linienart, $linienstaerke,
		$farbe, $parameter, $pfeilart );

}

sub linietextabstand {
	my (
		$layer,    $x1,          $y1,        $z1,
		$x2,       $y2,          $z2,        $abstand,
		$abstandx, $abstandy,    $abstandz,  $text,
		$winkel,   $ausrichtung, $linienart, $linienstaerke,
		$farbe,    $parameter,   $pfeilart
	) = @_;

	my (
		$winkelneu, $dx,  $dy,  $dz,    $laenge, $x1n,
		$y1n,       $x2n, $y2n, $x1neu, $y1neu
	);

	if ( ( $z1 ne "" ) && ( $z2 ne "" ) ) {
		kommentar( $layer, "hier" );
		$x1n = x3d( $x1, $y1, $z1 );
		$y1n = y3d( $x1, $y1, $z1 );

		$x2n = x3d( $x2, $y2, $z2 );
		$y2n = y3d( $x2, $y2, $z2 );

		$dx = $x2n - $x1n;
		$dy = $y2n - $y1n;
	}
	else {
		$x1n = $x1;
		$y1n = $y1;

		$x2n = $x2;
		$y2n = $y2;

		$dx = $x2 - $x1;
		$dy = $y2 - $y1;
	}

	if ( $abstand == 0 ) {
		linietext(
			$layer,       $x1,        $y1,            $z1,
			$x2,          $y2,        $z2,            $abstandx,
			$abstandy,    $abstandz,  $text,          $winkel,
			$ausrichtung, $linienart, $linienstaerke, $farbe,
			$parameter,   $pfeilart
		);

	}
	else {
		$winkelneu = radtodeg( atan2( $dy, $dx ) );
		$laenge = sqrt( $dx * $dx + $dy * $dy );

		$x1neu = calcendpunktx( $x1n, $abstand, $winkelneu + 90 );
		$y1neu = calcendpunkty( $y1n, $abstand, $winkelneu + 90 );

		linietextpolar(
			$layer,       $x1neu,     $y1neu,         "",
			$laenge,      $winkelneu, 0,              $abstandx,
			$abstandy,    $abstandz,  $text,          $winkel,
			$ausrichtung, $linienart, $linienstaerke, $farbe,
			$parameter,   $pfeilart
		);
	}

}

sub liniepolartextabstand {
	my (
		$layer,    $x,           $y,         $z,
		$laenge,   $w1,          $w2,        $abstand,
		$abstandx, $abstandy,    $abstandz,  $text,
		$winkel,   $ausrichtung, $linienart, $linienstaerke,
		$farbe,    $parameter,   $pfeilart
	) = @_;

	my ( $x2, $y2, $z2 );
	if ( ( $z eq "" ) || ( $w2 eq "" ) ) {
		$x2 = calcendpunktx( $x, $laenge, $w1 );
		$y2 = calcendpunkty( $y, $laenge, $w1 );
		linietextabstand(
			$layer,    $x,           $y,         "",
			$x2,       $y2,          "",         $abstand,
			$abstandx, $abstandy,    $abstandz,  $text,
			$winkel,   $ausrichtung, $linienart, $linienstaerke,
			$farbe,    $parameter,   $pfeilart
		);

	}
	else {
		$x2 = calcendpunktx3d( $x, $laenge, $w1, $w2 );
		$y2 = calcendpunkty3d( $y, $laenge, $w1, $w2 );
		$z2 = calcendpunktz3d( $z, $laenge, $w1, $w2 );
		linietextabstand(
			$layer,    $x,           $y,         $z,
			$x2,       $y2,          $z2,        $abstand,
			$abstandx, $abstandy,    $abstandz,  $text,
			$winkel,   $ausrichtung, $linienart, $linienstaerke,
			$farbe,    $parameter,   $pfeilart
		);

	}

}

##################################################################
# Linie mit Laenge und Winkel
##################################################################
sub liniepolar {
	my ( $layer, $x, $y, $z, $laenge, $w1, $w2, $linienart, $linienstaerke,
		$farbe, $parameter, $pfeilart )
	  = @_;
	my ( $x2, $y2, $z2 );
	if ( ( $z eq "" ) || ( $w2 eq "" ) ) {
		$x2 = calcendpunktx( $x, $laenge, $w1 );
		$y2 = calcendpunkty( $y, $laenge, $w1 );
		linie( $layer, $x, $y, "", $x2, $y2, "", $linienart, $linienstaerke,
			$farbe, $parameter, $pfeilart );
	}
	else {
		$x2 = calcendpunktx3d( $x, $laenge, $w1, $w2 );
		$y2 = calcendpunkty3d( $y, $laenge, $w1, $w2 );
		$z2 = calcendpunktz3d( $z, $laenge, $w1, $w2 );
		linie( $layer, $x, $y, $z, $x2, $y2, $z2, $linienart, $linienstaerke,
			$farbe, $parameter, $pfeilart );
	}
}

sub linietextpolar {
	my (
		$layer,       $x,         $y,             $z,
		$laenge,      $w1,        $w2,            $abstandx,
		$abstandy,    $abstandz,  $text,          $winkel,
		$ausrichtung, $linienart, $linienstaerke, $farbe,
		$parameter,   $pfeilart
	) = @_;

	my ( $x2, $y2, $z2, $x3, $y3 );
	if ( ( $z eq "" ) ) {

		if ( $w2 == 0 ) {

			$x2 = calcendpunktx( $x, $laenge, $w1 );
			$y2 = calcendpunkty( $y, $laenge, $w1 );
			linietext(
				$layer,       $x,         $y,             "",
				$x2,          $y2,        "",             $abstandx,
				$abstandy,    $abstandz,  $text,          $winkel,
				$ausrichtung, $linienart, $linienstaerke, $farbe,
				$parameter,   $pfeilart
			);

		}
		else {

			$x2 = calcendpunktx( $x, $w2, $w1 + 90 );
			$y2 = calcendpunkty( $y, $w2, $w1 + 90 );
			$x3 = calcendpunktx( $x2, $laenge, $w1 );
			$y3 = calcendpunkty( $y2, $laenge, $w1 );

			linietext(
				$layer,       $x2,        $y2,            "",
				$x3,          $y3,        "",             $abstandx,
				$abstandy,    $abstandz,  $text,          $winkel,
				$ausrichtung, $linienart, $linienstaerke, $farbe,
				$parameter,   $pfeilart
			);

		}

	}
	else {
		$x2 = calcendpunktx3d( $x, $laenge, $w1, $w2 );
		$y2 = calcendpunkty3d( $y, $laenge, $w1, $w2 );
		$z2 = calcendpunktz3d( $z, $laenge, $w1, $w2 );
		linietext(
			$layer,       $x,         $y,             $z,
			$x2,          $y2,        $z2,            $abstandx,
			$abstandy,    $abstandz,  $text,          $winkel,
			$ausrichtung, $linienart, $linienstaerke, $farbe,
			$parameter,   $pfeilart
		);
	}

}

# Verschiedene Koepfe

sub liniekopf {
	my ( $layer, $linienart, $linienstaerke, $farbe, $parameter, $pfeilart,
		$anhang )
	  = @_;

	if ( $anhang ne "" ) {

		if ( istzahl($linienstaerke) == 1 ) {

			if ( $linienstaerke > 0 ) {
				if ( get3dpstricks() == 1 ) {
					set3dzeichnen(1);
					befehlerzeugen( $layer, "pstThreeDLine", $farbe, $linienart,
						$linienstaerke, $parameter, $pfeilart, $anhang );

				}
				else {
					befehlerzeugen( $layer, "psline", $farbe, $linienart,
						$linienstaerke, $parameter, $pfeilart, $anhang );
				}
			}
		}
		else {
			if ( get3dpstricks() == 1 ) {
				set3dzeichnen(1);
				befehlerzeugen( $layer, "pstThreeDLine", $farbe, $linienart,
					$linienstaerke, $parameter, $pfeilart, $anhang );

			}
			else {
				befehlerzeugen( $layer, "psline", $farbe, $linienart,
					$linienstaerke, $parameter, $pfeilart, $anhang );
			}

		}
	}
}

sub polygon {
	my ( $layer, $linienart, $linienstaerke, $farbe, $fuellart, $fuellfarbe,
		$parameter, $anhang )
	  = @_;

	if ( $anhang ne "" ) {

		if ( get3dpstricks() == 1 ) {
			set3dzeichnen(1);

			befehlfuellungerzeugen(
				$layer,         "pstThreeDLine",
				$farbe,         $fuellart,
				$fuellfarbe,    $linienart,
				$linienstaerke, $parameter,
				"",             $anhang
			);
		}
		else {
			befehlfuellungerzeugen(
				$layer,      "pspolygon", $farbe,         $fuellart,
				$fuellfarbe, $linienart,  $linienstaerke, $parameter,
				"",          $anhang
			);
		}
	}
}

sub bezierkopf {
	my ( $layer, $linienart, $linienstaerke, $farbe, $parameter, $pfeilart,
		$anhang )
	  = @_;

	my $pstricksersatz3d = get3dpstricks();
	my $pstricksersatz   = getpstricks();

	if ( $anhang ne "" ) {
		setpstricks(0);
		set3dpstricks(0);


		befehlerzeugen( $layer, "psbezier", $farbe, $linienart, $linienstaerke,
			$parameter, $pfeilart, $anhang );
	}

	setpstricks($pstricksersatz);
	set3dpstricks($pstricksersatz3d);

	

}

sub kurvekopf {
	my ( $layer, $linienart, $linienstaerke, $farbe, $parameter, $pfeilart,
		$anhang )
	  = @_;

	my $pstricksersatz3d = get3dpstricks();
	my $pstricksersatz   = getpstricks();
	if ( $anhang ne "" ) {
		setpstricks(0);
		set3dpstricks(0);
		befehlerzeugen( $layer, "pscurve", $farbe, $linienart, $linienstaerke,
			$parameter, $pfeilart, $anhang );
		setpstricks(0);
		set3dpstricks($pstricksersatz3d);
		setpstricks($pstricksersatz);

		setpstricks(0);
		set3dpstricks($pstricksersatz3d);
		setpstricks($pstricksersatz);
	}
}

# Punkte und Kreuze
sub punktzeichnen {
	my (
		$layer,      $x,           $y,             $z,
		$radius,     $ausrichtung, $farbe,         $fuellart,
		$fuellfarbe, $linienart,   $linienstaerke, $text,
		$parameter
	) = @_;
	my ( $parameterweiter, $xneu, $yneu, $x2, $y2, $radiusx, $radiusy, $coor );

	if ( $parameter =~ /drawCoor/ ) {
		$parameter =~ s/drawCoor,//g;
		$parameter =~ s/drawCoor//g;
		$coor = 1;
	}
	else {
		$coor = 0;
	}

	$radiusx = $radius / getskalierung("x");
	$radiusy = $radius / getskalierung("y");

	if ( $z eq "" ) {
		$xneu = $x;
		$yneu = $y;

	}
	else {
		$xneu = x3d( $x, $y, $z );
		$yneu = y3d( $x, $y, $z );
	}

	$x2 =
	  nachkommastellen(
		calcendpunktx( $xneu, ( $radiusx + 0.1 ), $ausrichtung ), 4 );
	$y2 =
	  nachkommastellen(
		calcendpunkty( $yneu, ( $radiusy + 0.1 ), $ausrichtung ), 4 );

	if ( get3dpstricks() == 2 ) {
		$radius = 2 * $radius;
		tripel( $x, $y, $z );
		$parameterweiter = $parameter . ", dotsize=" . $radius . "cm";
		befehlfuellungerzeugen(
			$layer,         "pstThreeDDot",
			$farbe,         $fuellart,
			$fuellfarbe,    $linienart,
			$linienstaerke, $parameterweiter,
			"",             gettexthier()
		);

#		befehlerzeugen( $layer, "pstThreeDDot", $farbe, $linienart, $linienstaerke, $parameterweiter, "", gettexthier() );
		settexthier("");
		if ( $coor == 1 ) {
			linie( $layer, $x, $y, $z, $x, $y, 0, "dashed", $linienstaerke,
				$farbe, "", "" );
			linie( $layer, $x, 0, 0, $x, $y, 0, "dashed", $linienstaerke,
				$farbe, "", "" );
			linie( $layer, 0, $y, 0, $x, $y, 0, "dashed", $linienstaerke,
				$farbe, "", "" );

#	linie( $layer, $x, $y, $z, 0, $y, $z, "dashed", $linienstaerke, $farbe, "", "" );
#	linie( $layer, 0, $y, 0, 0, $y, $z, "dashed", $linienstaerke, $farbe, "", "" );
#	linie( $layer, 0, 0, $z, 0, $y, $z, "dashed", $linienstaerke, $farbe, "", "" );

#	linie( $layer, $x, $y, $z, $x, 0, $z, "dashed", $linienstaerke, $farbe, "", "" );
#	linie( $layer, $x, 0, 0, $x, 0, $z, "dashed", $linienstaerke, $farbe, "", "" );
#	linie( $layer, 0, 0, $z, $x, 0, $z, "dashed", $linienstaerke, $farbe, "", "" );

		}
	}
	else {
		ellipse(
			$layer,     $xneu,          $yneu,     $radiusx,
			$radiusy,   $farbe,         $fuellart, $fuellfarbe,
			$linienart, $linienstaerke, $parameter
		);

	}

	beschriftung( $layer, $farbe, $x2, $y2, 0, $ausrichtung, $text );

}

sub kreuzzeichnen {
	my (
		$layer,         $x,      $y,           $z,
		$groesse,       $winkel, $farbe,       $linienart,
		$linienstaerke, $text,   $ausrichtung, $parameter
	) = @_;

	my ( $xabstand, $yabstand, $xneu, $yneu, $radius );
	$xabstand =
	  nachkommastellen( sin( degtorad($winkel) ) * ( $groesse / 2 ), 4 );
	$yabstand =
	  nachkommastellen( cos( degtorad($winkel) ) * ( $groesse / 2 ), 4 );
	$radius = sqrt( $xabstand * $xabstand + $yabstand * $yabstand );
	if ( $z eq "" ) {

		#minmax( $x, $x, $y, $y );
		$xneu = $x;
		$yneu = $y;
	}
	else {

		#	minmax3d( $x, $y, $z, $x, $y, $z );
		$xneu = x3d( $x, $y, $z );
		$yneu = y3d( $x, $y, $z );

	}
	setlabelabstand( $radius + 0.1 );
	kreuz(
		$layer,     $xneu,          $yneu,
		$groesse,   $winkel,        $farbe,
		$linienart, $linienstaerke, $parameter
	);
	beschriftung( $layer, $farbe, $xneu, $yneu, 0, $ausrichtung, $text );
	setlabelabstand(0);

}

sub kreuz {
	my (
		$layer,     $x,             $y,
		$groesse,   $winkel,        $farbe,
		$linienart, $linienstaerke, $parameter
	) = @_;

	my $pstricksersatz3d = get3dpstricks();
	my $pstricksersatz   = getpstricks();

	setpstricks(0);
	set3dpstricks(0);

	my ( $xabstand1, $yabstand1, $xabstand2, $yabstand2 );
	$xabstand1 = sin( degtorad($winkel) ) * $groesse / 2;
	$yabstand1 = cos( degtorad($winkel) ) * $groesse / 2;
	$xabstand2 = sin( degtorad( $winkel + 90 ) ) * $groesse / 2;
	$yabstand2 = cos( degtorad( $winkel + 90 ) ) * $groesse / 2;
	linie(
		$layer,
		nachkommastellen( $x - $xabstand1, 4 ),
		nachkommastellen( $y - $yabstand1, 4 ),
		"",
		nachkommastellen( $x + $xabstand1, 4 ),
		nachkommastellen( $y + $yabstand1, 4 ),
		"",
		$linienart,
		$linienstaerke,
		$farbe,
		$parameter,
		"-"
	);

	linie(
		$layer,
		nachkommastellen( $x - $xabstand2, 4 ),
		nachkommastellen( $y - $yabstand2, 4 ),
		"",
		nachkommastellen( $x + $xabstand2, 4 ),
		nachkommastellen( $y + $yabstand2, 4 ),
		"",
		$linienart,
		$linienstaerke,
		$farbe,
		$parameter,
		"-"
	);
	setpstricks(0);
	set3dpstricks($pstricksersatz3d);
	setpstricks($pstricksersatz);

}

# Runde Sachen
sub ellipse {
	my (
		$layer,     $x,             $y,        $radius1,
		$radius2,   $farbe,         $fuellart, $fuellfarbe,
		$linienart, $linienstaerke, $parameter
	) = @_;
	my $text;
	settexthier("");
	if ( $radius1 == $radius2 ) {
		paar( $x, $y );
		klammer( $radius1 * getskalierung("x") );

		befehlfuellungerzeugen(
			$layer,      "pscircle", $farbe,         $fuellart,
			$fuellfarbe, $linienart, $linienstaerke, $parameter,
			"",          gettexthier()
		);

	}
	else {

		paar( $x,       $y );
		paar( $radius1, $radius2 );

		befehlfuellungerzeugen(
			$layer,      "psellipse", $farbe,         $fuellart,
			$fuellfarbe, $linienart,  $linienstaerke, $parameter,
			"",          gettexthier()
		);

	}
	settexthier("");
	minmax( $x - $radius1, $y - $radius1, $x + $radius1, $y + $radius1 );
	minmax( $x - $radius2, $y - $radius2, $x + $radius2, $y + $radius2 );
	setachsengraph( $x - $radius1, $y - $radius1, $x + $radius1,
		$y + $radius1 );
	setachsengraph( $x - $radius2, $y - $radius2, $x + $radius2,
		$y + $radius2 );
}

sub kreis {
	my (
		$layer,         $x,        $y,          $radius,
		$farbe,         $fuellart, $fuellfarbe, $linienart,
		$linienstaerke, $parameter
	) = @_;

	if ( ( $radius != 0 ) && ( $linienstaerke != 0 ) ) {

		ellipse(
			$layer,     $x,             $y,        $radius,
			$radius,    $farbe,         $fuellart, $fuellfarbe,
			$linienart, $linienstaerke, $parameter
		);
	}
}

sub kreisskala {
	my (
		$layer,         $x,         $y,     $radius,
		$laenge,        $winkel,    $farbe, $linienart,
		$linienstaerke, $parameter, $pfeilart
	) = @_;

	my ( $xstart, $ystart );
	$xstart = calcendpunktx( $x, $radius, $winkel );
	$ystart = calcendpunkty( $y, $radius, $winkel );

	liniepolar(
		$layer,         $xstart, $ystart,    "",
		$laenge,        $winkel, "",         $linienart,
		$linienstaerke, $farbe,  $parameter, $pfeilart
	);

}

sub kreistext {
	my (
		$layer, $x,    $y,          $radius, $winkel,
		$farbe, $text, $winkeltext, $ausrichtung
	) = @_;

	my ( $xstart, $ystart );
	$xstart = calcendpunktx( $x, $radius, $winkel );
	$ystart = calcendpunkty( $y, $radius, $winkel );

	beschriftung( $layer, $farbe, $xstart, $ystart, $winkeltext, $ausrichtung,
		$text );

}

sub kreisbogen {
	my (
		$layer,     $linienart, $linienstaerke, $x1,
		$y1,        $r,         $w1,            $w2,
		$farbe,     $fuellart,  $fuellfarbe,    $geschlossen,
		$parameter, $pfeilart
	) = @_;

	ellipsebogen(
		$layer,                  $linienart,
		$linienstaerke,          $x1,
		$y1,                     $r * getskalierung("x"),
		$r * getskalierung("y"), $w1,
		$w2,                     $farbe,
		$fuellart,               $fuellfarbe,
		$geschlossen,            $parameter,
		$pfeilart
	  )

}

sub ellipsebogen {
	my (
		$layer,       $linienart, $linienstaerke, $x1,
		$y1,          $r1,        $r2,            $w1,
		$w2,          $farbe,     $fuellart,      $fuellfarbe,
		$geschlossen, $parameter, $pfeilart
	) = @_;

	my ( $x2, $x3, $y2, $y3 );

	if ( $r1 == $r2 ) {

		paar( $x1, $y1 );
		klammer($r1);
		klammer($w1);
		klammer($w2);

		$x2 = sprintf( "%0.4f", calcendpunktx( $x1, $r1, $w1 ) );
		$y2 = sprintf( "%0.4f", calcendpunkty( $y1, $r2, $w1 ) );
		$x3 = sprintf( "%0.4f", calcendpunktx( $x1, $r1, $w2 ) );
		$y3 = sprintf( "%0.4f", calcendpunkty( $y1, $r2, $w2 ) );
		if ( $geschlossen eq "ja" ) {

			befehlfuellungerzeugen(
				$layer,      "pswedge",  $farbe,         $fuellart,
				$fuellfarbe, $linienart, $linienstaerke, $parameter,
				"",          gettexthier()
			);

			befehlerzeugen( $layer, "psarc", $farbe, $linienart, $linienstaerke,
				$parameter, $pfeilart, gettexthier() );

		}
		else {
			befehlerzeugen( $layer, "psarc", $farbe, $linienart, $linienstaerke,
				$parameter, $pfeilart, gettexthier() );
		}
		minmax( $x1 - $r1, $y1 - $r2, $x1 - $r1, $y1 - $r2 );
		minmax( $x1 + $r1, $y1 + $r2, $x1 + $r1, $y1 + $r2 );
		minmax( $x1 - $r1, $y1 + $r2, $x1 - $r1, $y1 + $r2 );
		minmax( $x1 + $r1, $y1 - $r2, $x1 + $r1, $y1 - $r2 );
		setachsengraph( $x1 - $r1, $x1 - $r1, $y1 - $r2, $y1 - $r2 );
		setachsengraph( $x1 + $r1, $x1 + $r1, $y1 + $r2, $y1 + $r2 );
		settexthier("");
	}
	else {

		minmax( $x1 - $r1, $y1 - $r1, $x1 + $r1, $y1 + $r1 );
		minmax( $x1 - $r2, $y1 - $r2, $x1 + $r2, $y1 + $r2 );
		setachsengraph( $x1 - $r1, $y1 - $r1, $x1 + $r1, $y1 + $r1 );
		setachsengraph( $x1 - $r2, $y1 - $r2, $x1 + $r2, $y1 + $r2 );

		my $x2 = $x1 + $r1 * cos( degtorad($w1) );
		my $y2 = $y1 + $r2 * sin( degtorad($w1) );

		my $x3 = $x1 + $r1 * cos( degtorad($w2) );
		my $y3 = $y1 + $r2 * sin( degtorad($w2) );

		if ( $geschlossen eq "ja" ) {

			einschlussanfang( $layer, $farbe, $fuellart, $fuellfarbe,
				$linienart, $linienstaerke, $parameter );
			linie( $layer, $x1, $y1, "", $x2, $y2, "", $linienart,
				$linienstaerke, $farbe, $parameter, "" );
			settexthier("");

			paar( $x1, $y1 );
			paarohneminmax( $r1, $r2 );

			klammer($w1);
			klammer($w2);

			befehlfuellungerzeugen( $layer, "psellipticarc", "", "", "", "", "",
				"", "", gettexthier() );
			linie( $layer, $x3, $y3, "", $x1, $y1, "", $linienart,
				$linienstaerke, $farbe, $parameter, "" );

			einschlussende( $layer, $farbe, $fuellart, $fuellfarbe, $linienart,
				$linienstaerke, $parameter );
			paar( $x1, $y1 );
			paarohneminmax( $r1, $r2 );

			klammer($w1);
			klammer($w2);
			befehlerzeugen( $layer, "psellipticarc", $farbe, $linienart,
				$linienstaerke, $parameter, $pfeilart, gettexthier() );

			linie( $layer, $x3, $y3, "", $x1, $y1, "", $linienart,
				$linienstaerke, $farbe, $parameter, "" );
			linie( $layer, $x1, $y1, "", $x2, $y2, "", $linienart,
				$linienstaerke, $farbe, $parameter, "" );

		}
		else {
			settexthier("");
			paar( $x1, $y1 );
			paarohneminmax( $r1, $r2 );
			klammer($w1);
			klammer($w2);
			befehlerzeugen( $layer, "psellipticarc", $farbe, $linienart,
				$linienstaerke, $parameter, $pfeilart, gettexthier() );
		}
	}
}

sub ring {
	my (
		$layer,    $linienart, $linienstaerke, $xzentrum,
		$yzentrum, $radius,    $dicke,         $winkel1,
		$winkel2,  $farbe,     $fuellart,      $fuellfarbe,
		$parameter
	) = @_;

	settexthier("");
	my $radiusinnen     = $radius - $dicke;
	my $winkeldifferenz = abs( $winkel1 - $winkel2 );
	my $x1 =
	  nachkommastellen( calcendpunktx( $xzentrum, $radius, $winkel1 ), 2 );
	my $y1 =
	  nachkommastellen( calcendpunkty( $yzentrum, $radius, $winkel1 ), 2 );
	my $x2 =
	  nachkommastellen( calcendpunktx( $xzentrum, $radius, $winkel2 ), 2 );
	my $y2 =
	  nachkommastellen( calcendpunkty( $yzentrum, $radius, $winkel2 ), 2 );
	my $x11 =
	  nachkommastellen( calcendpunktx( $xzentrum, $radiusinnen, $winkel1 ), 2 );
	my $y11 =
	  nachkommastellen( calcendpunkty( $yzentrum, $radiusinnen, $winkel1 ), 2 );
	my $x21 =
	  nachkommastellen( calcendpunktx( $xzentrum, $radiusinnen, $winkel2 ), 2 );
	my $y21 =
	  nachkommastellen( calcendpunkty( $yzentrum, $radiusinnen, $winkel2 ), 2 );

	my $hilfsfuellfarbe = getfuellfarbe();
	setfuellfarbe("");

	befehlfuellungerzeugen(
		$layer, "pscustom", "", $fuellart, $farbe, "",
		"",     $parameter, "", "{\\gsave"
	);

	paar( $xzentrum, $yzentrum );
	klammer($radius);
	klammer($winkel1);
	klammer($winkel2);

	befehlerzeugen( $layer, "psarc", $farbe, $linienart, $linienstaerke,
		$parameter, "", gettexthier() );

	settexthier("");

	paar( $xzentrum, $yzentrum );
	klammer($radiusinnen);

	klammer($winkel2);
	klammer($winkel1);

	befehlerzeugen( $layer, "psarcn", $farbe, $linienart, $linienstaerke,
		$parameter, "", gettexthier() );

	settexthier("");

	befehlfuellungerzeugen(
		$layer,      "fill", "", $fuellart,
		$fuellfarbe, "",     "", $parameter,
		"",          "\\grestore}"
	);

	paar( $xzentrum, $yzentrum );
	klammer($radius);
	klammer($winkel1);
	klammer($winkel2);

	befehlerzeugen( $layer, "psarc", $farbe, $linienart, $linienstaerke,
		$parameter, "", gettexthier() );

	settexthier("");

	paar( $xzentrum, $yzentrum );
	klammer($radiusinnen);

	klammer($winkel2);
	klammer($winkel1);

	befehlerzeugen( $layer, "psarcn", $farbe, $linienart, $linienstaerke,
		$parameter, "", gettexthier() );

	if ( $winkeldifferenz < 360 ) {
		linie( $layer, $x1, $y1, "", $x11, $y11, "", "solid", $linienstaerke,
			$farbe, $parameter, "" );
		linie( $layer, $x2, $y2, "", $x21, $y21, "", "solid", $linienstaerke,
			$farbe, $parameter, "" );
	}
	minmax(
		$xzentrum - $radius,
		$xzentrum - $radius,
		$yzentrum - $radius,
		$yzentrum - $radius
	);
	minmax(
		$xzentrum + $radius,
		$xzentrum + $radius,
		$yzentrum + $radius,
		$yzentrum + $radius
	);
	setachsengraph(
		$xzentrum - $radius,
		$xzentrum - $radius,
		$yzentrum - $radius,
		$yzentrum - $radius
	);
	setachsengraph(
		$xzentrum + $radius,
		$xzentrum + $radius,
		$yzentrum + $radius,
		$yzentrum + $radius
	);

	settexthier("");
	setfuellfarbe($hilfsfuellfarbe);
}

# Eckige Dinge
sub rechteck {
	my (
		$layer,      $x,         $y,             $breite,
		$hoehe,      $winkel,    $farbe,         $fuellart,
		$fuellfarbe, $linienart, $linienstaerke, $parameter
	) = @_;

	my ( $x2, $y2, $x3, $x4, $y3, $y4 );

	$x2 = nachkommastellen( $x + cos( degtorad($winkel) ) * $breite, 4 );
	$y2 = nachkommastellen( $y + sin( degtorad($winkel) ) * $breite, 4 );
	$x3 = nachkommastellen( $x2 - sin( degtorad($winkel) ) * $hoehe, 4 );
	$y3 = nachkommastellen( $y2 + cos( degtorad($winkel) ) * $hoehe, 4 );
	$x4 = nachkommastellen( $x - sin( degtorad($winkel) ) * $hoehe,  4 );
	$y4 = nachkommastellen( $y + cos( degtorad($winkel) ) * $hoehe,  4 );

	achsengraph( $x,  $y );
	achsengraph( $x2, $y2 );
	achsengraph( $x3, $y3 );
	achsengraph( $x4, $y4 );

	settexthier("");
	if ( $linienstaerke != 0 ) {

		if ( $winkel == 0 ) {
			paar( $x,           $y );
			paar( $x + $breite, $y + $hoehe );

			befehlfuellungerzeugen(
				$layer,      "psframe",  $farbe,         $fuellart,
				$fuellfarbe, $linienart, $linienstaerke, $parameter,
				"",          gettexthier()
			);

		}
		else {
			paar( $x,  $y );
			paar( $x2, $y2 );
			paar( $x3, $y3 );
			paar( $x4, $y4 );

			polygon( $layer, $linienart, $linienstaerke, $farbe, $fuellart,
				$fuellfarbe, $parameter, gettexthier() );
		}
	}
	settexthier("");

}

sub parallelogramm {
	my (
		$layer,    $x1,         $y1,        $breite,
		$hoehe,    $w1,         $w2,        $farbe,
		$fuellart, $fuellfarbe, $linienart, $linienstaerke,
		$parameter
	) = @_;

	settexthier("");
	my ( $x2, $y2, $x3, $x4, $y3, $y4 );
	if ( $w2 == 90 ) {
		rechteck(
			$layer,      $x1,        $y1,            $breite,
			$hoehe,      $w1,        $farbe,         $fuellart,
			$fuellfarbe, $linienart, $linienstaerke, $parameter
		);
	}
	else {
		$x2 = calcendpunktx( $x1, $breite, $w1 );
		$y2 = calcendpunkty( $y1, $breite, $w1 );
		$x3 = calcendpunktx( $x2, $hoehe, $w1 + $w2 );
		$y3 = calcendpunkty( $y2, $hoehe, $w1 + $w2 );
		$x4 = calcendpunktx( $x1, $hoehe, $w1 + $w2 );
		$y4 = calcendpunkty( $y1, $hoehe, $w1 + $w2 );

		paar( $x1, $y1 );
		paar( $x2, $y2 );
		paar( $x3, $y3 );
		paar( $x4, $y4 );

		polygon( $layer, $linienart, $linienstaerke, $farbe, $fuellart,
			$fuellfarbe, $parameter, gettexthier() );

	}
	settexthier("");

}

sub dreieckbreitehoehe {
	my (
		$layer,    $x1,         $y1,        $breite,
		$hoehe,    $winkel1,    $winkel2,   $farbe,
		$fuellart, $fuellfarbe, $linienart, $linienstaerke,
		$parameter
	) = @_;

	$x1 = nachkommastellen( $x1, 3 );
	$y1 = nachkommastellen( $y1, 3 );

	my ( $x2, $y2, $x3, $y3 );

	if ( $winkel1 == 90 ) {

		$x2 = nachkommastellen( $x1 + cos( degtorad($winkel2) ) * $breite, 3 );
		$y2 = nachkommastellen( $y1 + sin( degtorad($winkel2) ) * $breite, 3 );
		$x3 = nachkommastellen( $x2 - sin( degtorad($winkel2) ) * $hoehe,  3 );
		$y3 = nachkommastellen( $y2 + cos( degtorad($winkel2) ) * $hoehe,  3 );

	}
	else {

		$x2 = nachkommastellen( $x1 + cos( degtorad($winkel2) ) * $breite, 3 );
		$y2 = nachkommastellen( $y1 + sin( degtorad($winkel2) ) * $breite, 3 );
		$x3 = nachkommastellen(
			$x2 - sin( degtorad( $winkel1 + $winkel2 ) ) * $hoehe, 3 );
		$y3 = nachkommastellen(
			$y2 + cos( degtorad( $winkel1 + $winkel2 ) ) * $hoehe, 3 );
	}

	dreieck( $layer, $x1, $y1, "", $x2, $y2, "", $x3, $y3, "", $farbe,
		$fuellart, $fuellfarbe, $linienart, $linienstaerke, $parameter );

}

sub dreieckrechtwinklig {
	my (
		$layer,      $x1,        $y1,            $laenge,
		$winkelz,    $winkel,    $farbe,         $fuellart,
		$fuellfarbe, $linienart, $linienstaerke, $parameter
	) = @_;

	$x1 = nachkommastellen( $x1, 3 );
	$y1 = nachkommastellen( $y1, 3 );

	my ( $schritt, $winkelerg, $x2, $x3, $x4, $y2, $y3, $y4 );

	$winkelerg = 90 - $winkelz - $winkel;

	$winkelerg = 90 - $winkelz - $winkel;

	$x2 = nachkommastellen( $x1 + cos( degtorad($winkel) ) * $laenge, 3 );
	$y2 = nachkommastellen( $y1 + sin( degtorad($winkel) ) * $laenge, 3 );

	# Neuer Punkt im Dreieck,
	# dazu werden die neuen Laengen
	# und die naechste Koordinate berechnet.
	my $laengede = nachkommastellen( cos( degtorad($winkelz) ) * $laenge, 3 );
	my $laengeec =
	  nachkommastellen( sqrt( $laenge * $laenge - $laengede * $laengede ), 3 );
	my $laengedf =
	  nachkommastellen( cos( degtorad($winkelerg) ) * $laengede, 3 );
	my $laengefe =
	  nachkommastellen( sin( degtorad($winkelerg) ) * $laengede, 3 );
	$x3 = nachkommastellen( $x1 + $laengefe, 3 );
	$y3 = nachkommastellen( $y1 + $laengedf, 3 );

	dreieck( $layer, $x1, $y1, "", $x2, $y2, "", $x3, $y3, "", $farbe,
		$fuellart, $fuellfarbe, $linienart, $linienstaerke, $parameter );
}

my ($hyp);
$hyp = 0;

sub sethyp { $hyp = 1; }
sub gethyp { return $hyp; }

sub dreieckrechtwinkligpunkte {
	my (
		$layer,      $x1,        $y1,            $x2,
		$y2,         $winkel,    $farbe,         $fuellart,
		$fuellfarbe, $linienart, $linienstaerke, $parameter
	) = @_;

	my $dx            = abs( $x2 - $x1 );
	my $dy            = abs( $y2 - $y1 );
	my $laenge        = sqrt( $dx * $dx + $dy * $dy );
	my $winkeldrehung = radtodeg( atan2( $dy, $dx ) );

	dreieckrechtwinklig(
		$layer,      $x1,            $y1,            $laenge,
		$winkel,     $winkeldrehung, $farbe,         $fuellart,
		$fuellfarbe, $linienart,     $linienstaerke, $parameter
	);

}

sub dreieckrechtwinkligpunktehoehe {
	my (
		$layer,      $x1,        $y1,            $x2,
		$y2,         $hoehe,     $farbe,         $fuellart,
		$fuellfarbe, $linienart, $linienstaerke, $parameter
	) = @_;

	my ( $winkel, $dx, $dy, $winkelerg, $winkelb, $winkelergb, $x3, $y3 );

	$dx = $x2 - $x1;
	$dy = $y2 - $y1;

	if ( $dy <= 0 ) {
		if ( $dx <= 0 ) {
			$winkel     = radtodeg( atan( $dy / $dx ) );
			$winkelerg  = 90 - $winkel;
			$winkelb    = degtorad($winkel);
			$winkelergb = degtorad($winkelerg);

			$x3 = nachkommastellen( $x1 + sin($winkelb) * $hoehe, 3 );
			$y3 = nachkommastellen( $y1 - cos($winkelb) * $hoehe, 3 );

		}
		else {
			$winkel     = radtodeg( atan( $dy / $dx ) );
			$winkelerg  = 90 - $winkel;
			$winkelb    = degtorad($winkel);
			$winkelergb = degtorad($winkelerg);

			$x3 = nachkommastellen( $x1 - sin($winkelb) * $hoehe, 3 );
			$y3 = nachkommastellen( $y1 + cos($winkelb) * $hoehe, 3 );

		}
	}
	else {
		if ( $dx <= 0 ) {
			$winkel     = -radtodeg( atan( $dy / $dx ) );
			$winkelerg  = 90 - $winkel;
			$winkelb    = degtorad($winkel);
			$winkelergb = degtorad($winkelerg);

			$x3 = nachkommastellen( $x1 - sin($winkelb) * $hoehe, 3 );
			$y3 = nachkommastellen( $y1 - cos($winkelb) * $hoehe, 3 );

		}
		else {
			$winkel     = radtodeg( atan( $dy / $dx ) );
			$winkelerg  = 90 - $winkel;
			$winkelb    = degtorad($winkel);
			$winkelergb = degtorad($winkelerg);

			$x3 = nachkommastellen( $x1 - sin($winkelb) * $hoehe, 3 );
			$y3 = nachkommastellen( $y1 + cos($winkelb) * $hoehe, 3 );

		}
	}

	dreieck( $layer, $x1, $y1, "", $x2, $y2, "", $x3, $y3, "", $farbe,
		$fuellart, $fuellfarbe, $linienart, $linienstaerke, $parameter );

}

sub pfeil {
	my (
		$layer,    $x,          $y,           $breite,
		$hoehe,    $pfeil,      $pfeillaenge, $farbe,
		$fuellart, $fuellfarbe, $linienart,   $linienstaerke,
		$parameter
	) = @_;

	settexthier("");

	paar( $x,                          $y );
	paar( $x + $breite,                $y );
	paar( $x + $breite,                $y - $pfeil );
	paar( $x + $breite + $pfeillaenge, $y + 1 / 2 * $hoehe );
	paar( $x + $breite,                $y + $pfeil + $hoehe );
	paar( $x + $breite,                $y + $hoehe );
	paar( $x,                          $y + $hoehe );

	polygon( $layer, $linienart, $linienstaerke, $farbe, $fuellart, $fuellfarbe,
		$parameter, gettexthier() );

	settexthier("");

}

sub pfeilknick {

	my (
		$layer,         $x,        $y,          $breite,
		$breiteknick,   $hoehe,    $pfeil,      $pfeillaenge,
		$farbe,         $fuellart, $fuellfarbe, $linienart,
		$linienstaerke, $parameter
	) = @_;

	settexthier("");

	paar( $x, $y );

	paar( $x + $breiteknick, $y );
	paar( $x + $breiteknick, $y - ( $breite - $breiteknick ) + $hoehe );
	paar( $x + $breiteknick - $pfeil,
		$y - ( $breite - $breiteknick ) + $hoehe );
	paar( $x + $breiteknick + 1 / 2 * $hoehe,
		$y - ( $breite - $breiteknick ) + $hoehe - $pfeillaenge / 2 );
	paar(
		$x + $breiteknick + $pfeil + $hoehe,
		$y - ( $breite - $breiteknick ) + $hoehe
	);
	paar( $x + $breiteknick + $hoehe,
		$y - ( $breite - $breiteknick ) + $hoehe );

	paar( $x + $breiteknick + $hoehe, $y + $hoehe );

	paar( $x, $y + $hoehe );
	polygon( $layer, $linienart, $linienstaerke, $farbe, $fuellart, $fuellfarbe,
		$parameter, gettexthier() );

	settexthier("");

}

sub rechtecktext {
	my (
		$layer,      $x1,        $y1,            $x2,
		$y2,         $text,      $farbe,         $fuellart,
		$fuellfarbe, $linienart, $linienstaerke, $parameter
	) = @_;

	achsengraph( $x1, $y1 );
	achsengraph( $x2, $y2 );
	tupel( $x1, $y1, $x2, $y2 );

	if ( $farbe eq getfarbe() ) {
		textanhaengen("{");
		textanhaengen($text);
		textanhaengen("}");
	}
	else {
		textanhaengen("{\\color{");
		textanhaengen($farbe);
		textanhaengen("}");
		textanhaengen($text);
		textanhaengen("}");
	}
	befehlfuellungerzeugen(
		$layer,      "psTextFrame", $farbe,         $fuellart,
		$fuellfarbe, $linienart,    $linienstaerke, $parameter,
		"",          gettexthier()
	);

}

sub dreieck {
	my ( $layer, $x1, $y1, $z1, $x2, $y2, $z2, $x3, $y3, $z3, $farbe, $fuellart,
		$fuellfarbe, $linienart, $linienstaerke, $parameter )
	  = @_;

	achsengraph( $x1, $y1 );
	achsengraph( $x2, $y2 );
	achsengraph( $x3, $y3 );
	settexthier("");
	if ( ( $z1 eq "" ) || ( $z2 eq "" ) || ( $z3 eq "" ) ) {

		paar( $x1, $y1 );
		paar( $x2, $y2 );
		paar( $x3, $y3 );

	}
	else {
		setachsengraph3d( $x1, $y1, $z1, $x1, $y1, $z1 );
		setachsengraph3d( $x2, $y2, $z2, $x2, $y2, $z2 );
		setachsengraph3d( $x3, $y3, $z3, $x3, $y3, $z3 );
		tripel( $x1, $y1, $z1 );
		tripel( $x2, $y2, $z2 );
		tripel( $x3, $y3, $z3 );
		tripel( $x1, $y1, $z1 );

	}

	polygon( $layer, $linienart, $linienstaerke, $farbe, $fuellart, $fuellfarbe,
		$parameter, gettexthier() );
	settexthier("");

}

sub viereck {
	my ( $layer, $x1, $y1, $z1, $x2, $y2, $z2, $x3, $y3, $z3, $x4, $y4, $z4,
		$farbe, $fuellart, $fuellfarbe, $linienart, $linienstaerke, $parameter )
	  = @_;
	settexthier("");
	if ( ( $z1 eq "" ) || ( $z2 eq "" ) || ( $z3 eq "" ) ) {
		achsengraph( $x1, $y1 );
		achsengraph( $x2, $y2 );
		achsengraph( $x3, $y3 );
		achsengraph( $x4, $y4 );
		vier( $x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4 );

	}
	else {
		setachsengraph3d( $x1, $y1, $z1, $x1, $y1, $z1 );
		setachsengraph3d( $x2, $y2, $z2, $x2, $y2, $z2 );
		setachsengraph3d( $x3, $y3, $z3, $x3, $y3, $z3 );
		setachsengraph3d( $x4, $y4, $z4, $x4, $y4, $z4 );
		tripel( $x1, $y1, $z1 );
		tripel( $x2, $y2, $z2 );
		tripel( $x3, $y3, $z3 );
		tripel( $x4, $y4, $z4 );
		tripel( $x1, $y1, $z1 );

	}

	polygon( $layer, $linienart, $linienstaerke, $farbe, $fuellart, $fuellfarbe,
		$parameter, gettexthier() );
	settexthier("");

}

sub neck {
	my (
		$layer,      $x1,        $y1,            $anzahl,
		$laenge,     $winkel,    $farbe,         $fuellart,
		$fuellfarbe, $linienart, $linienstaerke, $parameter
	) = @_;
	settexthier("");

	my $innenwinkel = 360 / $anzahl;
	my $x;

	my $i = 0;
	for ( $i = 0 ; $i <= $anzahl ; $i++ ) {
		paar(
			nachkommastellen(
				$x1 + $laenge * cos( degtorad( $winkel + $i * $innenwinkel ) ),
				4
			),
			nachkommastellen(
				$y1 + $laenge * sin( degtorad( $winkel + $i * $innenwinkel ) ),
				4
			)
		);
		achsengraph(
			nachkommastellen(
				$x1 + $laenge * cos( degtorad( $winkel + $i * $innenwinkel ) ),
				4
			),
			nachkommastellen(
				$y1 + $laenge * sin( degtorad( $winkel + $i * $innenwinkel ) ),
				4
			)
		);
	}

	polygon( $layer, $linienart, $linienstaerke, $farbe, $fuellart, $fuellfarbe,
		$parameter, gettexthier() );
	settexthier("");

}

sub winkel {
	my (
		$layer,      $x1,             $y1,            $x2,
		$y2,         $x3,             $y3,            $radius,
		$text,       $winkelrichtung, $farbe,         $fuellart,
		$fuellfarbe, $linienart,      $linienstaerke, $parameter
	) = @_;
	my ( $winkel, $winkel1, $winkel2, $xtext, $ytext );
	my $zu;

	if ( getfuellfarbe() eq $fuellfarbe ) {
		$zu = "nein";
	}
	else {
		$zu = "ja";
	}

	$winkel = vektorwinkel(
		vektordifferenz( "x", $x2, $y2, 0, $x1, $y1, 0 ),
		vektordifferenz( "y", $x2, $y2, 0, $x1, $y1, 0 ),
		vektordifferenz( "z", $x2, $y2, 0, $x1, $y1, 0 ),
		vektordifferenz( "x", $x2, $y2, 0, $x3, $y3, 0 ),
		vektordifferenz( "y", $x2, $y2, 0, $x3, $y3, 0 ),
		vektordifferenz( "z", $x2, $y2, 0, $x3, $y3, 0 )
	);
	kommentar( $layer, "Der Winkel " . $winkel . " wird gezeichnet" );
	$winkel1 = nachkommastellen(
		radtodeg(
			atan2(
				vektordifferenz( "y", $x2, $y2, 0, $x1, $y1, 0 ),
				vektordifferenz( "x", $x2, $y2, 0, $x1, $y1, 0 )
			)
		),
		3
	);
	$winkel2 = nachkommastellen(
		radtodeg(
			atan2(
				vektordifferenz( "y", $x2, $y2, 0, $x3, $y3, 0 ),
				vektordifferenz( "x", $x2, $y2, 0, $x3, $y3, 0 )
			)
		),
		3
	);
	if ( $winkelrichtung eq "i" ) {
		kreisbogen(
			$layer,         $linienart,
			$linienstaerke, $x2,
			$y2,            $radius * getskalierung("x"),
			$winkel1,       $winkel2,
			$farbe,         $fuellart,
			$fuellfarbe,    $zu,
			$parameter,     ""
		);
		$xtext = $x2 + cos( degtorad( $winkel1 + $winkel / 2 ) ) * $radius / 2;
		$ytext = $y2 + sin( degtorad( $winkel1 + $winkel / 2 ) ) * $radius / 2;
		beschriftung( $layer, "black", $xtext, $ytext, 0, 90, $text );
		if ( ( $winkel == 90 ) && ( $text eq " " ) ) {
			kreis(
				$layer,  $xtext,  $ytext, 0.06, "black", "solid",
				"black", "solid", 0.01
			);
		}
	}
	elsif ( $winkelrichtung eq "a" ) {
		kreisbogen(
			$layer,         $linienart,
			$linienstaerke, $x2,
			$y2,            $radius * getskalierung("x"),
			$winkel2,       $winkel1,
			$farbe,         $fuellart,
			$fuellfarbe,    $zu,
			$parameter,     ""
		);
		$xtext = $x2 -
		  cos( degtorad( $winkel2 - ( 360 + $winkel ) / 2 ) ) * $radius / 2;
		$ytext = $y2 +
		  sin( degtorad( $winkel2 + ( 360 - $winkel ) / 2 ) ) * $radius / 2;
		beschriftung( $layer, "black", $xtext, $ytext, 0, 90, $text );
		if ( ( $winkel == 90 ) && ( $text eq " " ) ) {
			kreis(
				$layer,  $xtext,  $ytext, 0.06, "black", "solid",
				"black", "solid", 0.01
			);
		}
	}
	else {
		kreisbogen(
			$layer,         $linienart,
			$linienstaerke, $x2,
			$y2,            $radius * getskalierung("x"),
			$winkel1,       $winkel2,
			$farbe,         $fuellart,
			$fuellfarbe,    $zu,
			$parameter,     ""
		);
		$xtext = $x2 + cos( degtorad( $winkel1 + $winkel / 2 ) ) * $radius / 2;
		$ytext = $y2 + sin( degtorad( $winkel1 + $winkel / 2 ) ) * $radius / 2;
		beschriftung( $layer, "black", $xtext, $ytext, 0, 90, $text );
	}

}

sub punktezeichnen {
	my ( $layer, $x1, $y1, $x2, $y2, $farbe, $verbunden ) = @_;
	if ( $verbunden eq "jamitk" ) {
		kreis( $layer, $x1, $y1, 0.15, $farbe, "solid", $farbe, "solid", 0.01 );
		linie(
			$layer, $x1,     $y1,  "",     $x2, $y2,
			"",     "solid", 0.15, $farbe, "",  "-"
		);
		kreis( $layer, $x2, $y2, 0.15, $farbe, "solid", $farbe, "solid", 0.01 );
	}
	if ( $verbunden eq "jaohnek" ) {
		linie(
			$layer, $x1,     $y1,  "",     $x2, $y2,
			"",     "solid", 0.15, $farbe, "",  "-"
		);
	}
	if ( $verbunden eq "nein" ) {
		kreis( $layer, $x1, $y1, 0.15, $farbe, "solid", $farbe, "solid", 0.01 );
		kreis( $layer, $x2, $y2, 0.15, $farbe, "solid", $farbe, "solid", 0.01 );
	}

}

# Tangenten, Steigungsdreiecke etc, werden gezeichnet
sub tangente {
	my ( $layer, $func, $x, $breite, $farbe, $linienart, $linienstaerke,
		$parameter )
	  = @_;

	linie(
		$layer,
		$x - $breite / 2,
		calctangente( $func, $x - $breite / 2, $x ),
		"",
		$x + $breite / 2,
		calctangente( $func, $x + $breite / 2, $x ),
		"",
		$linienart,
		$linienstaerke,
		$farbe,
		$parameter,
		""
	);

}

sub tangentendreieck {
	my ( $layer, $func, $x, $breite, $farbe, $linienart, $linienstaerke,
		$parameter )
	  = @_;
	my $y = calcfunk( $func, "x", $x );

	my ( $xmin, $xmax, $ymin, $ymax, $m, $dx, $dy );
	$xmin = $x - $breite / 2;
	$xmax = $x + $breite / 2;
	$ymin = calctangente( $func, $xmin, $x );
	$ymax = calctangente( $func, $xmax, $x );
	$dy   = $ymax - $ymin;
	$dx   = $xmax - $xmin,

	  $m = $dy / $dx;

	kommentar( $layer, "y/x = " . $dy . "/" . $dx . " = " . $m );

	if ( $m > 0 ) {

		dreieck( $layer, $xmin, $ymin, "", $xmax, $ymax, "", $xmax, $ymin, "",
			$farbe, "", "", $linienart, $linienstaerke, $parameter );

	}
	else {
		dreieck( $layer, $xmin, $ymin, "", $xmax, $ymax, "", $xmin, $ymax, "",
			$farbe, "", "", $linienart, $linienstaerke, $parameter );

	}

}

sub sekante {
	my ( $layer, $func, $x, $breite, $farbe, $linienart, $linienstaerke,
		$parameter )
	  = @_;

	linie(
		$layer, $x,
		calcfunk( $func, "x", $x ), "",
		$x + $breite,   calcfunk( $func, "x", $x + $breite ),
		"",             $linienart,
		$linienstaerke, $farbe,
		$parameter,     ""
	);

}

sub sekantendreieck {
	my ( $layer, $func, $x, $breite, $farbe, $linienart, $linienstaerke,
		$parameter )
	  = @_;
	my $y        = calcfunk( $func, "x", $x );
	my $xminwert = $x;
	my $xmaxwert = $x + $breite;
	my $yminwert = calcfunk( $func, "x", $xminwert );
	my $ymaxwert = calcfunk( $func, "x", $xmaxwert );
	my $yabl     = ( $ymaxwert - $yminwert ) / ( $xmaxwert - $xminwert );
	if ( $yminwert > $ymaxwert ) {
		dreieck(
			$layer,    $xminwert,  $yminwert,      "",
			$xminwert, $ymaxwert,  "",             $xmaxwert,
			$ymaxwert, "",         $farbe,         "",
			"",        $linienart, $linienstaerke, $parameter
		);
	}
	else {
		dreieck(
			$layer,    $xminwert,  $yminwert,      "",
			$xmaxwert, $yminwert,  "",             $xmaxwert,
			$ymaxwert, "",         $farbe,         "",
			"",        $linienart, $linienstaerke, $parameter
		);
	}
}

my $labelabstand = 0;

sub setlabelabstand {
	my ($wert) = @_;
	$labelabstand = $wert;
}

sub getlabelabstand { return $labelabstand; }

### Text einfuegen
sub beschriftung {
	my ( $layer, $farbe, $x, $y, $winkel, $ausrichtung, $text ) = @_;
	settexthier("");
	if ( $text ne "" ) {
		if ( $ausrichtung eq "c" ) {
			klammer($winkel);
			paar( $x, $y );
			klammer(
				textfarbe(
					beschriftunggroesse( $text, getbeschriftunggroesse() ),
					$farbe
				)
			);
			beschriftungkopf( $layer, $farbe, $winkel, $ausrichtung,
				gettexthier() );
		}
		else {

			klammer( getlabelabstand() );
			textanhaengen("[");
			textanhaengen($ausrichtung);
			textanhaengen("]");
			klammer($winkel);
			paar( $x, $y );
			klammer(
				textfarbe(
					beschriftunggroesse( $text, getbeschriftunggroesse() ),
					$farbe
				)
			);
			beschriftungkopf( $layer, $farbe, $winkel, $ausrichtung,
				gettexthier() );
		}
	}

	settexthier("");
	my $laenge = length($text);
	if ( ( istzahl($x) == 1 ) && ( istzahl($y) == 1 ) ) {
		minmax(
			$x - ($laenge) * 0.5 / getskalierung("x"),
			$y - ($laenge) * 0.5 / getskalierung("y"),
			$x - ($laenge) * 0.5 / getskalierung("x"),
			$y - ($laenge) * 0.5 / getskalierung("y")
		);
		minmax(
			$x + ($laenge) * 0.5 / getskalierung("x"),
			$y + ($laenge) * 0.5 / getskalierung("y"),
			$x + ($laenge) * 0.5 / getskalierung("x"),
			$y + ($laenge) * 0.5 / getskalierung("y")
		);
	}
}

sub beschriftungkopf {
	my ( $layer, $farbe, $winkel, $ausrichtung, $anhang ) = @_;
	if ( $ausrichtung eq "c" ) {
		befehlerzeugen( $layer, "rput", "", "", "", "", "", $anhang );
	}

	else {
		befehlerzeugen( $layer, "uput", "", "", "", "", "", $anhang );
	}
}

sub einschlussanfang {
	my ( $layer, $farbe, $fuellart, $fuellfarbe, $linienart, $linienstaerke,
		$parameter )
	  = @_;

	befehlfuellungerzeugen(
		$layer,      "pscustom", $farbe, "",
		$fuellfarbe, "",         "",     $parameter,
		"",          "{\\gsave"
	);

}

sub einschlussende {
	my ( $layer, $farbe, $fuellart, $fuellfarbe, $linienart, $linienstaerke,
		$parameter )
	  = @_;

	befehlfuellungerzeugen(
		$layer,      "fill", $farbe, $fuellart,
		$fuellfarbe, "",     "",     $parameter,
		"",          "\\grestore}"
	);
}

1;

