PDA

View Full Version : [Frage] Runde 3, Beispiel 3154!!!


FallenAngel
20-05-2003, 01:41
hallo allerseits!!!

ich hätte zur dritten runde mal eine frage:

in der angabe steht folgendes: Sie haben Lösungen (und Spezifikationen) aus der 1. Runde von anderen Studenten erhalten, die Ihnen Ihre Aufgabe erleichtern sollen. Wählen Sie eine Lösung aus, die Ihnen hinsichtlich Lesbarkeit, Programmierstil, Korrektheit und Verwendbarkeit am besten erscheint. Verwenden Sie diese Lösung in Ihrem Programm.

ich bin mir jetzt nicht ganz sicher, soll ich das ganze programm verwenden oder nur teile daraus die mir helfen, oder ist es egal ob ich es überhaupt verwende???

thx schon mal :engel:

Filz
20-05-2003, 01:51
Wenn das Programm zu deiner Aufgabenstellung passt und es funktioniert - und du es leicht einbauen kannst - warum nicht?

Aber im Prinzip ist es komplett egal, was du damit machst - dein Gesamtwerk muss funktionieren...

FallenAngel
21-05-2003, 10:43
axo ich dachte wir müssen das programm verwenden, nun gut danke für die hilfe.

eine frage hätte ich noch:

hätte jemand einen ansatz wie ich sowas berechnen könnte, weil die methode die ich rausgekriegt habe, die lässt sich leider nicht in java umsetzen.

hier ne Beschreibung von meiner Angabe:


Die Eckpunkte eines Vielecks werden eingelesen; es wird überprüft, ob die Kanten des Vielecks einander schneiden. Wenn dies nicht der Fall ist, wird festgestellt, ob das Vieleck konvex ist.

Lesen Sie die Koordinatenpaare der Eckpunkte eines Vielecks ein. Prüfen Sie, ob sich zwei Kanten des Vielecks schneiden. Wenn dies nicht der Fall ist, stellen Sie fest, ob das Vieleck konvex ist (daß heißt, das alle Innenwinkel<180° sind).


Wäre super wenn sich wer melden würde.

thx :engel:

Bruno
21-05-2003, 12:23
wieso lässt sichs nicht in java umsetzten? das ist doch eh eine recht mächtige sprache...

naja ich würd mit einem rekursiven aufruf alle kanten des vielecks durchgehen allen anderen schneiden. wenns einen schnittpunkt gibt, dann steht vermutlich eh in der angabe, was ausgegeben werden soll, und wenns keinen gibt, dann berechne mit dem skalaren produkt die winkel zwischen den vektoren und schau, ob die größer oder kleiner sind als 180...

hab ich die angabe so richtig verstanden?

Bruno

FallenAngel
21-05-2003, 12:30
na ja ich hab mir das so überlegt, ich zeichne mir auf wo die punkte liegen und verbinde sie dann von p1 bis pn, jedoch hab ich keine ahnung wie ich das in java umwandeln soll, auf dem papier selber ist das ja nicht so schwer.

ich denke du hast das sogar ins schwarze getroffen, mein problem ist ich bin kein mathe genie, sprich wie weiß ich wie groß die einzelnen winkel sind??? bzw. was meinst du mit rekursiver aufruf???

*ein bißchen an dem beispiel verzweifel*

Bruno
21-05-2003, 12:59
keine sorge, wir schaffen das schon!

