Entwickler-Ecke
Sonstiges (Delphi) - Mathematisches Streckenproblem
F34r0fTh3D4rk - Fr 29.09.06 15:10
Titel: Mathematisches Streckenproblem
hi, ich bastel gerade an meiner particle engine weiter.
dort gibt es einen "abschusswinkel" und eine position, dass heißt,
dass alle partikel auf einem punkt starten und von dort "abgeschossen" werden.
jetzt möchte ich, dass der emitter eine breite bekommt, also wird aus dem
punkt eine strecke.
das rote ist meine strecke, das blaue ist die normale.
gegeben sind P (der mittelpunkt der roten strecke), alpha (der winkel) und w (die breite).
gesucht werden s (linke intervallgrenze), t (rechte intervallgrenze), m (steigung), n (y-achsenabschnitt).
ich hab das ganze jetzt folgendermaßen gemacht, jedoch funzt das net so recht, wenn ich die breite auf 5000 setze, kann ich wieder was sehen, jedoch ist das komischerweise etwas diagonales, also so recht klappt das alles noch net, wo liegt der fehler ?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| var a, beta, m, n, s, t: single;
if width <= 0 then FParticle.position := position else begin a := 2 * ((cos(angle) * width / 2) - position.X); beta := arccos(a / width); m := tan(beta); n := position.y - m * position.x; s := position.x - a / 2; t := position.x + a / 2; FParticle.position.X := random(round(t - s)) + s + 1; FParticle.position.Y := m * FParticle.position.X + n; end;
|
Vielen Dank schonmal.
mfg
Masterhawk - Fr 29.09.06 15:23
Habs jetzt noch net ganz durchgeguckt, aber....
'Beta = 90° - Alpha' oder 'Beta=2Pi-Alpha', weil du es als Wechselwinkel zu 'Beta2'(liegt dann unter alpha) sehen kannst.... :wink:
Wie gesagt, hab das nur grad so gesehen....hab auch grad keine Zeit, werd es mir mal nachher anschauen...
MfG Masterhawk
F34r0fTh3D4rk - Fr 29.09.06 15:41
hm glaube ich net, weil der winkel unter alpha 90-alpha ist, und der erscheint mir größer, ich werde es trotzdem mal testen, danke
hm die richtung ist zwar anders und man sieht häufiger was, aber dafür immer noch falsch und immer gleich Oo es sieht aus, als wäre die gerade sehr lang, egal welche länge ich angebe Oo
raziel - Fr 29.09.06 15:47
Ohne deinen Source näher angesehen zu haben (um nicht auf eine falsche Fährte gelockt zu werden) komme ich auf folgendes:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| P(x/y)
=> sin(alpha)=cos(90°-alpha)=[2*(t-x)]/w => t=x+(1/2)*w*sin(alpha)
analog s: s=x-(1/2)*w*sin(alpha)
m=arctan(beta)=arctan(90°-alpha)
y=m*x+n
=> n=y-m*x |
somit dürfte alles beisammen sein...
F34r0fTh3D4rk - Fr 29.09.06 16:13
dann wäre das so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| s := position.x - width * sin(angle) / 2; t := position.x + width * sin(angle) / 2; m := arctan(90-angle); n := position.Y - m * position.x; FParticle.position.X := random(round(t - s)) + s + 1; FParticle.position.Y := m * FParticle.position.X + n; |
ich glaub so muss das random:
Delphi-Quelltext
1:
| FParticle.position.X := s + random(round(t - s) + 1); |
dann hat aber width bei mir irgendwie keine auswirkungen auf die emission Oo
irgendwas ist da net korrekt, ich bekomme für die eingabewerte:
Delphi-Quelltext
1: 2: 3: 4:
| x = 50 y = 50 alpha = 0 w = 40 |
die ergebnisse
Delphi-Quelltext
1: 2: 3: 4:
| s = 50 t = 50 m = 1,55968570709229 n = -27,9842853546143 |
dabei müssten die folgendermaßen lauten:
Delphi-Quelltext
1: 2: 3: 4:
| s = 30 t = 70 m = 0 n = 50 |
und ein winkel von 90 müsste senkrecht sein und nicht waagerecht, nur hab ich dann das problem einer senkrechten, die es ja normalerweise net gibt, müsste ich extra abfragen,
der winkel scheint sonst zumindest immer gleich und da liegt der hase im pfeffer
so, zuerstmal sind die winkelfunktionen falsch, so kommt da wenigstens das richtige bei raus:
Delphi-Quelltext
1: 2:
| s := p.x - w/2 * cos(alpha); t := p.x + w/2 * cos(alpha); |
mal weiter schauen, so siehts schon besser aus, aber da kommt immer noch mist raus
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| P.x := strtoint(Edit1.Text); P.y := strtoint(Edit2.Text); alpha := strtoint(Edit3.text); w := strtoint(Edit4.text);
s := p.x - w/2 * cos(alpha); t := p.x + w/2 * cos(alpha);
a := t - s; beta := arccos(a / w);
m := tan(beta); n := p.Y - m * p.x; |
JUHU, noch 2 mal degtorad rein und es klappt
Delphi-Quelltext
1: 2:
| s := p.x - w/2 * cos(degtorad(alpha)); t := p.x + w/2 * cos(degtorad(alpha)); |
mfg
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!