Advertisement
stuppid_bot

Draw Circle Segments

Dec 26th, 2016
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const DEG2RAD = Math.PI / 180;
  2.  
  3. class Point {
  4.   constructor(x, y) {
  5.     this.x = x;
  6.     this.y = y;
  7.   }
  8.   set x(v){
  9.     this._x=Math.round(v);
  10.   }
  11.   set y(v){
  12.     this._y=Math.round(v);
  13.   }
  14.   get x(){
  15.     return this._x;
  16.   }
  17.   get y(){
  18.     return this._y;
  19.   }
  20. }
  21.  
  22. function getCirclePoint(pivot, radius, angle) {
  23.   let rads=DEG2RAD*angle;
  24.   return new Point(pivot.x+Math.sin(rads)*radius,pivot.y-Math.cos(rads)*radius);
  25. }
  26.  
  27. function createSVGElement(tag, attrs = {}) {
  28.   let el = document.createElementNS('http://www.w3.org/2000/svg', tag);
  29.   for (let attr in attrs) {
  30.     if (hasOwn(attr, attrs)) {
  31.       el.setAttribute(attr, attrs[attr]);
  32.     }
  33.   }
  34.   return el;
  35. }
  36.  
  37. function createCircleSector(pivot, radius, startAngle, endAngle, fill) {
  38.   let startPoint = getCirclePoint(pivot, radius, startAngle);
  39.   let endPoint = getCirclePoint(pivot, radius, endAngle);
  40.   // console.log('start=',startPoint,'end=',endPoint);
  41.   let angle = Math.abs(startAngle - endAngle);
  42.   // https://svg-art.ru/?page_id=900
  43.   let d = [
  44.     // Перемещаемся в начальную точку
  45.     'M' + startPoint.x, startPoint.y +
  46.     'A' + radius, radius,
  47.     // x-axis-rotation – угол поворота всей дуги элипса относительно оси абцисс
  48.     0,
  49.     // large-arc-flag – параметр, отвечающий за вывод большей части дуги,
  50.     // если (=1) или меньшей (=0) части дуги
  51.     angle > 180 ? 1 : 0,
  52.     // sweep-flag – отвечает за направление отрисовки дуги из начальной точки в
  53.     // конечную точку. Если sweep-flag=1, то дуга элипса будет отрисована по
  54.     // часовой стрелке. При sweep-flag=0 – против часовой стрелки.
  55.     1,
  56.     endPoint.x, endPoint.y +
  57.     'L' + pivot.x, pivot.y,
  58.   ].join(' ');
  59.   return createSVGElement('path', {fill, d});
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement