Skip to main content

Andere Formen

Rechtecke sind ein guter Start, aber für die meisten Grafiken brauchen wir mehr: Kreise, Linien, Dreiecke und andere Formen. Dafür gibt es in Canvas das Konzept der Pfade (Paths).

Was ist ein Pfad?

Ein Pfad ist wie eine Linie, die du mit einem Stift zeichnest, ohne ihn abzusetzen. Du kannst:

  1. Den Stift an einen Startpunkt setzen
  2. Linien und Kurven zeichnen
  3. Am Ende entscheiden: Soll die Form ausgefüllt oder nur der Umriss gezeichnet werden?

Die Grundstruktur eines Pfads

ctx.beginPath();        // 1. Neuen Pfad starten
// ... Pfad zeichnen ...
ctx.fill(); // 3a. Pfad ausfüllen
ctx.stroke(); // 3b. Pfad als Umriss zeichnen

Wichtig:

  • beginPath() startet immer einen neuen Pfad
  • fill() füllt den Pfad aus
  • stroke() zeichnet nur den Umriss
info

Du kannst auch nur fill oder stroke verwenden, falls du das andere nicht benötigst

Kreise zeichnen

Kreise zeichnet man mit arc():

ctx.arc(x, y, radius, startWinkel, endWinkel);

Parameter:

  • x, y: Mittelpunkt des Kreises
  • radius: Radius (Abstand vom Mittelpunkt zum Rand)
  • startWinkel: Wo der Kreis beginnt (in Radiant)
  • endWinkel: Wo der Kreis endet (in Radiant)

Was sind Radianten?

Winkel werden in Radiant statt Grad angegeben:

  • 0 = 0° (rechts)
  • Math.PI / 2 = 90° (unten)
  • Math.PI = 180° (links)
  • 2 * Math.PI = 360° (voller Kreis)

Radiant Kreis

Einen vollen Kreis zeichnen

ctx.fillStyle = "red";
ctx.strokeStyle = "green";
ctx.lineWidth = 40;

ctx.beginPath();
ctx.arc(150, 150, 100, 0, 2 * Math.PI);
ctx.fill(); // Erst füllen
ctx.stroke(); // Dann Rand zeichnen

Dies zeichnet einen rot ausgefüllten Kreis:

  • Mittelpunkt bei (150, 150)
  • Radius 100 Pixel
  • Von 0 bis 2π (voller Kreis)
  • Grüner Rand mit 40 Pixel

Ein Kreis mit roter Füllung und grünem Rand (40px breit)

caution

Die Reihenfolge von fill() und stroke() kann das Ergebnis beeinflussen!

Linien zeichnen

Einfache Linie

ctx.beginPath();
ctx.moveTo(50, 50); // Startpunkt
ctx.lineTo(200, 150); // Endpunkt
ctx.stroke();
  • moveTo(x, y): Setzt den "Stift" an eine Position (ohne zu zeichnen)
  • lineTo(x, y): Zieht eine Linie von der aktuellen Position zu (x, y)

 Eine diagonale Linie von (50, 50) zu (200, 150)

Mehrere verbundene Linien

    ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(250, 50);
ctx.lineTo(250, 250);
ctx.lineTo(50, 250);
ctx.stroke();

Ein seitlicher U-förmiger Linienzug

Geschlossene Form (Dreieck)

ctx.beginPath();
ctx.moveTo(100, 50); // Spitze oben
ctx.lineTo(50, 150); // Ecke unten links
ctx.lineTo(150, 150); // Ecke unten rechts
ctx.closePath(); // Zurück zum Start
ctx.fill();
  • closePath() schließt den Pfad automatisch zum Startpunkt

Ein ausgefülltes schwarzes Dreieck

Linienbreite steuern

Mit lineWidth kannst du die Dicke von Linien und Umrissen ändern:

ctx.lineWidth = 5;  // 5 Pixel breit

Standard: Die Standardbreite ist 1 Pixel.

Beispiel: Unterschiedliche Linienbreiten

ctx.strokeStyle = "black";
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(250, 50);
ctx.stroke();

ctx.lineWidth = 5;
ctx.beginPath();
ctx.moveTo(50, 100);
ctx.lineTo(250, 100);
ctx.stroke();

ctx.lineWidth = 15;
ctx.beginPath();
ctx.moveTo(50, 150);
ctx.lineTo(250, 150);
ctx.stroke();

ctx.lineWidth = 20;
ctx.beginPath();
ctx.moveTo(50, 200);
ctx.lineTo(250, 200);
ctx.stroke();

ctx.lineWidth = 25;
ctx.beginPath();
ctx.moveTo(50, 250);
ctx.lineTo(250, 250);
ctx.stroke();

Fünf horizontale Linien übereinander mit unterschiedlichen Breiten (1px, 5px, 15px, 20px, 25px)

info

lineWidth bleibt aktiv wie fillStyle und strokeStyle. Setze es vor dem Zeichnen!

Übung: Pacman

Aufgabe: Nutze die Informationen aus diesem Kapitel, um Pacman zu zeichnen.

Tip: Du kannst Arcs und Lines kombinieren.

Gelber Pacman mit schwarzem Rand