본문 바로가기
JS

Javascript 삼각함수 sin, cos, tan

by memory-log 2020. 9. 22.

삼각 함수(sin()cos()tan()asin()acos()atan()atan2())는 매개변수와 반환값 모두 호도법(라디안)을 사용한다.

 

라디안

라디안은 각의 크기를 재는 SI 단위이다.

호도라고도 하며, 기호는 rad이다. 단위원의 중심각의 라디안 값은 그 각이 대하는 호의 길이와 같다.

1라디안은 약 57.3도이다.

 

라디안 값을 각도 값으로 반환

라디안 값 / (Math.PI / 180) = 각도 값

 

 

리다인 값 반환

 (Math.PI / 180) * 각도 값 = 라디안 값

 

 

 

 

sin 곡선 그리기 

var ctx = document.getElementById('canvas').getContext('2d');
var width = 1280;
var stepX = 10;
var x = 1400;
var y = 360;
offsetY = 360;
ctx.lineWidth = 10;

setInterval(function(){
  ctx.beginPath();
  ctx.moveTo(x,y);
  x = x - stepX;
  if ( x < 0 ) {
    x = 1400;
    y = 360;
    return;
  }
  y = Math.sin( x / 50 ) * 100 + offsetY;
  ctx.lineTo(x,y);
  ctx.stroke(); 
}, 1000 / 60);

 

var ctx = document.getElementById('canvas').getContext('2d');
var width = 1280;
var stepX = 10;

var x = 1400;
var y = 360;
offsetY = 360;
var colors = ['#16a085', '#1abc9c', '#2ecc71', '#27ae60', '#9b59b6', '#8e44ad', '#f1c40f', '#f39c12', '#1abc9c'];
var cc = 0;
var mc = colors.length;
var color = colors[cc];


ctx.strokeStyle = color;
var lineWidth = 1;
ctx.lineWidth = lineWidth;
var direction = 1;

setInterval(function(){
  
  ctx.beginPath();
  ctx.moveTo(x,y);
  
  x = x - stepX;
  if ( x < 0 ) {
    x = 1400;
    y = 360;
     
    cc++;
    if ( cc >= mc ) {
      cc = 0;
    }
    color = colors[cc];
    ctx.strokeStyle = color;
    return;
  }
  y = Math.sin( x / 50 ) * 100 + offsetY;
  //Math.sin(x / widthOffset) * heightAmplifier + offsetY(Position on screen, i.e center)
  
  ctx.lineTo(x,y);
  ctx.stroke();
  
  if ( direction === 1 ) {
    lineWidth += 1;
  } else {
    lineWidth -= 1;
  }
  if ( lineWidth > 80 ) {
    direction = 0;
  } else if ( lineWidth < 0 ) {
    direction = 1;
  }
  
  ctx.lineWidth = lineWidth;
  
}, 1000 / 60);

 

 

 

 

JS Sine Wave

Some kind of JS Sine Wave...

codepen.io

sin() & cos() 으로 원 운동 표현하기

const dots = document.querySelectorAll('.js-dot');

let w = window.innerWidth;
let h = window.innerHeight;

let angle = 0;

const radian = angle => angle * Math.PI / 180;

const BASE_X = w / 2;
const BASE_Y = h / 2;

const SIZE_RADIUS = 400

const draw = (element, angle) => {
  const x = Math.cos(radian(angle)) * SIZE_RADIUS + BASE_X;
  const y = Math.sin(radian(angle)) * SIZE_RADIUS + BASE_Y;
  
  element.style.transform = `translate(${x}px, ${y}px)`;
  // console.log(x)
}

const tick = () => {
  for (let i = 0; i < dots.length; i++) {
    draw(dots[i], angle + (360 / dots.length) * i);
  }
  
  angle++;
  requestAnimationFrame(tick)
}

tick();

codepen.io/bom_phage/pen/rraagX

 

sin/cos

...

codepen.io

 

원 운동 표현하기
let c = canvas.getContext('2d');
let rect = {w: canvas.width, h: canvas.height}
let i = 0;

requestAnimationFrame(draw);

function draw () {
  c.clearRect(0, 0, rect.w, rect.h);
  let x = Math.sin(-i);
  let y = Math.cos(i);
  c.fillRect(rect.w/2 + x * 50, rect.h/2 + y * 50, 14, 14);
  requestAnimationFrame(draw);
  i += 0.1;
}

 

