【问题标题】:JavaScript function drawing arc at incorrect angleJavaScript函数以不正确的角度绘制弧线
【发布时间】:2021-12-23 03:04:29
【问题描述】:

我正在尝试创建一个指向特定角度、宽度(以度为单位)和与中心的距离的弧(这样弧不会重叠)。

包含的 sn-p 调用 JavaScript 函数 DrawLine 画线,但角度不正确。此外,当DISTANCE_FROM_CENTER 变量发生变化时,圆弧的角度也会发生变化,这是不应该发生的。

我正在附上一个角度应该是什么样子的屏幕截图。

我还包括我们如何解释圆中的角度,310 度应该指向左上角。 javascript 将它们绘制为指向右侧。

let svg = document.getElementById("icon");
function drawLine(azimuth, radius, length)
{
  let circumference = radius * 2 * Math.PI;
  // Create an SVG <circle> element
  let line = document.createElementNS(svg.namespaceURI, "circle");
  line.setAttribute("r", radius);
  line.setAttribute("stroke-dasharray", length + ' ' + circumference);
  line.setAttribute("transform", "rotate(" + azimuth + ")");
  // Add it to the <svg> element
  svg.appendChild(line);
}

let DISTANCE_FROM_CENTER1 = 93,
DISTANCE_FROM_CENTER2 = 65,
DISTANCE_FROM_CENTER3 = 30,
DISTANCE_FROM_CENTER4 = 9;

drawLine(312, DISTANCE_FROM_CENTER1, 110);

drawLine(312, DISTANCE_FROM_CENTER2, 95);

drawLine(312, DISTANCE_FROM_CENTER3, 55);

drawLine(312, DISTANCE_FROM_CENTER4, 15);
svg {
  width: 400px;
}

circle {
  fill: none;
  stroke: black;
  stroke-width: 14;
}
<svg id="icon" viewBox="-100 -100 200 200">
</svg>

【问题讨论】:

  • 从您发布的图片中,我会说长度应该是相对于周长的。除了你接缝有几个半径相同但角度不同的圆,
  • 它似乎并没有改变我的角度。所有左边缘都对齐,这是预期的,因为您将相同的值 (200) 传递给函数。
  • 我很确定 SVG 认为 0 是完全正确的。我可以检查,但我很确定。您可以将 0 传递给它的角度并检查,但我在查看您的代码时确实尝试了几次。这就是为什么我说我只是在使用你的号码。我想您可能正在寻找 -138 或 232。
  • 如果你想传递你期望的角度,你可以在函数内部调整方位角,看看我的编辑,让我知道这是否是你要找的。​​span>

标签: javascript svg setattribute


【解决方案1】:

如果您要对齐线段的中间,则必须计算角度。该段从 0 开始,长度基于该起点,然后当您旋转该段时,整个物体会转动该量。由于您将相同的变换值 (200) 传递给所有线段,因此它们都转动相同的量,因此它们的所有起点仍然对齐。

所以试试这个(我只是使用您在 sn-p 中使用的值,不确定这些值与图片的关系如何,图片的段数、长度和角度不同)。计算您的段所包含的弧的百分比,并将旋转偏移一半。

let svg = document.getElementById("icon");
function drawLine(azimuth, radius, length) {
  
  let circumference = radius * 2 * Math.PI;
  let arc = length / circumference * 360;
  
  let line = document.createElementNS(svg.namespaceURI, "circle");
  line.setAttribute("r", radius);
  line.setAttribute("stroke-dasharray", `${length} ${circumference}`);
  line.setAttribute("transform", `rotate(${azimuth-(arc/2)})`);
  
  svg.appendChild(line);
}

const arcs = [
  {azimuth: 200, dist: 93, length: 110},
  {azimuth: 200, dist: 65, length:  95},
  {azimuth: 200, dist: 30, length:  55},
  {azimuth: 200, dist:  9, length:  15},
  //{azimuth: 200, dist: 1,  length: 1.5}
];

arcs.forEach(el=>{drawLine(el.azimuth, el.dist, el.length)});
svg {
  width: 400px;
}

circle {
  fill: none;
  stroke: black;
  stroke-width: 14;
}
<svg id="icon" viewBox="-100 -100 200 200">
</svg>

SVG 认为 0 是正确的,这就是路径开始的地方,所以如果你希望 312 指向左上角,就像你的图片一样,并且你还想继续传递它 312 等等,我想您可以从函数内部的方位角中减去 90。像这样:

let svg = document.getElementById("icon");
function drawLine(azimuth, radius, length) {
  
  let circumference = radius * 2 * Math.PI;
  let arc = length / circumference * 360;
  
  let line = document.createElementNS(svg.namespaceURI, "circle");
  line.setAttribute("r", radius);
  line.setAttribute("stroke-dasharray", `${length} ${circumference}`);
  line.setAttribute("transform", `rotate(${azimuth-(arc/2)-90})`);
  
  svg.appendChild(line);
}

const arcs = [
  {azimuth: 312, dist: 93, length: 110},
  {azimuth: 312, dist: 65, length:  95},
  {azimuth: 312, dist: 30, length:  55},
  {azimuth: 312, dist:  9, length:  15},
  //{azimuth: 312, dist: 1,  length: 1.5}
];

arcs.forEach(el=>{drawLine(el.azimuth, el.dist, el.length)});
svg {
  width: 400px;
}

circle {
  fill: none;
  stroke: black;
  stroke-width: 14;
}
<svg id="icon" viewBox="-100 -100 200 200">
</svg>

【讨论】:

  • 谢谢。问题是弧的绘制位置。在 312 度处,圆弧应指向左上角。它指向右边。
  • 我添加了一个带角度的圆形图像。
猜你喜欢
  • 1970-01-01
  • 2016-06-15
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多