--Musterlösung Bogen 7 Aufgabe 2

-- Typedeklaration nach Aufgabenstellung:
type Point = (Float,Float)
type Line1 = (Float,Float)				-- Geraden der Form y=a*x+b
type Line2 = (Float,Float,Float)		-- Geraden, die die Lösung von a*x+b*y=c sind.

--Aufgabe 2 a)
{-pointOverLine bestimmt ob ein Punkt im geometrischen Sinne über einer Geraden liegt, hierfür wird der Wert der Geraden an der 
gegeben x-Stelle berechnet und mit dem gegeben y-Wert verglichen-}
pointOverLine::Point->Line1->Bool
pointOverLine (x,y) (a,b)					= y>a*x+b	{-Die Gerade hat die Form f(x)=a*x+b, also schaut man ob y>f(x)
														und liefert das Ergebnis des Vergleiches zurück-}


--Aufgabe 2 b)
{-parallelLine berechnet die in den Punkt (x,y) verschobene Gerade, diese hat die selbe Steigung also a, man muss nur noch den 
absoluten Term bestimmen, da aber für die verschobene Gereade g gelten muss, dass g(x)=y, folgt, dass der absolute Term gleich
y-a*x sein muss. -}
parallelLine::Line1->Point->Line1
parallelLine (a,b) (x,y)					= (a,y-a*x)


--Aufgabe 2 c)
{-cross soll den Schnittpunkt zweier Geraden berechnen.-}
cross::Line1->Line1->Point
cross (a,b) (c,d) 	| a==c 		= error"Die Geraden sind parallel!"	-- Da gleiche Steigung ==>Parallelität
					| otherwise	= ((d-b)/(a-c),a*((d-b)/(a-c))+b)	{- Ansonsten werden die Geraden gleichgesetzt, und es wird 
																	somit der Schnittpunkt berechnet.-}

					
--Aufgabe 2 d) (Aufgabe 2a)-c) nochmals mit den Geraden zweiter Form)
pointOverLine2::Point->Line2->Bool
pointOverLine2 (x,y) (a,b,c)| a==0 && b==0	= error "Das ist keine Gerade!!"
							| b==0 			= error "Das ist eine senkrechte Gerade ... "
							| otherwise		= y>(((-a)/b)*x+(c/b)) 	{-Wenn b ungleich Null ist kann man a*x+b*y=c  
																	nach y auflösen und dann analog zu 2a) verfahren.-}

parallelLine2::Line2->Point->Line2
parallelLine2 (a,b,c) (x,y)	| a==0 && b==0	= error "Das ist keine Gerade!!"
							| b==0 			= (1,0,x)						-- Eine senkrechte Gerade durch (x,y)
							| a==0 			= (0,1,y)						-- Eine waagerechte Gerade durch (x,y)
							| otherwise		= ((-(a/b)),1,(-(b*c)/(a^2)))	-- Ebenfalls in Analogie zu 2b) gelößt

cross2::Line2->Line2->Point
cross2 (a,b,c) (d,e,f) 	| a*e==d*b	= error"Die Geraden sind parallel!"		{- Auch wird die Lösungsmenge gesucht, die beide 
																			Gleichungen erfüllt, für a*e==d*b gibt es keine 
																			eindeutige Lösung, da die Geraden dann parallel, oder
																			identisch sind.-} 
						| a==0 		= cross2 (d,e,f) (a,b,c)			    {- Hier wird ohne Beschränkung der Allgemeinheit vorraus-
																			gesetzt, dass a/=0 ist ansonsten, wird die Funktion mir 
																			vertauschten Parametern nochmals aufgerufen, dieses 
																			funktiniert, da hier nicht a und d null sein können, da 
																			man sonst im ersten Fall wäre.-}
						| otherwise	= ((c/a)-((b/a)*((f-(d*c/a))/(e-(d*b/a)))),((f-(d*c/a))/(e-(d*b/a))))	{-Dieses ist die Lösung
																			dess Gleichungsystems.-}
																						
																						
--Aufgabe 2e)
{-fromOne2Two wandelt Line1	in Line 2 um-}
fromOne2Two::Line1->Line2
fromOne2Two (a,b) = (a,(-1),(-b))	-- Ein einfaches Umformen liefert das gewünschte Ergebnis.

{-fromTwo2One wandelt Line2	in Line 1 um, wenn möglich-}
fromTwo2One::Line2->Line1
fromTwo2One (a,b,c) | b==0 		= error "Diese zur Y-Achse parellele Gerade, kann nicht in der Form y=m*x+c dargestellt werden."
					| otherwise = ((-a)/b,c/b)
		