p5.js 로 웨이브 그리기

let xspacing = 16; // 각 도형들 간의 가로 거리
let w; // 전체 파형의 너비
let theta = 0.0; // 시작 각도 0
let amplitude = 75.0; // 파형의 높이
let period = 500.0; // 파형이 반복되기 전까지 생성되는 픽셀 개수
let dx; // x 증가값
let yvalues; // 파형의 최고 높이를 저장하기 위한 배열

function setup() {
  createCanvas(710, 400);
  w = width + 16;
  dx = (TWO_PI / period) * xspacing;
  yvalues = new Array(floor(w / xspacing));
}

function draw() {
  background(0);
  calcWave();
  renderWave();
}

function calcWave() {
  // 세타값(theta) 증가 (다른 값을 넣어 각속도를 조정해보세요)
  theta += 0.02;

  // 매 x값마다 싸인 함수를 이용해 y값을 계산
  let x = theta;
  for (let i = 0; i < yvalues.length; i++) {
    yvalues[i] = sin(x) * amplitude;
    x += dx;
  }
}

function renderWave() {
  noStroke();
  fill(255);
  // 각 위치에 지정된 타원형으로 파형을 그릴 수 있는 간단한 방법
  for (let x = 0; x < yvalues.length; x++) {
    ellipse(x * xspacing, height / 2 + yvalues[x], 16, 16);
  }
}

 

examples | p5.js

< 돌아가기 example name placeholder example description placeholder toggle text output run reset copy

p5js.org

tan()
var sizeX = 1;
var sizeY = 1;

var getDimensions = function() {
  var offsetHeight = 40; // Codepen fix
  return {
    width: window.innerWidth,
    height: window.innerHeight,
    offsetHeight: offsetHeight
  }
}

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

function init() {
  var dimensions = getDimensions();
  if (canvas.getContext) {
    window.requestAnimationFrame(draw);
  }
  canvas.width = dimensions.width;

  canvas.height = dimensions.height;
}

window.addEventListener('resize', function() {
  var dimensions = getDimensions();
  canvas.width = dimensions.width;
  canvas.height = dimensions.height;
}); 
var t = 3;
function draw() {
  t += 0.00001;
  var dimensions = getDimensions();
  var radius = Math.min(dimensions.width / 2, (dimensions.height - dimensions.offsetHeight) / 2);
  ctx.fillStyle = '#777777';
  var width = dimensions.width;
  var height = dimensions.height;
  
  ctx.clearRect(0, 0, width, height);

  var baseX = (width - sizeX / 2) / 2;
  var baseY = (height - sizeY / 2) / 2;
  var tau = Math.PI * 2;
  for (var i = -tau; i < tau; i += (Math.PI / 180)) {
    var j = i * (180 / Math.PI) * t;
    var formulaX = Math.cos(j) * radius;
    var formulaY = Math.sin(j) * radius;
    var x = baseX + formulaX;
    var y = baseY + formulaY;
    var x2 = baseX + (1 / Math.cos(j)) * 10;
    var y2 = baseY + (1 / Math.sin(j)) * 10;
    ctx.fillStyle = '#777777';
    //ctx.fillRect(x, y, sizeX, sizeY);
    
    ctx.fillStyle = '#0F0';
    ctx.fillRect(baseX + j, baseY + Math.tan(j) * 20, sizeX, sizeY);
    
   ctx.fillStyle = '#F00';
   //ctx.fillRect(x2, y2, sizeX, sizeY);
    
    ctx.fillStyle = '#FF0';
    ctx.fillRect(baseX + j, baseY + (1 / Math.tan(j)) * 20, sizeX, sizeY);
  }
  
  window.requestAnimationFrame(draw);
}

init();

 

 

 

Tan Canvas

Plotting an animated tangent function and its reciprocal....

codepen.io

codepen.io/bror/pen/rVQNoN

 

Canvas Math

...

codepen.io

 

'JS' 카테고리의 다른 글

Refactoring javascript 1  (0) 2020.09.23
Detect Dark mode in CSS & Javascript  (0) 2020.09.23
javascript find  (0) 2020.09.21
Javascript Some, Every  (0) 2020.09.21
detect iPhone X device with JavaScript  (0) 2020.09.21

댓글