naja zeichnen kannst du mit java zwar, aber du sollst es in eprog nicht machen... da sollst es ja berechnen und nicht zeichnen ;) du mußt da immer den vektor zwischen zwei punkten bilden (also von p1 nach p2, von p2 nach p3 ... von pn-1 nach pn. wie man sich die vektoren berechnet steht eh ziemlich sicher in den zusatzprogrammen, die du zum programm bekommen hast. dann berechnest du den schnittpunkt zwischen den zwei vektoren.

der schnittpunkt liegt dann irgendwo auf einer geraden, die länger ist, als die distanz zwischen anfang- und endpunkt, weil ein vektor streng genommen ja nur eine richtung angibt. wenn der punkt zwischen dem anfang und dem endpunkt liegt, schneiden sich die zwei geraden wirklich. wenns nicht zwischen anfang und endpunkt liegt sondern irgendwo jenseits davon, dann schneiden sich die beiden kanten nicht (weil sie sich in dem fall nur dann schneiden würden, wenn sie länger wärn)

wenns also keinen schnittpunkt gibt, dann berechne mit dem skalaren produkt die winkel. (V1.V2= V1x*V2x+V1y*V2y+V1z*V2z und davon den arctangens glaub ich) damit hast dann die winkel.

ein rekursiver aufruf ist,w enn das programm sich selbst nochmal startet. ich hab mir mal die angabe auf sourceforge durchgelesen und es müßt auch mit for-schleifen statt mit einem rekursiven aufruf gehen. das ist für dich vermutlich leichter, wennst dich mit rekursiven aufrufen nicht auskennst, aber für runde 4 mußt du dir die unbeding ansehen - da MUSST du dein prog so lösen...

Bruno

FallenAngel
21-05-2003, 13:14
ok das mit den rekursiven aufruf könnte ich vielleicht sogar irgendwie kriegen, muss ich mir nochmal genauer angugen.

zu vektor: heißt soviel wie ich muss x und y immer im vektor ausrechnen oder?? sprich x+y, und was genau sagt mir dann das ergebnis??? bzw. hab ich das überhaupt so richtig verstanden??? wo nehm ich diese gerade her, bzw. wie genau kann ich da den schnittpunkt berechnen???

ich weiß die fragen sind meist recht blöd die ich stelle, aber leider hab ich von sowas echt keine ahnung weil wie in der schule nie mit sowas gerechnet haben. :(

Bruno
21-05-2003, 13:45
gut, werden wir mathematisch! :verycool:

also, wie berechnet man den schnittpunkt zwischen 2 vektoren (bzw 4 punkten ;) )

wir haben also 4 punkte p1-p4 mit den koordinaten (x1, y1) bis (x4, y4)

die zwei vektoren g1 und g2 ergeben sich aus (ähm, ist ein bisserl schwer, dsa hier zu schreiben, so vonwegen formatierung und so... ich probiers mal):

hab doch gewußt, daß das mit der formatierung nicht hinhaut! die klammern sind 2dim vektoren bzw 2X2 matrizen und gehören übereinander

(x1) (x2-x1)
g1= (y1)+r*(y2-y1) bzw für g2 das selbe mit p3 und p4. x1, y1 ist der startpunkt, der ausdruck nach dem r die steigung und r der faktor, der die länge des vektors bestimmt.

diese gleichungen setzten wir jetzt gleich (sprich: g1=g2, weil der punkt, der auf g1 liegt, ja auch auf g2 liegen muß). das ergiebt dann:


(x1) (x2-x1) (x3) (x4-x3)
(y1) + r * (y2-y1) = (y3) + s * (y4-x3)

und wennst das umformst, kommst auf :

(x2-x1) (x4-x3) (x3-x1)
r * (y2-y1) - s * (y4-y3) = (y3-y1)


damit hast du zwei gleichungen, nämlich eine für die x und eine für die y koordinate. damit kannst du dir dann r und s ausrechnen. und wenn rund s zwischen 0 und 1 liegen, dann befindet sich der schnittpunkt innerhalb der zu überprüfendne linien.

das skalare produkt:

du hast zwei vektoren

(x1) (x2)
v1=(y1) v2=(y2) dann ist das skalare produkt (x1*x2)+(y1*y2) (also eine zahl) aus der du dir dann mit dem arctangens den winkel berechnen kannst.

Bruno

FallenAngel
21-05-2003, 13:52
wow das sieht ja sehr mathematisch aus, hm nun gut ich denke damit kann ich echt was anfangen *danke bruno*

aber eine frage hab ich noch: was ist der arctangens??? *doofgug*

den rest glaube ich fürs erste mal verstanden zu haben, muss es ja nur noch umsetzen. ^^

Bruno
21-05-2003, 14:00
das skalare produkt rechnet dir von dem winkel den tangens aus. da du den aber nicht brauchst sondern den winkel selbst, mußt du den tangens wieder zurückverwandeln und das geht mit dem arctagens, der eben genau das gegenteil vom tangens macht. wie genau du den berechnest weiß ich jetzt leider auch nicht auswendig (irgendwas mit cosinus / sinus statt sinus/ cosinus oder sowas wer weiß? :shinner: ), aber ich glaub, da gibts in java eh einen befehl dafür. wenn nicht, werd ich mal ich in meinem alten mathebuch nachlesen. ;)

