Avatar billede hairball Nybegynder
14. juni 2001 - 09:54 Der er 8 kommentarer og
1 løsning

Matematisk geni søges!


Jeg har brug for en funktion der returner hvilken grad et punkt ligger i forhold til et andet

Funktionen kunne se således ud :

int findDegree(int x_origin, int y_origin, int x_target, int y_target){

HER SKAL DER SÅ UDREGNES PÅ HVILKEN GRAD TARGET LIGGER SET FRA ORIGINS PLADS

Return intDegree;
};

Avatar billede borum Nybegynder
14. juni 2001 - 11:00 #1
Jeg er ikke helt sikker på hvilken vinkel de vil have graderne for. Nu antager jeg det er vinklen mellem x-aksen og liniestykket bestemt ved de to punkter.

Udregningen er i stil med:

int findDegree(int x_origin, int y_origin, int x_target, int y_target){
int dx = x_target - x_origin;
int dy = y_target - y_origin;
int prik = dx * 1 + dy * 0; // kan selvfølgelig forkortes
double norm = sqrt(dx*dx + dy*dy);
double rad = acos(prik / norm);
int degree = 180 * rad / 3.1415;
return degree;
}

Det blev udnyttet at prikprodukt af to vektorer a og b (for henholdsvis x-akse og liniestykke) både kan skrives som: a_x * b_x + a_y * b_y
eller som: |a|*|b|*cos(v) hvor v er vinklen mellem de to vektorer. Udregningerne er nemmere da b er en enhedsvektor og har 0 i y-koordinaten.
Avatar billede hairball Nybegynder
14. juni 2001 - 11:02 #2
Jeg forstår ikke denne linie, den vil da altid ende i 0 eller hvad ?

<< int prik = dx * 1 + dy * 0; // kan selvfølgelig forkortes
Avatar billede borum Nybegynder
14. juni 2001 - 11:40 #3
Jeg skriver \"dx * 1 + dy * 0\" så det er mere tydeligt at der er tale om prikprodukt/skalarprodukt. Men hvis jeg ganger dy med 0 bliver det jo altid 0 og hvis jeg ganger dx med 1 bliver det altid dx, så det havde været mere effektivt at skrive:
int prik = dx;
Men så havde det ikke været så nemt at forstå beregningerne der ligger bag.

Når programmet er til java skal du nok skrive Math.sqrt og Math.acos, men det havde du sikkert regnet ud.

Anders

Avatar billede hairball Nybegynder
14. juni 2001 - 11:43 #4
Ok, jeg prøver det så snart jeg kommer hjem
Avatar billede delbing Nybegynder
14. juni 2001 - 14:36 #5
i stedet for 3.1415 kan du bruge Math.PI:
int degree = 180 * rad / Math.PI;
Avatar billede hairball Nybegynder
14. juni 2001 - 19:56 #6
Jeg har lavet følgende funktion nu, og den virker næsten, problemet er bare at uanset hvad returner den kun værdi mellem 0-180, ikke mellem 0-360

    public static int getAimDegree(int intSourceFigurePointer, String strTargetFigureName){

        int intTargetFigurePointer = getFigurePointerByName(strTargetFigureName);

        int x_target = (Integer.parseInt(spriteEngine.Figure[intTargetFigurePointer][spriteEngine.FIGURE_X_POS])/100);
        int y_target = (Integer.parseInt(spriteEngine.Figure[intTargetFigurePointer][spriteEngine.FIGURE_Y_POS])/100);

        int x_origin = (Integer.parseInt(spriteEngine.Figure[intSourceFigurePointer][spriteEngine.FIGURE_X_POS])/100);
        int y_origin = (Integer.parseInt(spriteEngine.Figure[intSourceFigurePointer][spriteEngine.FIGURE_Y_POS])/100);


        int dx = x_target - x_origin;
        int dy = y_target - y_origin;

        int prik = dx * 1 + dy * 0; // kan selvfølgelig forkortes
        double norm = Math.sqrt(dx*dx + dy*dy);
        double rad = Math.acos(prik / norm);
        double degree = 180 * rad / Math.PI;

        return (int) Math.floor(degree);
       

    }
Avatar billede delbing Nybegynder
14. juni 2001 - 23:06 #7
Metoden som den står returnerer den mindste af de to vinkler mellem x-aksen og vektoren. Hvis dy<0 så peger vektoren nedad, så du skal trække resultatet fra 360 ved at erstatte de sidste linier med:

if (dy<0) return (360 - (int) Math.floor(degree));
return (int) Math.floor(degree);

Metoden returnerer nu vinklen målt i positiv omløbsretning, dvs vinklen fra x-aksen til vektoren mod uret.
Avatar billede hairball Nybegynder
15. juni 2001 - 08:36 #8
Jeg fik det til at virke på en anden tilsvarende måde
Avatar billede Slettet bruger
18. juni 2001 - 08:47 #9
hairball>

http://www.eksperten.dk/spm/23717
er vist ved at være ret gammelt...
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
Kategori
Kurser inden for grundlæggende programmering

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