Autor |
Beitrag |
Geri
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Mo 23.03.09 18:38
Hallo
Ist euch vielleicht einen Alorithmus bekannt mit dem man Polygone von aussen hin zum Zentrum (wie im Dateianhang dargestellt) füllen kann?
Beste Grüsse
Geri
Einloggen, um Attachments anzusehen!
|
|
Kenan
      
Beiträge: 18
|
Verfasst: Mo 23.03.09 18:43
Wie willst du Polygon züge in C# machen?
Ich hätte ein GrafX Paket mit dem man Polygonzüge machen kann!
Wenn du ihn brauchst einfach melden!
mfg
|
|
Greenberet
      
Beiträge: 339
Erhaltene Danke: 20
Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
|
Verfasst: Mo 23.03.09 19:03
Kenan hat folgendes geschrieben : | Wie willst du Polygon züge in C# machen?
Ich hätte ein GrafX Paket mit dem man Polygonzüge machen kann!
Wenn du ihn brauchst einfach melden!
mfg |
mit System.Drawing.Graphics.DrawLines?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 23.03.09 19:53
Bei Polygonen ist das doch noch relativ (naja  ) einfach: Du verlängerst alle Kanten zu Geraden, verschiebst sie in Richtung ihrer Normalen nach innen und schneidest sie wieder, um zurück zu den Strecken zu kommen. Du musst nur darauf achten, dass Kanten ja auch ganz verschwinden können: Wenn sich nach dem Schneiden der Umlaufsinn ändert, schmeißst du die Kante raus.
Das war jetzt vielleicht etwas knapp, aber so sollte es funktionieren.
_________________ >λ=
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Mo 23.03.09 20:53
Hallo zusammen
Vielen Dank für eure raschen Rückmeldungen.
@Kenan: Die Programmiersprache ist mir eigentlich egal. Mich interessiert das Vorgehen. Kann dieses GrafX-Paket etwa die inneren Polygone berechnen?
@Greenberet: Wie man zeichnet ist mir schon klar. Mich interessiert aber wie ich zu den einzelnen Polygonen komme
@KHA: Klingt sehr interessant. Hab mir mal ein paar Fälle nach deinem Algorithmus durchgedacht.
Wenn ich richtig verstehe wird der Polygonzug zuerst nacheinander nummeriert und erhält einen Umlaufsinn.
2.) erzeuge parallele Geraden mit dem Abstand d von der Aussenkontur.
3.) Schneide die aufeinanderfolgenden Geraden miteinander => Schnittpunkte
4.) Verknüpfe die Schnittpunkte zu einem neuen Polygon
5.) Prüfe ob Strecken weg fallen: Wie erkenne ich nun aber bitte einen geänderten Umlaufsinn?
Beste Grüsse
Geri
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 23.03.09 21:11
Genau so. Mittlerweile ist mir aber eingefallen, dass man die Geraden gar nicht explizit berechnen muss, es geht einfacher:
u_k sei der Vektor der k-ten Kante (im Umlaufsinn, alle Vektoren zusammen müssen also einen geschlossenen Vektorzug bilden (Summe = Nullvektor)), dann ist u_k - u_(k-1) ein Richtungsvektor der Winkelhalbierenden zweier aufeinanderfolgender Kanten (je nach Umlaufsinn zeigt er nach innen oder nach außen). Jetzt musst du nur noch über den Kantenschnittpunkt in Richtung dieses Vektors nach innen verschieben, bis er von den Kanten den gewünschten Abstand hat (sollte über Skalarprodukt funktionieren). Für eine Zeichnung habe ich gerade leider keine Zeit  .
Bei den wegfallenden Strecken wird es noch interessanter, als ich gedacht habe: Es kann ja sogar passieren, dass sich dabei ein Polygon in mehrere Einzelpolygone aufteilt. Man muss wahrscheinlich allgemein schauen, ob sich beim errechneten Polygon irgendwelche Kanten schneiden und dann entsprechend neue Punkte und Kanten einführen und alte verwerfen  .
Ich hoffe, diese hingeworfenen Gedankenfetzen können dir weiterhelfen. Ich werde das ganze auch auf jeden Fall mal selbst mit F# und Silverlight umsetzen, aber davor stehen 2 Wochen Abi an  .
_________________ >λ=
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Di 24.03.09 00:32
Hallo Sebastian
Ja, das hast du richtig erkannt. Die Sache wird dann zudem noch etwas aufwändiger wenn sich Polygone im inneren der Aussenkontur (Inseln) befinden.
Meiner Vorstellung nach könnte man evtl. auch hergehen und die Vektoren sortieren, eine innere Kontur bilden und dann die Schnittpunkte aller Strecken miteinander berechnen. Daraus ergeben sich Schnittpunkte. Wenn man sich nun entlang eines Pfades bewegt kommt man vielleicht zu einem Schnittpunkt. Ist dies der Fall, dann sucht man von hinten her das andere Ende des Polygonzuges bis man auch von hier auf diesen Schnittpunkt kommt. Daraus ergibt sich schliesslich ein Polygon. Anschliessend geht man entlang der Kurve weiter. Entsteht ein Polygonzug innerhalb von zwei Schnittpunkten, dann handelt es sich eine Schlinge. Hier gilt nun zu erkennen ob es sich um eine Überlappung eines bereits besuchten Pfades handelt oder um enen neuen Pfad.
Ganz bin ich gedanklich noch nicht am Ende angelangt. Vielleicht ist die Überlegung aber auch zu kompliziert oder nicht ausreichend genau. Bestehen bleibt ja auch noch die Problematik mit den wegfallenden Teilen
Bitte lass es mich jedenfalls wissen, wenn du schlauer geworden bist.
Viel Erfolgb beim Abi, wenn ein Fachbereich Programmieren ist, dann musst du dich ja s.w. nicht so stark vorbereiten  )
Beste Grüsse
Geri
|
|
ene
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Di 24.03.09 08:21
Sieht ja fast wie Fräsbahnen aus  Wir machen etwas ähnliches, allerdings in einer Übertragung des Netzes in 2D. Dabei betrachten wir das Objekt aus Z und erstellen eine Schwarz/Weiss-Fläche. Nun läuft man im Kreis (linksoben->rechtsoben->rechtsunten->linksunten) das Bild von aussen nach innen und verschiebt dabei immer weiter die Kontur nach innen und landet dabei irgendwann bei der Mittellinie des Objekts. Vielleicht wäre das auch ein Ansatz für dich.
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Di 24.03.09 11:52
Hallo Jan
Vielen Dank für Deinen Hinweis. Ja, es soll eine Fräsbahn berechnet werden. Habe ich dich richtig versanden?
Du generierst aus dem Polygon eine gefüllte Fläche und erzeugst ein Bitmap. Dann löschst du von aussen nach innen einezelne Pixel. Anschliessend wird wieder vektorisiert. Stimmt das so?
Beste Grüssse
Geri
PS: Ich habe mich auch schon gefragt ob es hierfü nicht vielleicht eine fertige Programmiertoolbox gibt, welche diese Aufgabe übernehmen kann - wurde aber nicht fündig-.
|
|
ene
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Di 24.03.09 12:53
Äh...weniger. Ich mache ein Abbild aus Blickrichtung Z. Also wenn du dir ein Bitmap vorstellst, ist alles Schwarz was kein Objekt ist und Weiß, was Objekt ist aus der Draufsicht von oben. Und dann läuft man im Kreis von aussen nach innen. Wir verwenden das aus dem Grund, dass wir die Mittellinie des Objekts brauchen. Dafür brauchen wir in 1. Linie keine Vektorisierung. Du kannst es ja aber über einen Maßstab oder halt 1:1 wieder zurückrechnen. Bei einer Fräsbahnberechnung, musst du ja die Fräßbreite mit einbauen und damit dann auch den Pixeln entsprechend die Zustände zuordnen. Wobei meiner Meinung nach alle ERP-Maschinen, in Schichten von "Bildern" arbeiten oder auch die CNC-Fräsen nur Bilder verarbeiten. Denn eigentlich sind das alles "Lochkartenmodell".
Eine fertige ToolBox gibt es wohl nicht, weil die Leute damit Geld verdienen, wenn sie Software für die Fräsaufbereitung erstellen. 
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Di 24.03.09 13:06
Hallo ene
Vielen Dank für die rasche Rückmeldung. Ich glaube, ich habe euer Vorgehen verstanden. Jedenfalls interessant, weil man damit auch die Aussenkontur eines Objektes erkennen kann.
In letzer Konsequenz benötige ich aber Vektoren. Vielleicht macht es aber Sinn darauf zurück zu rechnen. Werde mir mal Gedanken darüber mache. Die Überlegung mit dem Skalieren funktioniert meiner Ansicht nach hier leider nicht.
CNC-Maschinen arbeiten meines Wissens mit Vektoren (z.B. Din G-Code 66025)
Beste Grüsse
Geri
PS: Ich habe mir schon gedacht, dasss so eine Toolbox, welche solche Konturen berechnen kann etwas kosten wird. Ist ja auch nicht ganz einfach umzusetzen, dieser Algorithmus 
|
|
ene
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Di 24.03.09 13:13
Die Vektoren benötigst du ja aber eigentlich nur, wenn du mehr als 3 Achsen hast. Denn der Weg ist durch die Bahn vorgegeben und die Höhe durch die Schicht. So tief stecke ich in den Fräsen aber nicht drin und inzwischen haben wir gekauft und brauchen meine Vorbereitungen nicht mehr 
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
Kenan
      
