Maybe people like butterfly vomit

Herausfinden, ob ein Punkt in einer Ellipse liegt

Informatik von Seba

Ein Artikel darüber, wie man herausfindet, ob ein Punkt (von einem Mausklick) innerhalb einer bestimmten geometrischen Form (hier: einer Ellipse) liegt, diese sich aber nicht im Koordinaten-Ursprung befinden und noch dazu rotiert wurden.

Das Ziel

Auf einer <canvas>-Fläche befinden sich mehrere Figuren. Klickt man auf die Fläche, soll die getroffene Figur ausgewählt werden. Die Figuren können sich sonstwo befinden und wurden unter Umständen auch rotiert.

Das Ellipsen-Objekt

Zum Zeichnen eines Ellipsen-Objektes werden ein paar Informationen benötigt. Dies sind meine Variablennamen und ihre Bedeutung:

x, y, width, height
Geben die Position auf dem Canvas und Breite/Höhe an.
rotate
Rotationswinkel, der angewendet werden soll. Als Einheit werden Rad verwendet (360° = 2π rad).
ctx
Der 2D-Kontext des Canvas, dessen Funktionen zum Zeichen verwendet werden.

Zeichnen der Ellipse

Der folgende Code stammt von Web Reflection: ellipse and circle for canvas 2d context.

draw: function() {
	var hB = ( this.width / 2 ) * .5522848,
		vB = ( this.height / 2 ) * .5522848,
		eX = this.x + this.width,
		eY = this.y + this.height,
		mX = this.x + this.width / 2,
		mY = this.y + this.height / 2;

	this.applyRotation();

	this.ctx.beginPath();
	this.ctx.moveTo( this.x, mY );
	this.ctx.bezierCurveTo( this.x, mY - vB, mX - hB, this.y, mX, this.y );
	this.ctx.bezierCurveTo( mX + hB, this.y, eX, mY - vB, eX, mY );
	this.ctx.bezierCurveTo( eX, mY + vB, mX + hB, eY, mX, eY );
	this.ctx.bezierCurveTo( mX - hB, eY, this.x, mY + vB, this.x, mY );
	this.ctx.closePath();

	this.ctx.fill();
}

Die Rotation wende ich in einer eigenen Funktion auf den Canvas-Kontext selbst an. Damit sich die Ellipse dabei nicht verschiebt, muss ihr Mittelpunkt zuerst in den Koordinaten­ursprung verschoben werden mit translate(x, y). Danach wird sie rotiert und wieder an ihre vorherige Position gesetzt.

applyRotation: function() {
	if( this.rotate != 0 ) {
		var xShift = this.x + parseInt( this.width / 2 ),
			yShift = this.y + parseInt( this.height / 2 );

		this.ctx.translate( xShift, yShift );
		this.ctx.rotate( this.rotate );
		this.ctx.translate( -xShift, -yShift );
	}
}

Wundert sich schon jemand, warum erst nach (xShift, yShift) und später nach (-xShit, -yShift) verschoben wird? Von der Logik her muss es natürlich andersherum sein und so geschieht es intern auch. Bei Funktionen wie translate() und rotate() werden entsprechend Matrizen multipliziert. Eine Besonderheit bei der Matrizenmultiplikation ist es, dass die Faktoren in umgekehrter Reihenfolge aufgelistet werden müssen, als sie dann Anwendung finden.

weiterlesen

Computergrafik: Unsere OpenGL-Achterbahn

Informatik, Studentendasein von Seba

Der Kurs Computergrafik (CG) ging nur das halbe Semester über, dafür mit zwei Terminen pro Woche. Endabgabe fürs Praktikum war es, mit Python und OpenGL eine Achterbahn zu bauen. Genau sahen die abzuhakenden Punkte wie folgt aus:

  • Die Bahn der Achterbahn soll als geschlossene B-Spline-Kurve beschrieben werden. (Dazu kommt gleich noch etwas.)
  • Der Coaster der Achterbahn soll texturiert sein.
  • Die Szene soll von einer Skybox umgeben sein.
  • Mit den Tasten + und - soll die Geschwindigkeit verändert werden können.
  • Mit der Taste K soll zwischen einer Kameraposition auf dem Coaster und einer Gesamtansicht gewechselt werden können.
  • Die Orientierung der Kamera soll per Maus verändert werden können.

Sagen wir es mal so: Wir (meine 3er-Gruppe) haben fast alles irgendwie hinbekommen. Und ja, das Video zu Beginn zeigt eben jenes unseres Endprodukt. (Unter beabsichtigter Nicht-Darstellung einiger Bugs. ;) ). Aufgenommen hat es Kai.

weiterlesen

Danach die Leere

Unkategorisiert von Seba

Die ganze Lernerei die letzten Tage und Wochen und jetzt ist das Mathe-Abi einfach vorbei. Aber erzähle ich chronologisch:

Den Morgen leicht übel begonnen, dennoch nicht zittrig. Nach Ankunft in der Schule fühle ich mich bestens. So ziemlich die gesamte Stufe 13 steht bereits in der Pausenhalle. Die Plakateflut hat über Nacht weiter zugenommen. Man könnte mittlerweile die gesamte Schule einwickeln. Mit Schleifchen oben drauf. Man unterhält sich, wünscht sich Glück und Hals- und Beinbruch. Schließlich Kollektivwanderung in die Oberstufenebene, warten auf Lehrer, Lehrer kommen, Platz einnehmen. Ich ergattere einen Fensterplatz.

Alle Gegenstände auf den Tisch, Handys zentral vorm Lehrer gelagert. Besonderheit des Raumes: Kleine Tische. :\ Äh, ja, toll. Aber das hält einen Abiturienten doch nicht auf! Dann Auswahl einer Aufgabe für den Bereich Analysis. Mal im Ernst: Wer hat schon Vorschlag 1 genommen? Irgendetwas über eine Flasche (Rotationskörper), die dann auch noch umdesignt wird und … so Käse. Wahl getroffen. Bearbeitung. Analysis läuft super. Lineare Algebra … ist doof … gelaufen. Warum nicht einfach Eckpunkte eines Hauses bestimmen und dann den Schatten eines Laternenpfahles gegenüber? Das hätte ich 1A gekonnt. Naja, ich hoffe, dass noch einige Punkte dabei rausspringen. Schließlich Stochastik. Stochastik finde ich toll, interessant, faszinierend. Auf die Abi-Aufgaben konnte ich diese Euphorie nicht übertragen. Aber es ging … es ging. Ich hoffe nun doch auf 10 Punkte. Im Wunschdenken sind es mindestens 10 Punkte.

Während dem Abi eine „Fensterschlacht“ mit meinem Tutor (ist zwischendurch Aufsichtsperson gewesen) geliefert. Er macht das Fenster auf – ich friere und schließe es – er macht es fünf Minuten später wieder auf – ich friere und schließe es – usw. :D

So, geschafft, anschließendes Palaver mit allen anderen Grundkurslern (Die LKler haben eine Stunde mehr Zeit). Es überwiegt die Freude es hinter sich zu haben.

Und noch ein tolles Abi-Plakat, made by Miri:
Miris Plakat
Man beachte auch den Rochen mit Schnurrbart bei meinem Namen!

Und dann bin ich ganz normal mit dem Bus nach Hause. Und fühle mich leer. Die gesamte angesammelte Mathematik ist aus mir raus. Was mache ich heute? Ich habe keine Lust, nichts zu machen. Vielleicht einen Spaziergang. Könnte ich mit Projekt 52 verbinden. Ich habe noch einiges Nachzuarbeiten und das neue Thema: Architektur.