SVG 线上的线性渐变

2023-12-21

我想知道如何制作linearGradient across (from top to bottom)这条线,与下面的渐变走向的示例相反along (from left to right)线。

<svg xmlns="http://www.w3.org/2000/svg" version="1">
<defs>
    <linearGradient id="e" x1="40" y1="210" x2="460" y2="210" gradientUnits="userSpaceOnUse">
        <stop stop-color="steelblue" offset="0" />
        <stop stop-color="red" offset="1" />
    </linearGradient>
</defs>
 <line x1="40" y1="210" x2="460" y2="210" stroke="url(#e)" stroke-width="30" />
</svg>

更改 y 坐标对于未旋转的线效果很好,并且linearGradient现在(从上到下)穿过这条线:

<svg xmlns="http://www.w3.org/2000/svg" version="1">
<defs>
    <linearGradient id="e" x1="40" y1="195" x2="40" y2="225" gradientUnits="userSpaceOnUse">
        <stop stop-color="steelblue" offset="0" />
        <stop stop-color="red" offset="1" />
    </linearGradient>
</defs>
 <line x1="40" y1="210" x2="460" y2="210" stroke="url(#e)" stroke-width="30"/> 
</svg>

但是这个旋转时不起作用:

<svg xmlns="http://www.w3.org/2000/svg" version="1">
<defs>
    <linearGradient id="e" x1="40" y1="235" x2="40" y2="265" gradientUnits="userSpaceOnUse">
        <stop stop-color="steelblue" offset="0" />
        <stop stop-color="red" offset="1" />
    </linearGradient>
</defs>
 <line x1="40" y1="210" x2="460" y2="290" stroke="url(#e)" stroke-width="30"/> 
</svg>

And what I want to have is the rotated line with linear gradient across it. Something like this: example


<svg width="600" height="200" viewBox="0 190 600 200" xmlns="http://www.w3.org/2000/svg" version="1">
<defs>
    <linearGradient id="e" x1="40" y1="210" x2="460" y2="290" gradientUnits="userSpaceOnUse">
        <stop stop-color="steelblue" offset="0" />
        <stop stop-color="red" offset="1" />
    </linearGradient>
</defs>
 <line x1="40" y1="210" x2="460" y2="290" stroke="url(#e)" stroke-width="30"/> 
</svg>

第一种情况的技巧是使直线的 x1 y1,x2 y2 与线性渐变的 x1 y1,x2 y2 坐标相匹配。 对于第二种情况,涉及到更多的数学知识。 您必须创建一条垂直于第一条线的线,其长度等于所需线的宽度,并且从其中一个点的宽度的一半开始。

所以在你的情况下(伪代码!):

Step 1:

得到方向

   dx=x2-x1;
   dy=y2-y1;

dx,dy 现在是从点 1 到点 2 的方向

Step 2:

通过将 dx 和 dy 除以线的长度,将方向归一化为长度 1。

    len=Math.sqrt(dx*dx+dy*dy);
    dx=dx/len;
    dy=dy/len;

当然,如果 len=0,这不起作用,但因为你给了我坐标,所以我现在不必担心。

Step 3:

求垂直方向。这其实很简单,但是逻辑上可以是两个方向。我就选一个吧

    temp=dx;
    dx=-dy;
    dy=temp;

如果你想要另一个方向,只需将 dx 和 dy 取反即可。经过这个过程。

    dx=-dx;
    dy=-dy;

dx, dy 现在保持垂直方向。

Step 4:

将 dx 和 dy 乘以所需的线条宽度(在您的情况下为 30)。我将其称为 w。

    dx=w*dx;
    dy=w*dy;

Step 5:

要找到梯度的 p1 和 p2,请从直线中取出 p1 并添加或减去 dx 的一半。

    gradient_x1=x1+dx*0.5;
    gradient_y1=y1+dx*0.5;
    gradient_x2=x1-dx*0.5;
    gradient_y2=y1-dx*0.5;