Beiträge: 18
|
Verfasst: Di 24.03.09 15:46
Berechnen tut das GrafX Paket gar nichts es gibt nur die möglich keit eine Grafik mit einer beliebigen größe zu erstellen!
Mann kann Punkte Linien und Polygonzüge zeichnen!
mfg
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Di 24.03.09 16:20
@ene: Meines wissens arbeiten CNC-Maschinen mit Vektoren z.B: Din 66025 G-code
@Kenan: Vielen Dank aber das Zeichnen ist in meinem Fall nicht das Problem
Beste Grüsse
Geri
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 20.07.09 14:47
Geri hat folgendes geschrieben : | Viel Erfolgb beim Abi, wenn ein Fachbereich Programmieren ist, dann musst du dich ja s.w. nicht so stark vorbereiten ) |
Noch vielen Dank im Nachhinein, Informatik war leider nicht dabei  . Mit meiner frisch gewonnenen Freiheit/Freizeit  wollte ich mich heute mal am Algorithmus versuchen. Zuerst aber noch einmal bei Google vorbeigeschaut und irgendwie ist dieses Mal sogar was Brauchbares herausgekommen  ...
Ein abartiger Algorithmus, auch für Polycurves: cgcad.thss.tsinghua....I2007V58N03P0240.pdf
Eine Open-Source-Lib: www.cgal.org/Manual/..._2/Chapter_main.html
Leider in C++, da bräuchte man also noch einen C++/CLI-Wrapper.
Vielleicht geht es ja dann doch etwas einfacher als in dem PDF für deinen Fall. Du hast also nur ein Polygon und willst als Output wieder eines, oder doch mit Rundungen? Bzw: Besteht das Problem überhaupt noch  ?
Ich führe mir den Algo jedenfalls mal zu Gemüte  .
_________________ >λ=
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Mo 20.07.09 17:39
Also wenn ich das richtig verstehe, passiert bei Bézierkurven ja auch nichts anderes als bei Polygonen (wenn man die Fix- und Bézierpunkte als Eckpunkte eines Polygons betrachtet).
|
|