Avatar billede alpapa Nybegynder
28. maj 2007 - 13:26 Der er 4 kommentarer og
2 løsninger

Udregning af path i 2D koordinatsystem

Hejsa Eksperter

Mangler lidt matematisk assistance...

Har et vindue på 1000x700 pixels. I vinduet har jeg et grafisk objekt (en cirkel) som er random placeret. Dette objekt skal gradvist bevæge sig ind til centrum af vinduet (500,350), således at hvis objektets placering er (700, 450) skal objektet vel bevæge sig dobbelt så hurtigt på X-aksen end på Y-aksen...

På forhånd tak
Avatar billede japping Nybegynder
28. maj 2007 - 13:45 #1
Objektet skal bevæge sig langs en linie.

liniens hældning: A=(350-450)/(500-700)
Liniens ligning: y=Ax+b => 350=A*500+b => b=350-A*500

Så skal du bare lade x løbe fra 700 til 500 og udregne y vha. ligningen y=A*x+b, hvor A og b beregnes vha. ovenstående ligninger.
Avatar billede alpapa Nybegynder
28. maj 2007 - 21:20 #2
Hmmm - kan ikke rigtig få det til at spille, kan du finde problemet?

float A, b, x, y, newX, newY;
private void TargetStearing()
{
  x = 0f;
  y = 0f;
  A = (screenCenter.Y - target.Location.Y) / (screenCenter.X - target.Location.X);
  b = screenCenter.Y - A * screenCenter.X; 
  if (Math.Abs(A) <= 1.0)
  {
    x--;
    y = A * x + b;
  }
  else
  {
    y--;
    x = y - b / A;
  }
  newX = target.Location.X + x;
  newY = target.Location.Y + y;
Avatar billede alpapa Nybegynder
28. maj 2007 - 23:24 #3
Hovsa, sådan her skulle det være skrevet... men det fungerer stadig ikke helt?

float A, float b, float x, float y;
private void TargetStearing()
{
  x = target.Location.X;
  y = target.Location.Y;
  A = (target.Location.Y - screenCenter.Y) / (target.Location.X - screenCenter.X);
  b = screenCenter.Y - A * screenCenter.X;
  if (Math.Abs(A) <= 1.0f)
  {
    x = x - 1.0f;
    y = A * x + b;
  }
  else
  {
    y = y - 1.0f;
    x = y - b / A;
  }
  target.Location = new Vector2(x, y);         
}
Avatar billede japping Nybegynder
29. maj 2007 - 13:53 #4
Det må du undskylde, jeg var lidt for hurtig - havde ikke papir og blyant.

Brug:
A = (screenCenter.Y - target.Location.Y) / (screenCenter.X - target.Location.X);

Dette vil give dig koordinaterne til bevægelsen mellem de 2 punkter.

Jeg er ikke så stærk i C#, men kan give dig følegnde input:

x=target.Location.X
Speed=(screenCenter.X-target.Location.X)/100 /* parameteren 100 ændres efter behov */
while x<>screenCenter.X do
  A = (screenCenter.Y - target.Location.Y) / (screenCenter.X - target.Location.X);
  b = screenCenter.Y - A * screenCenter.X;
  y=A*x+b
  /* Her skal du indsætte den funktion der flytter din cirkel til position (x,y) */
  x=x+Speed
  If abs(x-screenCenter.X)<Speed Then
    x=screenCenter.X
  end while 

Jeg håber ovenstående kan bruges ?
Avatar billede alpapa Nybegynder
29. maj 2007 - 15:01 #5
Super - tak for hjælpen japping.
Havde dog i mellemtiden lavet understående, da jeg troede du var gået kold ;->
Du skal dog have dine point for besværet.

private double x0, y0, x1, y1, mx, my;

private void SetTargetStearingVariables()
{
  double angle = Math.Atan(DistCenterTargetVector().Y / DistCenterTargetVector().X);
  angle = Math.Abs(angle);
  mx = targetSpeed * Math.Cos(angle);
  my = targetSpeed * Math.Sin(angle);
  x0 = screenCenter.X;
  y0 = screenCenter.Y;
  x1 = target.Location.X;
  y1 = target.Location.Y;
}

private Vector2 DistCenterTargetVector()
{
  return new Vector2(target.Location.X - screenCenter.X, target.Location.Y - screenCenter.Y);
}

private void TargetStearing() // bliver kaldt 60 gange i sekundet
{
  if (x1 > x0)
    x1 = x1 - mx;
  else
    x1 = x1 + mx;
  if (y1 > y0)
    y1 = y1 - my;
  else
    y1 = y1 + my;
  double x1_new = Math.Round(x1);
  double y1_new = Math.Round(y1);
  target.Location = new Vector2((float)x1_new, (float)y1_new); 
}
Avatar billede japping Nybegynder
29. maj 2007 - 15:44 #6
Kold - nej, blev bare nød til at tage på skovtur med familien.

Jeg er altid frisk på en matematisk udfordring.

Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



Seneste spørgsmål Seneste aktivitet
I går 20:46 opkaldside Af hagbartm i Mobiltelefoner
I går 16:05 win 10 vil ikke boote Af bb69 i Windows
I går 11:20 Lenovo x390 Af tobberjas i PC
I går 10:14 Alder i Excel Af Nanarsi i Excel
I går 09:00 Flere linier på faneblad Af Peder Lund Nielsen i Excel