12. december 2001 - 19:33Der 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..
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.
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;
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
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
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 ); }
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 ) ); }
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! :-)
Selv tak. Jeg havde heller ikke skade af en genopfriskning
Synes godt om
Ny brugerNybegynder
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.