现在你可以再次建立你的阵容了。

为了向您展示我的意思,我已经插入您的价值观并完成了整个事情,我得到了这个:

    Your case: (x1="40" y1="210" x2="460" y2="290" w=30)

    ## STEP1 ##
    dx: 420 dy:80

    ## STEP2 ##
    dx: 0.9823385664224747 dy:0.1871121078899952

    ## STEP3 ##
    dx: -0.1871121078899952 dy:0.9823385664224747

    ## STEP4 ##
    dx: -5.613363236699856 dy:29.47015699267424

    ## STEP5 ##
    gradient_x1=37.19331838165007
    gradient_y1=224.7350784963371

    gradient_x2=42.80668161834993
    gradient_y2=195.2649215036629

因此将其插入到您的示例中:

<svg width="600" height="200" viewBox="0 190 600 200" xmlns="http://www.w3.org/2000/svg" version="1">
<defs>
    <linearGradient id="e" x1="37.19331838165007" y1="224.7350784963371" x2="42.80668161834993" y2="195.2649215036629" gradientUnits="userSpaceOnUse">
        <stop stop-color="steelblue" offset="0" />
        <stop stop-color="red" offset="1" />
    </linearGradient>
</defs>
 <line x1="40" y1="210" x2="460" y2="290" stroke="url(#e)" stroke-width="30"/> 
</svg>

包起来

幸运的是,我们根本不需要进行所有这些计算,因为我们有一台计算机,并且 svg 元素可以通过 JavaScript 轻松操作。 要使用 javascript 获取 svg 中的元素,如果它们有一个 id 是最方便的。 你的渐变有一个 id="e",让我们给你的线和 id="l"。

之后就是在页面中插入一个小脚本的问题 从直线(“l”)中取出 x1 y1,x2 y2 并计算所有内容并将其放入梯度(“e”)中,您将得到:

<svg width="600" height="200" viewBox="0 190 600 200" xmlns="http://www.w3.org/2000/svg" version="1">
  <defs>
    <linearGradient id="e" x1="0" y1="0" x2="1" y2="1" gradientUnits="userSpaceOnUse">
    <!-- put the coords on 0,0 1,1 it really doesn't matter, they will be calculated-->
      <stop stop-color="steelblue" offset="0" />
      <stop stop-color="red" offset="1" />
  </linearGradient>
  </defs>
  <line id="l" x1="40" y1="270" x2="450" y2="210" stroke="url(#e)" stroke-width="30"/> 
</svg>

<script>
  var line=document.getElementById("l");
  var x1=parseFloat(l.getAttribute("x1"));
  var y1=parseFloat(l.getAttribute("y1"));
  var x2=parseFloat(l.getAttribute("x2"));
  var y2=parseFloat(l.getAttribute("y2"));
  var w=parseFloat(l.getAttribute("stroke-width"));

  // step 1
  var dx=x2-x1;
  var dy=y2-y1;

  // step 2
  len=Math.sqrt(dx*dx+dy*dy);
  dx=dx/len;
  dy=dy/len;

  // step 3
  var temp=dx;
  dx=-dy;
  dy=temp;
  
  //step 4
  dx=w*dx;
  dy=w*dy;

  //step 5
  var gradient_x1=x1+dx*0.5;
  var gradient_y1=y1+dy*0.5;
  var gradient_x2=x1-dx*0.5;
  var gradient_y2=y1-dy*0.5;

  document.getElementById("e");
  e.setAttribute("x1",gradient_x1);
  e.setAttribute("y1",gradient_y1);
  e.setAttribute("x2",gradient_x2);
  e.setAttribute("y2",gradient_y2);
</script>