ich hoff auf jeden fall, das klappt so! wennst noch probleme damit hast, meld dich!

Bruno

jeuneS2
21-05-2003, 15:04
...das skalare Produkt is proportional zum Cosinus, nicht zum Tangens! Genauer gesagt gilt (y).(y)=cos(phi(x,y))*|x|*|y| (ich hoff in der Schreibweise is klar was gemeint ist)

FallenAngel
21-05-2003, 15:56
hm, was ich aber wiederum nicht verstehe:

wenn ich das skalare produkt ausreche, mach ich das eben für jeden einzelnen punkt, sprich zuerst zwischen p1 und p2, dann zwischen p2 und p3... und immer so weiter, soweit ists ja noch klar, aber was dann???

Bruno
21-05-2003, 16:49
@ jeuneS2: hupsala! stimmt! sorry! danke, daß du mich drauf aufmerkam gemacht hast! mathe war noch nie meine starke seite... :shinner:

@FallenAngel: nein, das hast du falsch verstanden! das skalare produkt ist zum ausrechnen von winkeln! dazu nimmst du zwei vektoren, nicht zwei punkte! (du kannst ja keinen winkel zwischen zwei punkten ausrechnen ;) ) du nimmst den vektor von p1 nach p2 und den vektor von p3 nach p4 und machst mit diesen beiden vektoren das skalare produkt!


@FallenAngel: ich zeig dir am besten das skalare produkt schnell anahnd eines kleines bsps, bevorst noch total verwirrt bist:

wir haben zwei vektoren:

v1(1,0) (=x-achse)
v2(1,1) (=45-grad-steigung)

jetzt berechnen wir zuerst v1.v2 => 1*1+0*1 = 1

jetzt setzen wir in die obere formel ein und erhalten:

1=wurzel_aus(1+1)*wurzel_aus(1+0)*cos(alpha)

und das lässt sich umformen auf:

1/(wurzel_aus(2))=cos (alpha)

=> cos (alpha) = 0,7...
=> alpha= arccos(0,7...)
=> alpha=45

und damit haben wir unseren winkel.



Bruno

FallenAngel
21-05-2003, 20:44
nur damit ich mir jetzt auch 100 pro sicher bin das ich das auch verstanden habe.

wenn ich das zweite beispiel hernehme, was in meiner angabe war, und mir hier die winkel ausrechne, dann geh ich folgendermaßen vor???

Eingabe:
(0,0) (2,0) (4,2) (4,4) (2,4) (0,2) =

dann hab ich

v1(0,2) =
v2(0,0) =

v1.v2=0*0+2+0=0

würd in dem fall ja 0 ergeben kann ja nicht ganz stimmen oder??? bzw. wo hab ich mich vertan???
wenn du es mir auf das beispiel oben erklären könntest, würde ich es sicher noch besser verstehen :). sprich welche zahlen du da genommen hast, weil so kann ichs mir leider nicht ganz so gut vorstellen.

eine frage hab ich noch, ich hab das beispiel was bruno da oben gerechnet hat ein bißchen nachgerechnet, bis zum cos=0,7 komm ich ja auch, aber wie komm ich dann auf alpha, bzw. was bedeutet accos???


und bei v2 noch: woher weiß ich das es eine 45 grad steigung ist???

Bruno
21-05-2003, 21:07
ich weiß, daß es eine 45 grad-steigung ist, weil ich
a) es ja berechnet hab und
b) absichtlich die zahlen so gewählt hab ;) wär ja blöd, wenn da ein wirklich schiaches ergebnis rauskommt...

sag mal, wie bist du denn auf die vektoren gekommen? also wenn ich das bsp nicht falsch verstanden hab, gehst du einfach von punkt 1 nach punkt 2 (=v1) und dann von punkt 2 nach punkt 3 (=v2) =>

