Avatar billede sbhansen Nybegynder
12. december 2001 - 19:33 Der er 7 kommentarer og
2 løsninger

koordinatsystem - 2 koordinatsæt... hvad er vinklen mellem dem?

Sidder der lige én med lidt frisk matematik i toppen?

Jeg roder rundt med sin, cos og tan...

Problem: gradtal i koordinatsystem (landkort af dk)
Vejle er midtpunkt i \"min verden\" - koorinatsæt (x=190, y=390)
Jeg ønsker at kende alle mine øvrige 40 byers luftlinjevinkel i 360 graders perspektiv, hvor stik nord for vejle = 0 grader, stik øst = 90, syd=180 og vest = 270
Skagen  - koorinatsæt (x=275, y=15)
Silkeborg - koorinatsæt (x=175, y=300)
Odense- koordinatsæt (x=250, y=450)
...osv...
en metode, der tager imod 2 byer (med felterne x og y) og returnerer vinklen fra afsenderbyen til modtagerbyen.
det er en applikation, der skal optimere ruteplanlægning ud fra en algoritme kaldet dijkstra - ovenstående skal bruges til en yderligere optimering af ruter med mange pakker i samme bil..
Avatar billede jakoba Nybegynder
12. december 2001 - 19:47 #1
for hver by du vil beregne vinkel til laver du en vektor.
fx: vejle - skagen  bliver

( skagenX-vejleX, skagenY-vejleY )  bliver
      ( 275-190, 15-390 )  bliver
            ( 85,  -375 )

tangens er y værdien for x=1 så vi skalerer vektoren ned:
        ( 85/85, -375/85 )  bliver
              ( 1, -4.412 )

der kan du så slå op og se hvilken vinkel har tangens = -4.412
Det kan så enten være nordvest eller sydøst og da ykomponenten i den oprindelige vektor er negativ betuder det at skagen ligger sydøst for vejle.

humm....

Allenfals er det princippet :-))

mvh JakobA
Avatar billede jakoba Nybegynder
12. december 2001 - 19:55 #2
Det er nok dit koordinatsystem der vender nedad så y stiger mod syd, mens x stiger mod øst (ligesom på en computerskærm).

Så ligger skagen ihvertfald  nord-nordøst for vejle og det passer med min geografibog.
Avatar billede sbhansen Nybegynder
12. december 2001 - 20:06 #3
Du har helt ret i pseudo-koden, men til prisen (250) point vil jeg meget gerne, hvis du har lyst til at vise det i et kodeeksempel.

- jeg sætter lige by-objektet ind...

package gruppe1.graphic;
import java.awt.*;
import gruppe1.*;
public class By {
    public int    j=0;
    public int    x; //stiger mod øst
    public int    y; //stiger mod syd
    public int    radius; //Byens størrelse

    public Color  color;
    public String description;
    public  Destination[] destinationer = new Destination[1];
   

    public By(int x, int y, int r, String description) {
        this.x = x;
        this.y = y;
        radius = r;
        this.description = description;

    }

        public By(Knudepunkt knudepunkt) {
        this.x = knudepunkt.getXKoordinat();
        this.y = knudepunkt.getYKoordinat();
        radius = knudepunkt.getStørrelse();
        description = knudepunkt.getDescription();
        color  = Color.blue;
        destinationer = knudepunkt.getDestinationsListe();
    }
   
Håber du kort vil vise en metode der tager imod 2 byer (afsenderBy og modtagerBy), som retunerer vinklen målt fra afsenderby MOD modtagerBy . - Jeg har selv set mig sur på tangens, sinus og cos...
/Søren
Avatar billede greybeard Nybegynder
12. december 2001 - 20:51 #4
        public  double getDirection( int x1, int x2, int y1, int y2 ){
        double distance = Math.sqrt(Math.pow(x2-x1, 2 ) + Math.pow(y2-y1,2));
        double direction = Math.toDegrees(Math.acos( (x2-x1)/distance ));
            if (y2 > y1){
                direction = 360 - direction;
            }
            direction = direction + 90;
            if (direction > 360){
                direction-= 360;
            }
        System.out.println( direction );
        return( direction );
    }
Den tager ikke to byer, som du bad om, x og y koordinater for de to byer. x1 og y1 sal tilhøre samme by
Avatar billede greybeard Nybegynder
12. december 2001 - 21:24 #5
        public  static double getDirection( int x1, int x2, int y1, int y2 ){
        // afstand mellem byer
        // bruge til at skalere ned til enhedscirkel.
        double distance = Math.sqrt(Math.pow(x2-x1, 2 ) + Math.pow(y2-y1,2));
        // Find arcCosinus til x-afstanden på enhedscirklen
        double direction = Math.toDegrees(Math.acos( (x2-x1)/distance ));
            // hvis y-afstanden er positiv, skal vi op på den \'nordlige halvkugle\'
            if (y2 > y1){
                direction = 360 - direction;
            }
            //rotér 90 grader da matematik regner 0 grader ud af x-aksen
            direction = direction + 90;
            if (direction > 360){
                direction-= 360;
            }
//        System.out.println( direction );
        return( direction );
    }

Du får lidt kommentarer med
Avatar billede sbhansen Nybegynder
12. december 2001 - 21:35 #6
er lige ved at afprøve det.. ;-) 5 min...
Avatar billede jakoba Nybegynder
12. december 2001 - 21:37 #7
public class By {
    public int    x; //stiger mod øst
    public int    y; //stiger mod syd

    public By( int xCoord, int yCoord ) {
        this.x = xCoord;
        this.y = yCoord;
    }

    public int graderMod( By andenBy ) {
        double rad;  // vinkel i radianer fra denne by til andenBy
                    // rad returneres
        int dx = andenBy.x - x;
        int dy = andenBy.y - y;
        if ( dx == 0 ) { //  stik nord eller syd
            rad = (dy>0) ? Math.PI*1.5 : Math.PI *0.5;
        } else {
            rad = Math.atan2( -dy, dx );
        }
        double rad2 = rad+2*Math.PI;
        rad2 = ((360*rad2)/(2*Math.PI))%360;
        return (int)Math.round(rad2);
    }
   
    public static void main(String[] args) {
        By vejle = new By( 190, 390 );
        By skagen = new By( 275, 15 );
        By silkeborg = new By( 175, 300 );
        By odense = new By( 250, 450 );
        System.out.println( \"vejle - skagen    \" +vejle.graderMod( skagen ) );
        System.out.println( \"vejle - silkeborg \" +vejle.graderMod( silkeborg ) );
        System.out.println( \"vejle - odense    \" +vejle.graderMod( odense ) );
    }
   
} //end class by
Avatar billede sbhansen Nybegynder
12. december 2001 - 22:53 #8
tak til jer begge for den fremragende indsats - som Cand.Merc.Dat ligger matematikken simpelthen for langt tilbage til at jeg kunne huske geometrien... pinligt, men nu kan jeg igen! :-)
Avatar billede greybeard Nybegynder
12. december 2001 - 22:56 #9
Selv tak. Jeg havde heller ikke skade af en genopfriskning
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