Autor Beitrag
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Fr 29.09.06 15:10 
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 ?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 92

Win 2000,Win XP
D6 Pers
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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:

ausblenden 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...

_________________
JSXGraph
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Fr 29.09.06 16:13 
dann wäre das so:
ausblenden 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
x = 50
y = 50
alpha = 0
w = 40

die ergebnisse
ausblenden Delphi-Quelltext
1:
2:
3:
4:
s = 50
t = 50
m = 1,55968570709229
n = -27,9842853546143


dabei müssten die folgendermaßen lauten:
ausblenden 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:
ausblenden 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
ausblenden 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
ausblenden Delphi-Quelltext
1:
2:
  s := p.x - w/2 * cos(degtorad(alpha));
  t := p.x + w/2 * cos(degtorad(alpha));


mfg