v1= (2,0)
v2= (2,2) (und wir sehen bereits an dieser stelle: das wird wieder eine 45-grädige steigung ;) )

einen vektor mit (0,0) kanns by the way nicht geben - der würd ja nirgends hinzeigen. :p

wir haben jetzt also die beiden vektoren, die wir in die formel einsetzten.

=> v1.v2=2*2+2*0=4

jetzt setzen wir weiter ein

=> 4=wurzel_aus(4)*wurzel_aus(8)*cos(alpha)

umgeformt: 4/(2*wurzel_aus(8))=cos(alpha)

=> cos(alpha)=0.707...
=> alpha=45

und wir haben einen winkel mit 45 grad. das kannst leicht überprüfen, indemst das ganze aufzeichnest (das polygon sollte wie ein "D" aussehen)

im letzten schritt hab ich wieder den arccos verwendet.
arccos ist das selbe, wie der von mir vorher fälschlich vorgeschlagene arctangens. arccos verwandelt einen cosinuswert wieder zurück in den ursprünglichen winkel.

hab ich alle klarheiten restlos beseitigen können? :D

Bruno

FallenAngel
22-05-2003, 04:44
klarheite, hm hats die je gegeben? *g*

so nachdem wir jetzt die ganze nacht an der erste berechnung verbracht haben, und bisher das mal passen sollte, zumindest gibt das programm schon mal aus schneidet bzw. nicht schneidet raus, hab mir die eingaben jedesmal aufgezeichnet und so kontrolliert ob die sich wirklich schneiden oder nicht, sprich sollte passen *aufatme*

zur winkelberechnung nochmal:

ich hab folgendes gemacht, v1 und v2 in zwei kleine formeln aufgesplittet, nämlich wenn ich P1, P2 und P3 mir anschaue weil das ja die ersten zwei längen sind.

also habe ich vier x und vier y werte und meine zwei formeln lauten:

v1: a= x2-x1
b=y2-y1
v2: c=x3-x2
d=y3-y2

(wenn ich das mit den obigen beispiel überprüfe, dann stimmt das auch)

ok auf jedenfall hab ich dann diese werte(soweit meine überlegung stimmt) und setze dann in die nächste formel ein:
das produkt zwischen v1 und v2 nenne ich jetzt mal z.

cosalpha=z/ wurzel_aus ((x2-x1)*(x3-x2)) * wurzel_aus ((y2-y1)*(y3-y2))

diesen wert muss ich dann ja theoretisch weiter einsetzen in

alpha=arccos(von cosaspha)

aber wie berechne ich diesen accos?? das hab ich noch immer nicht kapiert.

Bruno
22-05-2003, 10:36
hallo!

sorry, wenn ich dich enttäuschen muß, aber du hast wieder einen fehler in der berechnung drinnen. :devil:

also: du hast also jetzt die vektoren v1 und v2 und die formel (v1).(v2)=|v1|*|v2|*cos(alpha)

das v1.v2=z, daher sieht das ganze nach dem einsetzten so aus:

z=wurzel_aus(x1^2+y1^2)*wurzel_aus(x2^2+y2^2)*cos( alpha)

mit den wurzel_aus(x1^2+y1^2) berechnest du die länge von vektor 1, das selbe mit vektor 2.

daraus folgt:

cos(alpha)=z/(wurzel_aus(x1^2+y1^2)*wurzel_aus(x2^2+y2^2))

daraus folgt wiederum:

cos(alpha) = irgendweine zahl, da wir ja alle werte für die rechte seite der gleichung bereits kennen.

und um diese zahl wieder in einen winkel umzuwandeln, wenden wir auf diese zahl den arccos an. wie gesagt, die formel weiß ich jetzt auch nicht auswendig.. *hüstel* und da ich grad an der uni bin kann ich jetzt auch nicht nachsehen... aber wenns in java nicht eh einen befehl dafür gibt (der müßt dann im package "math" sein und sollte auch in deinem eprog-skriptum drinstehen) dann stehts sicher in jedem mathebuch/-skriptum/-website. wennst ihn bis am abend, wenn ich wieder nach haus komm, noch nicht hast, kram ich zur not halt meine alten mathebücher raus (auch wenn ich bei dem gedanken jetzt schon angstschweiß bekomm - ich hab echt gehofft, ich müßt die dinger nie wieder anrühren!! :) ) und such dir die formel raus.

