# Java rechnen mit unbekannten



## Sphinx2k (31. Jan 2012)

Hallo ich hab folgendes Problem.



P1 soll sich auf P2 zu bewegen bei jedem Rechenschritt eine (beliebige Anzahl) Längeneinheit näher ran. 
Gesucht ist also ein Punkt auf der Geraden der eine Längeneinheit näher an P2 dran ist. 

Gut mit Restschulwissen und Internet hab ich mir die Rechnung angeeignet (evtl. gibt es andere Rechenwege). Auf dem Papier nicht zu kompliziert nur wie soll ich das im Programm umsetzen. 
 -- Grober Rechenweg
Ich habe es über Vektoren gerechnet. 
g:x=(P1)+r(P2-P1) je X und Y.
ergebnis: 
g:x=  (2+7r)
        (5,5-3,5r)
Darin kommt schon mal das r vor welches mein Problem ist. 

Dann geht es weiter mit dem finden des neuen Punktes. 
d=sqrt((x1-x2)²+(y1-y2)²)
d ist die Längeneinheit. Also wie weit der neue Punkt auf dem Vektor an den zweiten Punkt ran kommen soll.
Dann sähe das ganze so aus wenn er 2LE näher ran soll:
2=sqrt((2-(2+7r))²+(5,5-(5,5-3,5r))²).
Das ganze müsste ich jetzt nach r auflösen, r in meinen Vektor einsetzen und ich hätte den neuen Punkt.
-- Ende Rechnerei

Nur das r darin ist das Problem und ich habe keine Idee wie ich das auch nur ansatzweise im Programm umsetzen soll. Bzw. hab ich im Gefühl es läuft auf wüste IF schleifen hinaus. 
Aber ich kann auch total falsch liegen und die Lösung ist weit aus simpler.

Darum meine frage: Wie bildet man so eine Rechnung in einem Java Programm ab.


----------



## parabool (31. Jan 2012)

Warum so kompliziert ? 

Prinzip:


```
g.drawLine(10, 10 , 300, 200);		
int le = 10; //längeneinheit
int x = 290;
int y = 190;	
int dx=x/le;
int dy=y/le;	
g.drawOval(10+(dx*le/10), 10+(dy*le/10), 5, 5); //Eine Einheit der Strecke
g.drawOval(10+(dx*le/2), 10+(dy*le/2), 5, 5); //Hälfte der Strecke
g.drawOval(10+(dx*le/4), 10+(dy*le/4), 5, 5); //Viertel der Strecke

for(int i=0;i<11;i++)
{
   g.drawOval(10+(dx*le/10*i), 10+(dy*le/10*i), 5, 5); //in 10 Einheiten unterteilen
}
```


----------



## Sphinx2k (31. Jan 2012)

Danke aber das ist nicht ganz was ich möchte. Hier wird ja im Endeffekt nur die X und Y Koordinaten durch einen wert geteilt ergibt mir also eine Teilstrecke des Abstands. 

Nehmen wir die werte aus dem Beispiel dann ist das 
Der 
Anfangspunkt X=10 Y=10;
Zielpunkt X=290 Y=190
Ergibt für nach der Formel
X1=39 Y1=29

Gleiche Rechnung nur mit anderem Zielpunkt auf der selben Geraden:
Zielpunkt X=590 Y=480
Ergibt für nach der Formel
X1=69 Y1=58

zwei verschiedene X1 und Y1. Da ich aber 10 Einheiten von Anfangs auf Zielpunkt zu gehen möchte. Muss bei dem was ich möchte in beiden fällen der selbe Wert herauskommen.
Tut Leid wenn ich das erst missverständlich ausgedrückt haben sollte.


----------



## Michael... (31. Jan 2012)

Sphinx2k hat gesagt.:


> Nehmen wir die werte aus dem Beispiel dann ist das
> Der
> Anfangspunkt X=10 Y=10;
> Zielpunkt X=290 Y=190
> ...


Mal abgesehen davon, dass der zweite Zielpunkt nicht auf der Geraden zwischen Anfangspunkt und ersten Zielpunkt liegt...

Musst Du erstens den Vektor zwischen Anfangspunkt (P1) und Zielpunkt (P2) bestimmen:
 (P2 -P1) =>  v = (280 / 180)
diesen auf die Länge 1 zu einem Einheitsvektor normieren: heißt den Vektor durch seine Länge teilen.

Wenn Du nun zehn Einheiten Richtung Zielpunkt "wandern" willst, musst Du einfach nur P1 + 10*Einheitsvektor rechnen.


----------



## parabool (31. Jan 2012)

Im Beispiel sind  X=290 Y=190 nicht der Zielpunkt sondern die x und y Ausdehnung der Strecke



