【问题标题】:SVG: make a gradient to fill the whole shape for every angle givenSVG:为给定的每个角度制作渐变以填充整个形状
【发布时间】:2013-11-28 20:06:32
【问题描述】:

给定一个介于 0° 和 90° 之间的角度,生成填充整个矩形的 SVG 渐变。

SVG 渐变接受两个控制点而不是角度。这是上图第一个方块的代码:

<linearGradient x1="0" y1="0" x2="1" y2="0.5">

问题是渐变没有覆盖整个正方形。我想扩展渐变以完全填充形状,这样红色三角形将不可见。这是一个 interactive demo(已在 Chrome、Firefox 和 Safari 中测试)给你一个更好的主意。


Solution in JavaScript:

function angleToVector(angle) {
    var od = Math.sqrt(2);
    var op = Math.cos(Math.abs(Math.PI/4 - angle)) * od;
    var x = op * Math.cos(angle);
    var y = op * Math.sin(angle);
    return {x: x, y: y};
}

对于angle between -180° and 180°

function angleToPoints(angle) {
    var segment = Math.floor(angle / Math.PI * 2) + 2;
    var diagonal = (1/2 * segment + 1/4) * Math.PI;
    var op = Math.cos(Math.abs(diagonal - angle)) * Math.sqrt(2);
    var x = op * Math.cos(angle);
    var y = op * Math.sin(angle);

    return {
        x1: x < 0 ? 1 : 0,
        y1: y < 0 ? 1 : 0,
        x2: x >= 0 ? x : x + 1,
        y2: y >= 0 ? y : y + 1
    };
}

可能有一个更简单的解决方案。

【问题讨论】:

  • 能否使用 spreadMethod="pad" 而不是 tile 帮助?顺便说一句,我注意到该示例在 Chrome/Opera/Firefox 中的工作方式非常不同,因此在提交任何方法之前可能值得检查所有浏览器。
  • 不,spreadMethod="pad" 会用结束颜色填充红色三角形区域,这不是我想要的。我修复了演示,使其在 Chrome、Safari 和 Firefox 中保持一致。

标签: javascript vector svg trigonometry linear-gradients


【解决方案1】:

因此,据我所知,您的问题是:给定一个矩形(其左上角是原点 O = (0, 0),右下角是 D = (w, h))和一条线 l 通过点 O 成角度a(与0° &lt;= a &lt;= 90°),在l上找到点P = (x2, y2),使得DPl成直角。

如果绘制矩形的对角线OD,它会完成一个直角三角形P。那个对角线的角度是atan(h/w),如果你从a(即|atan(h/w) - a|)取它的绝对差,你会得到那个直角三角形的角度O。然后你可以取那个角度的余弦,得到OP 之间沿l 的距离与OD(斜边)长度的比例。您可以将斜边相乘,然后将其乘以cos(a)sin(a),分别得到x2y2

总结一下:

|OD| = sqrt(w*w + h*h)
|OP| = cos(|atan(h/w) - a|) * |OD|
x2 = |OP| * cos(a)
y2 = |OP| * sin(a)

【讨论】:

  • 对不起,我错过了一步。您需要将该余弦乘以对角线的长度才能得到|OP|
  • Math.sqrt(2) 似乎在你的代码中起作用了......我猜它是一个单位平方?
  • 关于如何使其在 -180° ≤ 角度 ≤ 180° 下工作的任何想法? codepen.io/NV/pen/JsyAj
猜你喜欢
  • 2016-09-16
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 2020-11-29
相关资源
最近更新 更多