Bruno

FallenAngel
22-05-2003, 11:50
so also nur damit ich mir auch wirklich 100 pro sicher bin

hat diese berechnung die ich da oben aufgestellt habe gestimmt, sprich für v1 und v2? wenn ja dann hab ich den rest ja auch endlich mal kapiert :).

und wegen den arccos schau ich gleich mal im netz nach, wenn ich nix find meld ich mich wieder^^

FallenAngel
22-05-2003, 12:45
so hab jetzt auch im netz geschaut wegen arccos, soweit ich das mitgekrigt habe, muss ich einfach folgendes machen

die zahl die bei cosalpha rauskommt mit cos^-1 rechnen, dann komm ich auf das gleiche ergebnis wie du, wenn das stimmt dann führ ich nen freudentanz auf ^^

Bruno
22-05-2003, 15:12
ja, die berechnung von v1 und v2 hat gestimmt. beim einsetzten in die formel hast dich dann halt verhaut.

das mit dem cos^-1 könnt hinkommen (zumindest steht das auch auf der entsprechenden taste von meinem taschenrechner - da hätt ich auch früher draufkommen können :shinner: ) ich glaub, es geht auch irgendwie, daß du mit sinus und cosinusund sowas draufkommst. aber das ^-1 ist sicher leichter. :verycool: und? ist das richtige rausgekommen?

bruno

FallenAngel
22-05-2003, 16:18
ja also bei der berechnung der winkel ist jetzt alles 100 pro klar, denke ich mal *g*, aber muss ich mir dann nur die ersten vier punkte angugen??? die anderen werden da nicht beachtet oder wie seh ich das?

Bruno
22-05-2003, 17:00
hallo!

tja, bad news, aber ich glaub, ich muß dir da was recht böses sagen... da ich mir nicht so ganz sicher war, wieso du dir nur 4 punkte anschaun willst, hab ich mir mal die angabe ganz durchgelesen (hab mir bis jetzt nämlich nur den teil mit den vektoren angeschaut *hüstel*) und bin da auf einen interessanten satz gestoßen: "das alle INNENwinkel<180° sind" :shinner: (du hättest mir ruhig sagen können, daß ich da in die falsche richtung renn... ;) lass mich nicht so wie ein irrer mein vektorwissen aufpolieren, wenn wir das dann garnicht brauchen...)

also hab ich eine gute un eine schlechte nachricht. Die schlechte zuerst:
mit dem skalaren produkt kommst du damit hier nicht weiter, weil das nur den winkel zwischen zwei vektoren berechnet, du aber für die innenwinkel auch alle anderen mit einberechnen mußt. (irgendwie klar... und ich hab mcih schon gewundert, wie dir überhaupt auf einen winkel mit über 180 grad kommen wollen...)

die gute ist aber, daß sie dir eh in der angabe genau erklärt haben, wie du das mit den 180 Grad ausrechnest und du in deinem fall sogar ordentlich von den hilfsbsps abschreiben kannst. Weil:

" Seien P1, P2, ..., Pn die Eckpunkte des Vielecks. Ermitteln Sie die Lage des Punktes P3 bezüglich der Gerade, die durch P1 und P2 geht (verwenden Sie dazu das Programm aus der ersten Runde). Wenn dieser Punkt LINKS liegt, dann muß auch P4 links bezüglich (P2,P3) liegen, P5 links bezüglich (P3,P4), ..., Pn bez. (Pn-2,Pn-1), P1 bez. (Pn-1,Pn) und P2 bez. (Pn, P1). "

ist eine nicht so üble idee, das mit den 180 grad zu überprüfen, da die einzige möglichkeit, daß die punkte einmal links und einmal rechts sind, die sind, daß sich entweder die kanten schneiden, oder ein winkel > 180 ist. also den teil brauchst du damit nur noch stur abtippen, was voraussichtlich einfacher wird, als das mit dem skalaren produkt zu implemetieren. :thumb:

