Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z rotate() canvas
Forum PHP.pl > Forum > Po stronie przeglądarki
El Nino9
witam
nie mogę zrozumieć poprawnego działania tej funkcji

  1. var canvas = document.getElementById('canvas');
  2. var context=canvas.getContext('2d');
  3.  
  4. context.beginPath();
  5.  
  6. context.moveTo(200, 100);
  7. context.rotate(Math.PI * 90/180);
  8. context.lineTo(200, 50);
  9.  
  10. context.stroke();


bez linijki context.rotate(Math.PI * 90/180) rysuje mi prostą linię
myślałem że po użyciu rotate(), dostanę to linię obróconą o 90 stopni
niestety tak się nie dzieje
jak w prawidłowy sposób otrzymywać transformację linii o dany kąt?
pozdrawiam
Kshyhoo
  1. context.rotate(90 * Math.PI/180);
El Nino9
przecież mnożenie jest przemienne, a jedyne co zmieniłeś to kolejność liczb
efekt nadal jest ten sam, czyli nie taki jak oczekuje
Kshyhoo
U mnie działa: test.
El Nino9
no tak, ale zmieniłeś również współrzędną w moveTo()
poza tym, korzystając z tej funkcji którą podałeś rzeczywiście mogę zmieniać kąt rysowania, ale wraz z nim zmienia się również długość linii
a ja nie chcę by tak się działo, to po pierwsze
po drugie jakikolwiek kąt bym nie wpisał to transformacja przebiega tylko w lewą stronę, a co gdy chcę obrócić linię w prawo?
pozdrawiam
Kshyhoo
A dlaczego nie zrobisz tego tak:
  1. var canvas = document.getElementById('canvas');
  2. var context=canvas.getContext('2d');
  3.  
  4. context.beginPath();
  5. context.moveTo(100, 150);
  6. context.lineTo(300, 50);
  7. context.stroke();
El Nino9
wiem że można tak zrobić, tylko chciałem to zastosować do poruszania wskazówką, np. zegara
a to łatwiej byłoby zrobić chyba na kątach?
Kshyhoo
Tak:
  1. draw();
  2.  
  3. function draw() {
  4. var canvas = document.getElementById('example');
  5. if (canvas.getContext) {
  6. var c2d=canvas.getContext('2d');
  7.  
  8. c2d.clearRect(0,0,300,300);
  9. //Define gradients for 3D / shadow effect
  10. var grad1=c2d.createLinearGradient(0,0,300,300);
  11. grad1.addColorStop(0,"#D83040");
  12. grad1.addColorStop(1,"#801020");
  13. var grad2=c2d.createLinearGradient(0,0,300,300);
  14. grad2.addColorStop(0,"#801020");
  15. grad2.addColorStop(1,"#D83040");
  16. c2d.font="Bold 20px Arial";
  17. c2d.textBaseline="middle";
  18. c2d.textAlign="center";
  19. c2d.lineWidth=1;
  20. c2d.save();
  21. //Outer bezel
  22. c2d.strokeStyle=grad1;
  23. c2d.lineWidth=10;
  24.  
  25. c2d.beginPath();
  26. c2d.arc(150,150,138,0,Math.PI*2,true);
  27. c2d.shadowOffsetX=4;
  28. c2d.shadowOffsetY=4;
  29. c2d.shadowColor="rgba(0,0,0,0.6)";
  30. c2d.shadowBlur=6;
  31. c2d.stroke();
  32. //Inner bezel
  33. c2d.restore();
  34. c2d.strokeStyle=grad2;
  35. c2d.lineWidth=10;
  36. c2d.beginPath();
  37. c2d.arc(150,150,129,0,Math.PI*2,true);
  38. c2d.stroke();
  39. c2d.strokeStyle="#222";
  40. c2d.save();
  41. c2d.translate(150,150);
  42. //Markings/Numerals
  43. for (i=1;i<=60;i++) {
  44. ang=Math.PI/30*i;
  45. sang=Math.sin(ang);
  46. cang=Math.cos(ang);
  47. //If modulus of divide by 5 is zero then draw an hour marker/numeral
  48. if (i % 5 == 0) {
  49. c2d.lineWidth=8;
  50. sx=sang*95;
  51. sy=cang*-95;
  52. ex=sang*120;
  53. ey=cang*-120;
  54. nx=sang*80;
  55. ny=cang*-80;
  56. c2d.fillText(i/5,nx,ny);
  57. //Else this is a minute marker
  58. } else {
  59. c2d.lineWidth=2;
  60. sx=sang*110;
  61. sy=cang*110;
  62. ex=sang*120;
  63. ey=cang*120;
  64. }
  65. c2d.beginPath();
  66. c2d.moveTo(sx,sy);
  67. c2d.lineTo(ex,ey);
  68. c2d.stroke();
  69. }
  70. //Fetch the current time
  71. var ampm="AM";
  72. var now=new Date();
  73. var hrs=now.getHours();
  74. var min=now.getMinutes();
  75. var sec=now.getSeconds();
  76. c2d.strokeStyle="#000";
  77. //Draw AM/PM indicator
  78. if (hrs>=12) ampm="PM";
  79. c2d.lineWidth=1;
  80. c2d.strokeRect(21,-14,44,27);
  81. c2d.fillText(ampm,43,0);
  82. c2d.lineWidth=6;
  83. c2d.save();
  84. //Draw clock pointers but this time rotate the canvas rather than
  85. //calculate x/y start/end positions.
  86. //
  87. //Draw hour hand
  88. c2d.rotate(Math.PI/6*(hrs+(min/60)+(sec/3600)));
  89. c2d.beginPath();
  90. c2d.moveTo(0,10);
  91. c2d.lineTo(0,-60);
  92. c2d.stroke();
  93. c2d.restore();
  94. c2d.save();
  95. //Draw minute hand
  96. c2d.rotate(Math.PI/30*(min+(sec/60)));
  97. c2d.beginPath();
  98. c2d.moveTo(0,20);
  99. c2d.lineTo(0,-110);
  100. c2d.stroke();
  101. c2d.restore();
  102. c2d.save();
  103. //Draw second hand
  104. c2d.rotate(Math.PI/30*sec);
  105. c2d.strokeStyle="#E33";
  106. c2d.beginPath();
  107. c2d.moveTo(0,20);
  108. c2d.lineTo(0,-110);
  109. c2d.stroke();
  110. c2d.restore();
  111.  
  112. //Additional restore to go back to state before translate
  113. //Alternative would be to simply reverse the original translate
  114. c2d.restore();
  115. setTimeout(draw,1000);
  116. }
  117. }
El Nino9
no też znalazłem ten kod hihi smile.gif
chciałem po prostu by ktoś wyjaśnił na prostym przykładzie jaki podałem jak to działa.
pozdro
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.