fra digitalt til analogt ur

Tags:    java

jeg har lavet et ur, hvor jeg gerne vil kunne skifte mellem forskellige views.

jeg har lavet et DigitalUrView(ganske vidst ikke særlig pænt), og nu er jeg igang med det analog'e ur.

min paint kode ser indtil vidre således ud:(der er kun time viser på lige pt.)
Fold kodeboks ind/udJava kode 


jeg har ganske vidst ikke nogle tal på urskiven endu, men viseren peger i alle muglige (for mig at se) tilfældige retninger. Jeg tror det har noget at gøre med at jeg ikke har tænkt mig ordenligt om det jeg lavede alogritmen(eller whatever det heder)...







9 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
double angle=((cal.get(Calendar.HOUR))*30)*(Math.PI/180);
finder en vinkel i grader convertere den til radianer, hvis du ikke ved hvad det er spørg din regnelære for kan ikke selv forklare det :)

double x= 50* Math.sin(angle);
double y= -50*Math.cos(angle);
det her er faktisk et hack af 2d vector rotation.
den rigtig formel kan skrives:
x' = cos(theta)*x - sin(theta)*y
y' = sin(theta)*x + cos(theta)*y
hvor x,y er den originale vector og x' y' er den nye vector. Den vector jeg rotere har en hard kodet længde på 50.

g.drawLine(50,50,50+(int)x,50+(int)y);
det her er en translation skrevet inde i drawlinen, den vectoren x y har origo i 0,0 men den skal have origo i 50,50 derfor lægges 50 til både x og y.



Indlæg senest redigeret d. 12.09.2008 19:03 af Bruger #5620
Engang for længe siden lavede jeg det samme. Jeg havde nok samme lærebog!!!!

Jeg kan huske, jeg brugte mange grimme ord, da jeg skulle have uret til at tilpasse sig framens størrelse.

Jeg gjorde ikke så meget i kommentarer dengang, så du må selv finde ud af, hvad der foregår.

Fold kodeboks ind/udJava kode 




Calendar cal=Calendar.getInstance();
double angle=((cal.get(Calendar.HOUR))*30)*(Math.PI/180);
double x= 50* Math.sin(angle);
double y= -50*Math.cos(angle);
g.drawLine(50,50,50+(int)x,50+(int)y);




Calendar cal=Calendar.getInstance();
double angle=((cal.get(Calendar.HOUR))*30)*(Math.PI/180);
double x= 50* Math.sin(angle);
double y= -50*Math.cos(angle);
g.drawLine(50,50,50+(int)x,50+(int)y);


kan du please lige forklare havd du gør



er ikke sikker på at jeg har forstået det helt, men jeg vil undersøge det, tak.

Men skal det ikke være: g.drawLine(50,50,50+(int)x,50-(int)y);

minus istedet for plus i 50-/+(int)y


vis man står i 0,0 (venstre højrne), også går 50 mod x, og -50 mod y ender man i 50,50.

Eller skal det ses som at 0,0 + 50,50 = 50,50 <- så har man flyttet orig?? Vis det er sådan kan jeg godt se at det virker logisk nok, men forstår det ikke helt...

.:edit:. vis du regner med radianer, skal man så ikke sætte sin og cos til at gøre det også?



Indlæg senest redigeret d. 12.09.2008 22:17 af Bruger #13669
Math.cos() og Math.sin() bruger ikke grader som parameter men radianer. Jeg tror det er derfor din viser gik amok til at starte med.



Math.cos() og Math.sin() bruger ikke grader som parameter men radianer. Jeg tror det er derfor din viser gik amok til at starte med.


arhh :D

tak



ok, nu virker det næsten. Uret er ikke roteret så 12 er opad... Er det fordi mit eget if-statement virkede? vid det var, hvad mener du så med det der vektor rotation??

og vis det bare var fordi det skulle passe ind i et 100 * 100 panel, hvorfor skal der så ganges med -50 i y?



min kode virker nu.

Den ser således ud:
Fold kodeboks ind/udKode 


forstår ikke alle formlerne, men de virker :D. skal nok finde noget andet end 3*1.5707963, men det virker fint indtil vidre.



t