Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (26.04.2016, 16:25)
Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.
... und diese Signatur kürzer!
- übersichtlicher
- logischer
- verständlicher
Dann lass das mal dein Programm rausfinden...Nur Verbindungen zeichnen zu dürfen, die innerhalb der Form liegen
Warum machst du es nicht so? Bisher wurde nur dagegen eingewendet, dass es nur bis 2 Schnittpunkte funktioniert. Ist doch kein Problem - du musst so oder so die Schnittpunkte alle berechnen, dann kannst du sie auch gleich Zählen und je nach Anzahl verschiedene Algorithmen drauf loslassen:Dein Algorithmus sieht dann folgendermaßen aus:
- Zu jedem Ausgangspunkt die 2 direkt mit ihm verbundenen Ausgangspunkte herausfinden und so abspeichern, dass der Algorithmus schnell diese 2 Punkte/Strecken zu jedem Punkt herausfinden kann.
- Berechnung aller Schnittpunkte durch simples Durchiterieren aller Möglichkeiten. Diese Punkte werden dann so abgespeichert, dass der Algorithmus schnell zu jeder Strecke die Anzahl und die auf ihr befindlichen Schnittpunkte herausbekommen kann.
- Zu jedem Ausgangspunkt die beiden nächsten mit ihm verbundenen Punkte herausfinden:
- Eine Strecke hat keinen Schnittpunkt - der Endpunkt ist der gesuchte Punkt.
- Eine Strecke hat 1 Schnittpunkt - der Schnittpunkt ist der gesuchte Punkt.
- Eine Strecke hat 2 Schnittpunkte - der am nächsten liegende Punkt ist der gesuchte Punkt - mit Pythagoras oder beim Schneiden gespeicherten Werten Werten herausfinden.
- Die beiden nächsten Punkte zu einem Ausgangspunkt spannen das Dreieck auf.
Das müsste man umgehen, damit das dem Algorithmus nicht mehr wichtig sein muss. Ich denke, ich habe auch schon eine Idee - ich probiere mal aus und formuliere das mal verständlich!Da du ja maximal 5 verschiedene Ausgangspunkte hast, ist die Zahl der Flächen begrenzt, die sich erzeugen lassen. Es lassen sich maximal 3 Flächen konstruieren. Es gibt maximal 2 Schnittpunkte - daher muss jedes Dreieck mindestens eine Ecke haben, die ein Ausgangspunkt ist. Das ist ein Vorteil: Wenn du für jeden Ausgangspunkt die angrenzende Fläche gefunden hast, dann hast du zwingend alle Teilflächen gefunden. Außerdem kann jeder Ausgangspunkt nur eine einzige angrenzende Fläche haben.
Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.
... und diese Signatur kürzer!
- übersichtlicher
- logischer
- verständlicher
C#-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
/// ------------------------------------------------------------------------------------------------------------------------ /// <summary> /// Berechnet die Schnittpunkte /// </summary> private void BerechneSchnittpunkte() { for (int i = 0; i < 5; i++) { for (int j = i + 1; j < 5; j++) { BerechneSchnittpunkte(i, j); } } } /// ------------------------------------------------------------------------------------------------------------------------ /// <summary> /// Berechnet die Schnittpunkte /// </summary> /// <param name="start1"></param> /// <param name="start2"></param> private void BerechneSchnittpunkte(int start1, int start2) { int ende1 = start1 + 1; if (ende1 == 5) { ende1 = 0; } int ende2 = start2 + 1; if (ende2 == 5) { ende2 = 0; } BerechneSchnittpunkte(punktListe[start1], punktListe[ende1], punktListe[start2], punktListe[ende2]); } /// ------------------------------------------------------------------------------------------------------------------------ /// <summary> /// Berechnet die Schnittpunkte von 2 Linien - y = m*x+b /// </summary> private void BerechneSchnittpunkte(Point start1, Point ende1, Point start2, Point ende2) { double dx1 = ende1.X - start1.X; double dy1 = ende1.Y - start1.Y; double dx2 = ende2.X - start2.X; double dy2 = ende2.Y - start2.Y; double m1 = dy1 / dx1; double m2 = dy2 / dx2; double b1 = start1.Y - start1.X * m1; double b2 = start2.Y - start2.X * m2; double schnittpunktX = (b1 - b2) / (m2 - m1); double schnittpunktY = m1 * schnittpunktX + b1; //------- TEST if (m1 == m2 && b1 == b2) { Console.WriteLine("Unendlich viele Schnittpunkte " + "Xs: " + schnittpunktX + " Ys: " + schnittpunktY); } else if (m1 == m2 && b1 != b2) { Console.WriteLine("0 Schnittpunkte " + "Xs: " + schnittpunktX + " Ys: " + schnittpunktY); } else { Console.WriteLine("1 Schnittpunkt " + "Xs: " + schnittpunktX + " Ys: " + schnittpunktY); } Rectangle rect = new Rectangle(Convert.ToInt32(schnittpunktX), Convert.ToInt32(schnittpunktY), Convert.ToInt32(b1), Convert.ToInt32(b2)); if (rect.Contains(Convert.ToInt32(schnittpunktX), Convert.ToInt32(schnittpunktY))) { Console.WriteLine("Punkt liegt drin"); } else { Console.WriteLine("Punkt liegt nicht drin"); } //------- TEST } |
Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.
... und diese Signatur kürzer!
- übersichtlicher
- logischer
- verständlicher
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CeDoMain« (27.04.2016, 21:42) aus folgendem Grund: Leserlicher Formatiert
Da mir diese Aussage dann doch ein bisschen fies vorkommt, schreib ich mal eine Lösungsmöglichkeit auf: Mit der Cramerschen Regel und Determinanten lässt sich ein 2x2 LGS sehr leicht lösen. Damit ich nicht so viel schreiben muss, definiere ich erstmal ein paar Konstanten. Das kannst du im Programm dann auch machen.Wie du das machst, ist dir überlassen.
Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.
... und diese Signatur kürzer!
- übersichtlicher
- logischer
- verständlicher
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CeDoMain« (30.04.2016, 00:23) aus folgendem Grund: Fehler markiert
Werbeanzeige