Hallo Community,
ich habe Momentan die Aufgabe für meinen Kurs Computergrafik einen Scanline Algorithmus zu implementieren bin aber ziemlich überfordert.
die genaue Aufgabenstellung findet man hier Blatt 3 das Projekt das man erweitern muss befindet sich im Anhang —> Computergrafik SoSe 2014
das sind die klassen wo ich momentan dran arbeite :```package model.drawables;
import java.awt.Graphics;
import java.util.LinkedList;
import java.util.List;
import model.Matrix;
/**
-
Ein grafisches Objekt, dass ein Polygon repraesentiert. Die einzelnen
-
Polygonpunkte sind in einer Liste abgelegt. Der erste Punkt ist nicht doppelt
-
abgelegt, d.h. die letzte Kante ist vom letzten Punkt zum ersten Punkt zu
-
ziehen.
-
@author
*/
public class Polygon extends DrawableObject {protected List points; // Liste mit Eckpunkten
protected boolean filled;
protected List edges = new LinkedList();/**
- Erstellt ein Polygon
- @param points
-
Punkte-Liste
- @param filled
-
soll das Polygon gefüllt sein?
*/
public Polygon(List points) {
this.points = points;
}/**
- Zeichnet das Polygon in den uebergebenen grafischen Kontext und fuellt es
- gegebenenfalls.
- @param g
-
der grafische Kontext, in den dieses Objekt sich zeichnen soll
*/
public void paint(Graphics g) {
Line l;
Point prev = null;for (Point p : points) { if (prev != null) { l = new Line(prev, p); Edge kante = new Edge() l.paint(g); } prev = p; } // Polygon schließen, Linie zeichnen l = new Line(prev, points.get(0)); l.paint(g);
}
/**
- Gibt true zurück, wenn der Punkt im Polygon liegt, false sonst.
- @param p
-
der zu prüfende Punkt
-
@return true, wenn p innerhalb des Polygons liegt
*/
public boolean isNear(Point p) {
return true; // noch zu implementieren
}
/**
- Transformiert das Polygon mit Hilfe der übergebenen
- Transformationsmatrix.
- @param m
-
die Transformationsmatrix
*/
public void transformBy(Matrix m) {
List a = new LinkedList();
for (Point p : points) {p = m.multiply(p); a.add(p); } points = a; return; // noch zu implementieren
}
/**
- Wendet das Scanline-Verfahren zum Fuellen eines Polygons an
- @param g
-
der grafische Kontext, in den dieses Objekt sich zeichnen soll
*/
private void scanlineFill(Graphics g) {
return; // noch zu implementieren
}
}```
/**
*
* @author Fujitsu
*
* Klasse zur Repräsentation einer Kante.
*
*/
public class Edge implements Comparable<Edge> {
/** groesste y-Koordinate der Kante. */
public int y_top;
/** Schnittpunkt der Scan-Line mit der Kante. */
public double x_int;
/** y-Ausdehnung der Kante. */
public int delta_y;
/** inverse Steigung 1/s der Kante. */
public double delta_x;
/**
* Erzeugt ein Objekt vom Typ Kante mit den uebergebenen Parametern.
* */
public Edge(int y_top, double x_int, int delta_y, double delta_x) {
this.y_top = y_top;
this.x_int = x_int;
this.delta_y = delta_y;
this.delta_x = delta_x;
}
/** Erzeugt ein Objekt vom Typ Kante mit den uebergebenen Parametern. */
/** Erzeugt ein leeres Objekt vom Typ Kante. */
public Edge() {
this(0, 0.0, 0, 0.0);
}
@Override
public int compareTo(Edge o) {
return this.y_top-o.y_top;
}
}```
ich habe die Klasse Edge geschrieben um die Kanten zu repräsentieren und das Interface Comparable implementiert um 2 Kanten nach ihrem Größten y Wert zu vergleichen. Außerdem speichere ich in der Klasse Polygon eine LinkedList von Edges. Ist das schonmal grob in die richtige Richtung gedacht ?? Könnt ihr mir Tipps geben
mit freundlichen Grüßen