M
minimds
Gast
Hallo
habe ein Problem. Ich lese aus einer Datei Punkt koordinaten und will daraus ein Fläche generieren. Ich arbeite mit einem Canvas Objekt mit der Methode fillPolygon der ich ein xkoordinaten- und ykoordinatenArray (rechne dazu 3D-Punkte in 2D-Koordinaten um)übergeben muss. Damit diese Koordinaten zu einer ganz ausgefüllten Fläche werden müssen diese in Reihenfolge in das Array geschrieben werden(bei 4Eck z.B links oben, rechts oben, rechts unten, links unten). Mein Problem ist es dafür einen Algorithmus zu finden, der auch mit Flächen mit beliebig vielen Ecken zurechtkommt.
Das wäre, was ich bisher zustande gebracht habe. Habe gedacht, dass mehr wie sechs Ecken nicht vorkommen. Dies ist aber doch der Fall. Außerdem gibts bestimmte Fälle in denen dieser Algo falsch sortiert.
Kann mir jemand helfen?
habe ein Problem. Ich lese aus einer Datei Punkt koordinaten und will daraus ein Fläche generieren. Ich arbeite mit einem Canvas Objekt mit der Methode fillPolygon der ich ein xkoordinaten- und ykoordinatenArray (rechne dazu 3D-Punkte in 2D-Koordinaten um)übergeben muss. Damit diese Koordinaten zu einer ganz ausgefüllten Fläche werden müssen diese in Reihenfolge in das Array geschrieben werden(bei 4Eck z.B links oben, rechts oben, rechts unten, links unten). Mein Problem ist es dafür einen Algorithmus zu finden, der auch mit Flächen mit beliebig vielen Ecken zurechtkommt.
Code:
public Vector<Point3d> punkteSortieren(Vector<Point3d> punkte){
Point3d[] temp=new Point3d[2];
Vector<Point3d> erg = new Vector<Point3d>();
//zuerst oberste finden
temp[0]=punkte.get(0);
temp[1]=punkte.get(1);
for(int i=2;i<punkte.size();i++){
if(punkte.get(i).y>temp[0].y){
if(temp[0].y>temp[1].y)temp[1]=temp[0];
temp[0]=punkte.get(i);
}
else if(punkte.get(i).y>temp[1].y)temp[1]=punkte.get(i);
}
//den linken davon zuerst adden
if(temp[0].x<temp[1].x){
erg.add(temp[0]);
erg.add(temp[1]);
}
else{
erg.add(temp[1]);
erg.add(temp[0]);
}
punkte.remove(temp[0]);
punkte.remove(temp[1]);
//unterste Punkte finden
temp[0]=punkte.get(0);
temp[1]=punkte.get(1);
for(int i=2;i<punkte.size();i++){
if(punkte.get(i).y<temp[0].y){
if(temp[0].y<temp[1].y)temp[1]=temp[0];
temp[0]=punkte.get(i);
}
else if(punkte.get(i).y<temp[1].y)temp[1]=punkte.get(i);
}
//den rechten davon zuerst adden
if(temp[0].x>temp[1].x){
erg.add(temp[0]);
erg.add(temp[1]);
}
else{
erg.add(temp[1]);
erg.add(temp[0]);
}
punkte.remove(temp[0]);
punkte.remove(temp[1]);
boolean links = false;
//evtl 5. Punkt einsortieren
while(punkte.size()!=0 && erg.size()==4){
Point3d temp2=punkte.remove(0);
if(temp2.x>=erg.get(1).x || temp2.x>=erg.get(2).x){
erg.insertElementAt(temp2, 2);
}
else if(temp2.x<=erg.get(3).x || temp2.x<=erg.get(0).x){
erg.insertElementAt(temp2, 0);
links = true;
}
else System.out.println("Erg:\n"+erg+"\nPunkt:\n"+temp2);
}
//evtl 6. Punkt einsortieren
while(punkte.size()!=0 && erg.size()==5){
Point3d temp2=punkte.remove(0);
if(links){
erg.insertElementAt(temp2, 3);
}
else{
erg.insertElementAt(temp2, 0);
}
}
return erg;
}
Das wäre, was ich bisher zustande gebracht habe. Habe gedacht, dass mehr wie sechs Ecken nicht vorkommen. Dies ist aber doch der Fall. Außerdem gibts bestimmte Fälle in denen dieser Algo falsch sortiert.
Kann mir jemand helfen?