> die X und Y Koordinaten durch einen wert geteilt ergibt mir also eine Teilstrecke des Abstands.



Je nach dem wie groß die Auflösung sein soll  z.B 10, beträgt  ein x-Schritt 290/10 = 29 und ein y-Schritt 190/10 =19.

Das ist die Teilstrecke.

Diese Teilstrecke brauchst Du zur Berechnung des nächsten Punktes: Teilstrecke*Berechnungsschritt.
Bei 2 Berechnungsschritten verschiebt sich also der Punkt 2*29= 58 in x - und  2*38 in y Richtung.

Wenn Du den Punkt auf der Strecke Schrittweise einen Zielpunkt annäheren willst,
ist das der richtige Weg. Die Länge der Strecke oder Teilstrecke brauchst Du hierfür nicht,
kannst diese aber auch berechnen: Teilstrecke = sqrt(*29²+*19²) 


Lass mal das Bsp. ablaufen


----------



## Sphinx2k (31. Jan 2012)

Das mit dem Vekor durch die Entfernung teilen war der springende Punkt. Soweit ich das ganze jetzt getestet habe funktioniert es mit den richtig Ergebnissen. 
Mein direktes Problem ist also gelöst, vielen dank.

Jetzt wäre natürlich noch mein Interesse ob es einen schicken weg gibt so eine Gleichung mit einer unbekannten aufzulösen ohne einen gigantischen Quelltext Berg zu erschaffen. 

Was einfaches z.B.
5=3x+2x²

Meine Idee wäre jetzt jeden wert als String zu verwalten und sich diese dann für die Rechnung in Zahl und Buchstabe zu trennen, zu rechnen und dann erst mal wieder als String abzulegen....aber das kann wie meine eingangs frage auch schon wieder viel zu kompliziert gedacht sein.


----------



## pro2 (31. Jan 2012)

Vielleicht kann dir da eine entsprechende Mathmatik Bibliothek helfen, die schon geschrieben wurde. 
Es gibt z. B. http://commons.apache.org/math/ oder JScience (1. Link funktioniert leider gerade nicht). Ich weiß nicht, ob die jetzt genau das von dir gesuchte können, allerdings wäre es denkbar.


----------



## Michael... (31. Jan 2012)

Sphinx2k hat gesagt.:


> Jetzt wäre natürlich noch mein Interesse ob es einen schicken weg gibt so eine Gleichung mit einer unbekannten aufzulösen ohne einen gigantischen Quelltext Berg zu erschaffen.
> 
> Was einfaches z.B.
> 5=3x+2x²


Hat das jetzt was mit dem ursprünglichen Problem zu tun oder ist das eine völlig neue Fragestellung? Da hier ja plötzlich eine quadratische Gleichung auftaucht?
Grundsätzlich ist es ziemlich komplex eine beliebige Gleichung nach der Variablen aufzulösen. Für den Fall der quadr. Gleichung gibt es ja entspechende Formeln, die man ja leicht in Java implementieren kann. Da stellt sich dann eher die Frage wie wirde die Formel eingeben.


----------



## Sphinx2k (1. Feb 2012)

Das wäre eine komplett neue Fragestellung. Ich bräuchte jetzt auch gar keine konkrete Lösung / Quelltext für diese Gleichung mich würde nur interessieren wie man ein solches Problem in einem Programm technisch angeht.


----------



## Michael... (1. Feb 2012)

Sphinx2k hat gesagt.:


> mich würde nur interessieren wie man ein solches Problem in einem Programm technisch angeht.


Das Problem quadratische Gleichungen zu lösen? Dafür gibt es ja die Mitternachtsformel
Oder das Problem zu erkennen, um welche Art von Gleichung es sich handelt? Das wird je nach zulässigen Möglichkeiten nicht gerade trivial.
Oder geht es weniger um die Gleichung sondern um die mathematische Funktion?


----------



## Landei (1. Feb 2012)

Du hast auch immer die Möglichkeit, mehr oder weniger clever in einem gegebenen Intervall numerisch nach Nullstellen zu suchen, dann ist es völlig egal, welche Funktion du hast.


----------



## Sphinx2k (1. Feb 2012)

Michael... hat gesagt.:


> Das wird je nach zulässigen Möglichkeiten nicht gerade trivial.



Das ist das wonach ich gesucht hab (vermutlich wieder unnötig kompliziert erklärt). 
Eben ob es auch für solche Dinge einen einfachen Programmier weg gibt oder ob man einen entsprechend hohen Aufwand betreiben muss um eine solche Gleichung überhaupt sinnvoll verarbeiten zu können.


----------