Bruno

FallenAngel
22-05-2003, 17:18
juchu ich bin verwirrt :(

also gut dann schau ma mal, also das heißt ich muss überprüfen ob p3 auf der gerade von p1 und p2 bzw. links oder rechts, gut ok, drauf liegen kann er ja eigentlich nicht, weil dann ist das schon mal ein fehler, weil dann wäre er kein eckpunkt

sprich es bleiben noch rechts und links übrig, wann ist es nun konvex und wann konkav??? wenn es links liegt oder rechts, bzw. wie würde die formel lauten, weil ich bin jetzt mächtig verwirrt.

Bruno
22-05-2003, 17:20
okay, ich zeichne dir ein bsp (ich sags glaich, ich bein eine künstlerische niete ;) ) gib mir ein paar minuten...

FallenAngel
22-05-2003, 17:26
oki ich warte *fingernägel anfang zu kauen*

Bruno
22-05-2003, 17:40
also obs links oder rechts liegt ist untern strich egal, aber wennst den vektor zwischen den ersten beiden punkten gebildet hast und denn der dritte punkt links davon liegt, müssen auch alle anderen punkte links davon liegen - bzw rechts davon, wenn der dritte punkt nicht links sondern rechts vom vektor liegt.

sonst kommt nämlich einder der 3 fälle zum tragen, die ich in meiner skizze dargestellt hab. (ich hab ja gesagt, daß ich nicht gut zeichnen kann :) )

1) ist ein ausganszustand, bei dem p3 links von dem vektor zwischen p1 und p2 liegt. wenn der nächste punkt jetzt nicht auch links davon liegt, tritt fall 2 oder 3 ein.

bei fall 2 ergibt sich auf jeden fall ein winkel, der größer ist als 180. also wennst z.b.: p4 wieder mit p1 verbindest, hat der winkel alpha mehr als 180

bei fall 3 gibts zwar keinen winkel, der größer ist, als erlaubt, dafür schneidem sich aber mit sicherheit linien.

der letzte fall zeigt, wies aussehen würde, wenn man zwar am anfang immer links bleibt, dann aber plötzlich auf rechts umschwenkt. da hat man dann nämlich auch sicher eines der kriterien verletzt

wegen der formel: die zusatzprogramme, die du zu diesem bsp bekommen hast, berechnen eh schon, ob ein punkt links oder rechts von so einer geraden liegt. du kannst sie also ziemlich eins zu eins übernehmen .

tut mir wie gesagt leid, das mit den innenwinkeln war meine schuld. ich hätt mir gleich am anfang die angabe durchlesen sollen.http://hades.gothic.at/iforum/images/smilies/wallbash.gif

Bruno

FallenAngel
22-05-2003, 17:50
du brauchst dich echt nich entschuldigen, hast mir ja schon super geholfen, :)


wie ich überprüfen kann ob der dritte punkt links oder rechts davon steht, das weiß ich ist ja kein problem, und die weitere punkte auch,

mein problem ist das ich nicht verstehe wie ich danach vorgehen soll (leider zu blöd bin das zu kapieren), heißt das jetzt wenn alle punkte links oder alle punkte nur rechts liegen, dann ist es konvex??? und wenn es umschwenkt dann ist es konkav???

Bruno
22-05-2003, 17:58
(leider zu blöd bin das zu kapieren),

sei du aber auch nicht so streng zu dir... du stellst dich eh nicht übel an!


heißt das jetzt wenn alle punkte links oder alle punkte nur rechts liegen, dann ist es konvex??? und wenn es umschwenkt dann ist es konkav??

ganau das heißts! wenns immer nur rechts oder links liegt, (vom entsprechenden vektor aus klarerweise - nicht vergessen, der verändert sich ja im lauf der zeit) dann ists konvex, sonst entweder konkav oder aber die vektoren überschneiden sich.

Bruno

FallenAngel
22-05-2003, 18:02
gut wenn sie sich überschneiden dann ist das so oder so gleich bei der erste berechnung abgeschlossen und die winkelberechnung muss gar nicht mehr durchgenommen werden.

