【发布时间】: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 中测试)给你一个更好的主意。
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