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.

user defined image

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