ok, ich hab ja beim lösungsbeispiel die formel wie ich mir berechnen kann ob p3 rechts oder links liegt, das heißt ich muss das weiter vorführen bis zu eben max. 15 ten punkt und schauen ob das nun links oder rechts liegt, ist es immer gleich auf einer seite ist es konvex, ändert sichs mal von links auf rechts oder umgekehrt, dann ist es konkav, jupie, dann kann ich mal heim und weiterprogrammieren (leider derzeit kein netz da hab), aber ich schau das ich später auf jedenfall noch on bin

*großen dank bruno*

Bruno
22-05-2003, 18:10
okay, ich wünsch dir noch viel erfolg und vieeel spaß beim programmieren! :p sag mir, wiest zurecht kommst!

Bruno

FallenAngel
24-05-2003, 19:14
hall!!!

also ich hab mal an den beispiel weitergearbeitet und hab aber immer noch folgendes problem, nämlich bei der Winkelberechnung. das heißt nachdem ich ja berechnet habe ob sich die kanten schneiden muss ich immer noch schauen ob nicht auch noch ein punkt auf der geraden der vorgänger punkte liegt, und da ist mein problem, denn da klappt irgendwie was nicht.


die formel ist an und für sich richtig, die berechnung läuft auch fast richtig nur das er nicht mit p1 und p2 anfängt sondern pn (sprich die letzte koordinate) als ersten punkt nimmt, was dazu führt das ein falsches ergebnis rauskommt, kann mir da mal jemand helfen und sich den code anschauen.


nächster Post bitte gugen.

FallenAngel
24-05-2003, 19:21
float d = 0, d1 = 0; /** Variablen (siehe Spezifikation) */
int start = 1; /** Dient für die Berechnung */
int count_kon = 0; /** Schleifenzähler */
int count_kon_one = 0; /** Schleifenzähler */
int count_kon_two = 0; /** Schleifenzähler */
int count_block = 6; /** Anzahl der Blöcke
int count_block_two = 1;
int direction = 0; /** 0 = Links, 1 = Darauf, 2 = Rechts */




for (count_kon_one = (count_block - 1); count_kon_one > ( count_block - 2 ); count_kon_one--) {
for (count_kon_two = (count_block - 1); count_kon_two > ( count_block_two ); count_kon_two--) {
if ( start == 1 ) {
d1=x[3]*(y[2]-y[1])+y[3]*(x[1]-x[2]); // Berechnung von d1 laut Spezifikation
d=x[1]*y[2]-x[2]*y[1]; // Berechnung von d laut Spezifikation
start = 0;
} else {
//if ( count_kon_two == 1 ) count_kon_two = 2;
d1=x[(count_kon_two - 2)] * (y[(count_kon_one - 1)] - y[count_kon_one]) + y[(count_kon_two - 2)] * (x[count_kon_one] - x[(count_kon_one - 1)]); // Berechnung von d1 laut Spezifikation
d=x[count_kon_one] * y[(count_kon_one - 1)] - x[(count_kon_one - 1)] * y[count_kon_one]; // Berechnung von d laut Spezifikation
}

println("d1: " + d1 + "||d: " + d + "||");

// Ermittlung der Lage laut Spezifikation
if(d1<d) direction = 0; // LINKS
if(d1==d) direction = 1; // DARAUF
if(d1>d) direction = 2; // RECHTS
location.addElement(Integer.toString(direction));

if ( location.size() > 1 ) {
if ( count_kon_two == 1 ) {
println( "first: " + location.get(0) );
} else {
println( "----" + location.get( (count_kon_two - 1) ) );
}
} else {
println( location.get(0) );
}
count_block_two++;
}
println("--------------------------------------------------");
count_block_two = 1;
}

d_k
24-05-2003, 21:08
also um zu schaun ob es konvex ist, brauchst du eigentlich nur testen ob sich bei der lage der punke etwas geändert hat, und das bei jeder linie. eigentlich brauchst nur die nachbarpkte der linie hernehmen.