您可以自由编辑线条的起点和终点,甚至笔划宽度,脚本将即时修复您的渐变。为了向你“证明”这一点,这正是我所做的。 :) 希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SVG 线上的线性渐变 的相关文章

  • 使用 SkiaSharp 在 Xamarin 中加载 SVG 文件

    从版本 1 55 0 开始 SkiaSharp 支持读取 SVG 文件 该软件包已于几天前发布 2016 年 11 月 10 日 但我找不到足够的有关如何使用它的文档 需要以下包 SkiaSharp 1 55 0 SkiaSharp 视图和
  • SVG 中虚线的悬停事件

    带有线 或路径 的 SVG 使用stroke dasharray当用户将鼠标悬停在虚线的实心部分上时 似乎只会触发 CSS 和 JS 悬停事件 https codepen io anon pen YeXoZy https codepen i
  • 为什么在使用 repaint() 而不是使用 getParent().repaint() 时会出现此 Swing 错误?

    这个问题是基于我不久前在一个简单的 Swing 骰子程序中遇到的问题 我发布的原始问题是here https stackoverflow com questions 22306637 mystery concurrency componen
  • SVG feColorMatrix 在 safari 中不起作用

    我有一个相当简单的设置 我想通过使用 svg 过滤器来改变 svg 图像的颜色
  • 如何制作一连串的ggplots并在它们之间绘制箭头?

    对于一个项目 我需要绘制一些图并在它们之间放置箭头作为序列的指示 我想知道我是否可以用 ggplot 来做到这一点 是否可以使用 ggplot2 绘制一个干净的大箭头并将其添加到最终的多重图中 作为示例 我使用此代码来绘制绘图 librar
  • JS 在两个或多个点之间画线

    我需要在两个标签或标签之间画一条线 Example http caitriona github io connect the dots http caitriona github io connect the dots 我需要做这样的事情
  • iText7 将 SVG 添加到 PdfDocument 中以及可能出现的问题

    关于问题的答案 如何使用 iText7 将 SVG 添加到 PDF 这是一个链接点击这里 https stackoverflow com questions 50059456 how to add an svg to a pdf using
  • 在 ipython 中使用 igraph 绘制顶点标签时出现问题

    我通常在 IPython 笔记本中工作 我使用以下命令在 Windows 上打开它 ipython qtconsole matplotlib inline 我目前正在使用 IPython QtConsole 3 0 0 Python 2 7
  • 旋转 3d 图形的 z 轴

    How do I rotate the z axis of a matplotlib figure so that it appears as the horizontal axis I have created the following
  • SVG 坐标与变换矩阵

    我想在矩形元素上实现像 svg edit 这样的功能 旋转矩形 调整大小 Drag 旋转 SVG 矩形效果很好 但是当我想调整矩形大小时 它就会出现问题 坐标不正确 我使用变换矩阵来旋转targetelement setAttribute
  • 转换 SVG 过滤器

    我正在尝试创建一个像 SVG 圆圈上的阴影这样的材质设计 我希望当您单击圆圈时 这个阴影能够以良好的过渡来增长 但目前我正在努力弄清楚是否可以为这种过渡设置动画 所以我希望有人能够提供帮助 我添加了一个到目前为止所得到的小例子 一个带有阴影
  • 跨浏览器 SVG keepAspectRatio

    我正在尝试有一个SVG里面的图形 img 适合 不裁剪 标签内部且保留宽高比的标签 我创建了SVG在 Inkscape 中 它在所有浏览器上都按预期工作 除了互联网浏览器 9 为了让它发挥作用IE 9我必须添加viewBox 0 0 580
  • 修复 Raphaël 路径节点上 Tipsy 工具提示的位置

    这是一个非常具体且有些复杂的问题 所以我设置了一个最小测试用例 http reveal dk 8080 revealit dk tipsytest 在阅读本文的其余部分之前 您可能应该先了解一下 我的页面显示悬停时突出显示区域的图像Raph
  • 在 Qt 中用像素图画笔画一条线?

    一段时间以来 我正在使用 Qt C 开发一个简单的绘图和绘画应用程序 目前我正在使用 QPainter drawLine 进行绘制 并且工作正常 我想做的是用像素图画笔绘图 这是我可以做到的 我可以使用 QPainterPath 和 QPa
  • d3 饼图中的文本被路径覆盖

    我正在尝试按照 d3 的饼图示例进行操作http bl ocks org mbostock 3887235 http bl ocks org mbostock 3887235 我的代码的最小示例 const container graph
  • 将 SVG 元素放置在图像上

    是否可以拥有以下元素并设置它们的样式 以便 SVG 对象出现在图像上 即像图像的一部分 目前它们显示在其下方的新行中 我知道我可以将图像设置为父 div 的背景图像 但不幸的是我还需要能够在父级内旋转它 所以我认为这不是一个选项 div s
  • 如何在opengl中使用四元数绕屏幕中心旋转?

    我正在尝试实现轨迹球 轨迹球旋转 但我的中心有问题 回转 无论如何 我希望中心成为屏幕的中心 让我解释一下到目前为止我所做的事情 我创建了一个四元数 旋转轴 向量起点x向量结束 角度 向量起点 向量结束 从该四元数中 我创建了一个旋转矩阵
  • 垂直翻转 Android Canvas

    有没有一种简单的方法可以在 Android 中翻转画布 我似乎找不到任何可以让我垂直翻转它的东西 这样 y 轴上的零就是手机屏幕的底部而不是顶部 如果解决方案不是特别快也没关系 因为我没有对画布进行任何计算密集的操作 提前致谢 Try ca
  • D3.以编程方式缩放后使用鼠标滚轮时缩放会跳转

    当我通过单击鼠标缩放到特定位置然后尝试平移或使用鼠标滚轮时 缩放行为会跳跃 看来我的缩放级别正在恢复 就像单击鼠标之前一样 这是我的事件处理程序 function click d var x y k if d centered d var
  • 动画持续时间不准确

    我在 SVG 中创建了加载微调器 但动画持续时间不准确 例如 30 秒动画持续时间 实际 26 秒 动画持续时间 45 秒 实际持续时间 38 秒 60 秒动画持续时间 实际 51 秒 我很绝望 不知道哪里可能出错 你能帮助我吗 1 旋转器