wenn du nun eine linie hast, schaust du ob die nachbarpunkte der linie auf der gleichen seite liegen, ist das der fall, ist für diese seite mal kein winkel über 180°, ist das nicht der fall, dann kann man schon davon ausgehen das es konkav ist ;)

mfg d_k

Bruno
24-05-2003, 23:16
hallo!

okay, ich hab mir den code mal kurz durchgelesen - werd ihn mir genauer ansehen, wenn ich zu haus bin, bin grad unterwegs.


es wär zum nachvollziehen auf jeden fall hilfreich, wennst sagen würdest, was in den variablen für werte abgespeichert sind...

ansonsten: unter der annahme, daß du deine ganezn punkte in einem arry abgespeichert sind, durchläufst du sie in den for-schleifen

"for (count_kon_one = (count_block - 1); count_kon_one > ( count_block - 2 ); count_kon_one--) {
for (count_kon_two = (count_block - 1); count_kon_two > ( count_block_two ); count_kon_two--)"

von hinten nach vorne, wobei er klarerweise pn zuerst nehmen würde. du mußt die schleife von anfang bis ende durchlaufem und nicht umgekehrt. ich schaus mir wie gesagt nochmal genauer an, wenn ich wieder zuhase bin.

Lorenz

Bruno
25-05-2003, 00:36
okay, ich habs mir jetzt nochmal angesehen... wie gesagt, wär toll, wennst posten könntest, was jetzt wirklich in den ganzen variablen gespeichert ist bzw wies abgespeichert ist (aufsteigend oder absteigend sortiert)

ansonsten kann ich nur bei meiner oberen aussage bleiben... du läufst deine arrays mit den punkten von rechts nach links durch, wordurch das pn (wennst es aufsteigend sortiert hast) als erstes rangezogen wird. probier mal, obs klappt, wennst das änderst bzw poste das mit den variablen ein bisserl ausführlicher, wenns geht.

Bruno

FallenAngel
25-05-2003, 06:32
nach zichtausend versuchen, habe ich diesen code teil nochmal geschrieben und die lösung gefunden.

nu geht endlich alles auch wenn ich es ein bißchen verstpätet abgeben musste, na ja hauptsache überhaupt ^^.

danke :).

Bruno
25-05-2003, 11:51
keine sorge, wennst blos einen tag drüber liegst bekommst eh kaum abzug. ;)

FallenAngel
26-05-2003, 16:22
wie ist das mit Samstag, Sonntag, wenn man da drueber ist???, sprich Deadline am Freitag und Abgabe am Sonntag???

und dann muss ich mich echt bei euch bedanken, ich hätte das beispiel alleine nie geschaft, bin echt froh das es hier leute gibt wie ihr, vorallem ein großer dank an Bruno :).


LG.
FallenAngel :engel:

Bruno
26-05-2003, 17:12
kein problem, wir helfen gern! :thumb:

Wegen deiner abgabe hast du mit ein bisserl glück wirklich noch volle punkteanzahl... ich bin mir zwar nicht sicher, aber soweit ich weiß, rechnen sie ja sa und so nicht als arbeitstage, womit du (theoretisch) auch nicht zu spät abgegeben hättest... jetzt stellt sich nur die frage, ob die eprog-heinis (:p) das genauso sehen!

Bruno

FallenAngel
27-05-2003, 19:29
*flüstert* scheinbar ist das wirklich so, weil ich hab alle punkte gekriegt,
aber pssssssssssst nit weiter sagen, nicht das mir das im nachhinein
noch abgezogen wird *stillscheigt*.

Lg. :engel:

nautiLus
23-11-2003, 15:39
und ich hab die angabe gerade vor mir liegen und noch nichtmal angefangen .... *grml* :D

Dieli
24-11-2003, 14:09
Hi!


Hab auch dieses nette Bsp, und bin grad am tüfteln. Mich würde interessieren, ob man auch überprüfen muss, ob sich 2 geraden schneiden, wenn alle winkel <180° sind??? Könnte ja auch sein, dass sich 2 mal die geraden schneiden und dann ist es möglich, dass alle Winkel <180 sind ...

@Fallen: Hast du das überprüft?

mfg Dieli