随机推荐

  • 苹果推送消息

    我正在将推送提供商服务器与谷歌代码中的代码 php apns 集成 除了每条消息的字节数之外 一切似乎都很好 每个有效负载的字节数最多应为 256 个字符 如果发送一些汉字或者UTF 8字符 JSON编码后 每个字符占用6个字节 我对吗 所
  • 在网站上使用内联/base64 图像比仅链接到硬文件要快多少?

    使用 base64 line 来显示图像比简单地链接到服务器上的硬文件快多少 url data image png base64 我还没有找到任何类型的性能指标 我有几个顾虑 您不再获得缓存的好处 Base64 的大小不是比 PNG JPE
  • 在 Sass 中使用 CSS 属性变量

    我正在编写一个 mixin 其中包含一些数学计算元素的百分比宽度 但由于它非常有用 我也想对其他属性使用相同的函数 例如边距和填充 有没有办法将属性名称作为参数传递给 mixin mixin w fluid property name w
  • “EntityManager 没有持久性提供程序”错误

    我是 JPA 的新手 我尝试从书中做一个简单的例子 但无论我做什么 我都会收到以下错误 Exception in thread main javax persistence PersistenceException No Persisten
  • Java的排序算法是什么[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 OpenJDK 内部如何对数据类型进行排序以及为什么 如果能说一下具体的算法就太好了 从版本 7 开始 Oracle 的 Java 实
  • 如何更改conda base的路径

    I am a Linux集群用户 当我安装了一个版本miniconda 集群有自己的版本anaconda 当我做 conda info envs 输出是 conda environments home user miniconda3 env
  • 如何使用类型级函数动态创建静态类型?

    在 TypeScript 中 有类型级 功能允许根据给定创建新类型literal 类型 规格 see 映射类型 https www staging typescript org docs handbook advanced types ht
  • 如何计算 std::weak_ptr 的哈希值?

    所以我有使用的代码std weak ptr并将它们维护在std set 而且效果很好 并且在过去的五七年里一直有效 最近我想我应该在一个std unordered set 嗯 实际上在一个f14 F14ValueSet 为此 我需要它的哈希
  • 打破批处理文件中的嵌套 for 循环

    两次遇到这个问题后 我想我会将其发布在这里 看看是否有人知道如何解决它 我似乎无法使用打破嵌套循环goto 因为看起来当它跳出内部循环时 括号就会不匹配 因为它从未到达内部结束循环 我已将其范围缩小为一个非常简单的示例 for a in 1
  • 将日期时间转换为时间戳 PHP

    我的 GPS 设备正在与我的 php Web 服务通信 它发送 date 311011 和 time 060904 格式 time str split time 2 date str split date 2 time implode ti
  • 在 iOS 7 中呈现 UIImagePickerController 的问题

    我的应用程序仅在横向模式下运行 所以我知道UIImagePickerController仅以纵向模式呈现 因此在 iOS 6 中 我创建了一个子类UIImagePickerController这迫使UIImagePickerControll
  • Windows 重新启动后,Postgresql 一次特定查询失败

    我在 Windows 上的 C 应用程序中使用 Postgresql 我遇到的问题非常奇怪 可以描述如下 我重新启动 Windows 我运行程序 一个特定查询失败 SELECT COUNT AS c FROM files WHERE tot
  • Android Studio - build.gradle 中出现未捕获的翻译错误 ExecutionException OutOfMemory

    我在 Android Studio 中使用 Android 应用程序时遇到了一个奇怪的问题 一切似乎都工作正常 直到今天添加了一些之后新文件并进行一些更新构建 gradle 我看到的错误消息如下 Uncaught translation e
  • SMT 中的混合理论

    我想构造一个 SMT 公式 其中包含对整数线性算术和布尔变量的多个断言 以及对实际非线性算术和布尔变量的一些断言 对整数和实数的断言仅共享布尔变量 例如 请考虑以下公式 declare fun b Bool assert b true de
  • Android从url解析json并存储它

    你好 我正在创建我的第一个 Android 应用程序 我想知道从 URL 解析 JSON Feed 的最佳和最有效的方法是什么 而且理想情况下我想将它存储在某个地方 这样我就可以继续返回它在应用程序的不同部分 我到处寻找 发现了很多不同的方
  • 如何在android中设置MediaController背景的透明度

    我想设置 MediaController 背景而不是控件的透明度 我尝试使用 mediaController setAlpha 0 6f 但它也对控件应用透明度this https i stack imgur com lOtO5 jpg 找
  • 删除字符串之间不需要的空格[重复]

    这个问题在这里已经有答案了 我想知道如何删除字符串之间不需要的空格 例如 gt gt gt a Hello world 我想打印它 删除多余的中间空格 你好世界 这会起作用 join a split 没有任何争论 a split 将自动按空
  • 具有多层的 JFrame

    我有一个有两层的窗口 静态背景和包含移动对象的前景 我的想法是只绘制一次背景 因为它不会改变 所以我使更改面板透明并将其添加到静态背景之上 这是代码 public static void main String args JPanel ch
  • 如何使用 Vaadin 10 和 JMeter 执行负载测试/性能测试

    我从事 Vaadin 10 项目 我们想要在我们的网站上执行负载测试 在我们使用 Vaadin 10 之前 我们可以使用 Jmeter 做到这一点 但使用 Vaadin 10 似乎 JMeter 不起作用 我们尝试使用 JMeter 5 1
  • SVG 线上的线性渐变

    我想知道如何制作linearGradient across from top to bottom 这条线 与下面的渐变走向的示例相反along from left to right 线