SVG - 调整以一定角度放置的矩形的大小

2024-04-01

All,

我的应用程序中有一个 SVG 矩形,可以通过拖动矩形两侧的结束栏(左和右)来水平拉伸它。矩形可以是

(1) 调整大小(通过如上所述拉伸),

(2)拖动,

(3)并旋转。

一切工作正常,但是,一个奇怪的经历是,当我将矩形旋转到接近 90 度,然后尝试调整矩形大小时,它开始从矩形的相对边框而不是原始边框拉伸。 (这是图片):

当我使用旋转功能时,左和右似乎变得混乱。

以下是修改后的 HTML、JS 和 SVG:

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
<!--        <script type="text/javascript" src="CPolyline.js">

        </script>-->
    </head>
    <body>
        <object id="oo" data="rect2.svg" style="position:fixed;width: 800px;height:800px;bottom:-100px;right: 375px;">

    </object>
        path: <input type="button" id="path" onclick="X()">
        path2: <input type="button" id="path2" onclick="Y()">
     <input type="button" value="Rotate" onclick="Rotate1()">


        <script type="text/javascript">
            var ob=document.getElementById("oo")

            var svgDoc=null;
            var svgRoot=null;
            var MyGroupObjectsObj = null;
            var svgNS = "http://www.w3.org/2000/svg";
            var dragTarget = null;
            var rectTemplate = null;
            var grabPoint = null;
            var clientPoint = null;
            var rectX = null;
            var rectY = null;
            var rectWidth = null;
            var rectHeight = null;
            var arr=new Array();
            var resizingLeft = false;
            var resizingRight = false;
            var rectrot=null

            ob.addEventListener("load", function(){

                svgDoc=ob.contentDocument;

                svgRoot=svgDoc.documentElement;
                grabPoint = svgRoot.createSVGPoint();
                clientPoint = svgRoot.createSVGPoint();
                rectTemplate = svgDoc.getElementById('rectTemplate')

       rectrot=svgDoc.getElementById("rect1")



}, false)



var angel=0


function Rotate1()
{

       angel=angel+10
       //alert(rectrot)

       var c=rectTemplate.getAttribute("transform");
       var widt=Number(rectTemplate.getAttribute("width"))/2;

        var hie=Number(rectTemplate.getAttribute("height"))/2
        var tran=c.match(/[\d\.]+/g);
        var newxpo=Number(tran[0])+widt;
        var newypo=Number(tran[1])+hie;
        var r=Math.tan((newxpo)/(newypo))
      rectTemplate.parentNode.setAttribute("transform","translate("+newxpo+" "+newypo+")"+"rotate("+angel+") translate("+(newxpo*-1)+" "+(newypo*-1)+")");



}


function MouseDown(evt)
{

  var targetElement = evt.target;
       var checkForResizeAttempt = false;

        if (targetElement == rectTemplate)
        {
            //arr.push(cir ,cir1,rectTemplate)

               dragTarget = targetElement;
               checkForResizeAttempt = true;

                       var transMatrix = dragTarget.getCTM();


        grabPoint.x = evt.clientX - Number(transMatrix.e);
        grabPoint.y = evt.clientY - Number(transMatrix.f);

        }

        var transMatrix = dragTarget.getCTM();



//var transMatrix = dragTarget.getCTM().inverse();

        grabPoint.x = evt.clientX - Number(transMatrix.e);
        grabPoint.y = evt.clientY - Number(transMatrix.f);

        if (window.console) console.log(grabPoint.x + " " + grabPoint.y);
        if (window.console) console.log(evt.clientX + " " + evt.clientY);

        if (checkForResizeAttempt)
        {
          clientPoint.x = evt.clientX;
          clientPoint.y = evt.clientY;
          rectX = Number(dragTarget.getAttributeNS(null, "x"));
          rectY = Number(dragTarget.getAttributeNS(null, "y"));
          rectWidth = Number(dragTarget.getAttributeNS(null, "width"));
          rectHeight = Number(dragTarget.getAttributeNS(null, "height"));

          if ((grabPoint.x - rectX) < 10)
          {
            resizingLeft = true;
          }
          else if (((rectX + rectWidth) - grabPoint.x) < 10)
          {
            resizingRight = true;
          }

          if (resizingLeft || resizingRight)
          {
            dragTarget.setAttributeNS(null,"stroke","green");
          }
          else
          {
            dragTarget.setAttributeNS(null,"stroke","black");
          }
        }
      }

function MouseMove(evt)
{
evt.stopPropagation();
 if (dragTarget == null)
      {
        return;
      }
      if (resizingLeft)
      {
        if (window.console) console.log(evt.clientX + " " + evt.clientY);
        deltaX = (clientPoint.x - evt.clientX);
        if (window.console) console.log("deltaX = " + deltaX);
        dragTarget.setAttributeNS(null,"width",rectWidth + deltaX);
        dragTarget.setAttributeNS(null,"x",rectX - deltaX);
      }
      else if (resizingRight)
      {
        deltaX = (clientPoint.x - evt.clientX);
        if (window.console) console.log("rectWidth = " + rectWidth + " deltaX = " + deltaX);
        dragTarget.setAttributeNS(null,"width",rectWidth - deltaX);


      }
      else
      {


        var newXX = evt.clientX-grabPoint.x;
        var newYX = evt.clientY-grabPoint.y;


        dragTarget.setAttributeNS(null,'transform','translate(' + newXX + ',' + newYX + ')');
      }

}
function MouseUp(evt)
{
  evt.stopPropagation();
   if (dragTarget == null)
      {
        return;
      }
      resizingLeft = false;
      resizingRight = false;
      resizingTop = false;
      resizingBottom = false;
     // var transMatrix = dragTarget.getCTM().inverse();
      dragTarget.setAttributeNS(null,"stroke","blue");
      dragTarget = null;


}


        </script>
    </body>
</html>



--



=======SVG ====

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
     x="0px" y="0px" width="612px" height="792px" xml:space="preserve"
onmousedown="ecmascript:top.MouseDown(evt)"
onmousemove="ecmascript:top.MouseMove(evt)"
onmouseup="ecmascript:top.MouseUp(evt)">




<g id="rect1">
  <rect id="rectTemplate" x="0" y="0" stroke="blue" width="100" height="30" />

 </g>

我在我的答案中发布了一个拖动和调整转换后的 SVG 矩形大小的示例:
SVG 坐标与变换矩阵 https://stackoverflow.com/questions/4850821/svg-coordinates-with-transform-matrix/5223921#5223921

您可以在我的网站上查看工作示例:
http://phrogz.net/svg/drag_under_transformation.xhtml http://phrogz.net/svg/drag_under_transformation.xhtml

关键是:

  1. 当您开始拖动 (mousedown)记录鼠标位置(在 SVG 全局空间中)。
  2. 拖动期间 (mousemove) 计算拖动的偏移量(在 SVG 全局空间中),然后
  3. 将全局空间的偏移量转换为对象的局部空间,并使用它来通知您的更改。

无论应用什么转换层次结构,这都有效(如我的示例所示)。

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

SVG - 调整以一定角度放置的矩形的大小 的相关文章

  • 使用路径id获取SVG路径d属性

    我有单独的 json 包含 SVG 路径 Id 有没有办法使用路径 id 获取 SVG 路径 d 属性 或者有没有办法只使用路径 ID 来填充 SVG 路径 您可以通过调用 document getElementById 来获取路径元素 然
  • 旋转 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
  • 在 d3.js 中换行长文本

    我想将长文本元素换行为宽度 这里的例子取自博斯托克的wrap功能 http bl ocks org mbostock 7555321 但似乎有两个问题 首先 wrap的结果没有继承元素的x值 文本左移 其次它绕在同一条线上 并且lineHe
  • 快速响应的交互式图表/图形:SVG、Canvas 还是其他?

    我正在尝试选择正确的技术来更新一个项目 该项目基本上在可缩放 可平移的图表中渲染数千个点 当前使用 Protovis 的实现性能不佳 在这里查看 http www planethunters org classify http www pl
  • CSS 中的 Data-URI SVG 背景在 Firefox 中不起作用

    好的 这就是我想做的 我的 css 文件中有这段代码 form row textfield hover textfield m hover background image url data image svg xml base64 PHN
  • 编程界面方向更改不适用于 iOS

    因此 我有一个项目 当用户按下按钮时 我需要强制改变方向 我创建了一个github 上的示例应用程序 https github com vradenburg ForcedOrientationChange来演示这个问题 interface
  • ie11 中的 SVG 问题

    我有一个 div 其高度设置为 320 像素 然后它的子元素宽度设置为 100 它的子文件是一个 SVG 文件 我将其宽度设置为容器的 200 在运行良好的 Chrome 和 Firefox 中 我得到了如下所示的漂亮图像 HTML 看起来
  • 使用 classed("active",true) 鼠标悬停时 D3 颜色变化

    我是 js 和 D3 的新手 我已经生成了某种热图 并且想使用 D3 的 on mouseover 更改图块的颜色 我可以显式更改颜色 但想使用 CSS 活动规则 可能是一些简单的东西可以修复 任何帮助将不胜感激 完整代码如下 Thanks
  • iPhone/Xcode:UIImage 和 UIImageView 无法使用该程序

    从 iPhone 照片库中选取图像后 我尝试在 iPhone 文档目录中保存和加载 UIImage 它可以这样做 但由于某种原因 当我加载图像时 它会逆时针旋转 90 度 这是我的 saveImage 和 loadImage 方法 保存图片
  • 如何将 UIView 从右上角设置动画/旋转 90 度?

    我花了几个小时试图找到一种方法来将 UIView 从右上角设置动画 旋转 90 度 效果几乎应该像屏幕顶部的旋转门一样 希望有人可以帮忙 因此 在我按下回车键后 我突然将两个和两个放在一起 并认为节拍器样本的工作方式有点像一扇旋转门 这让我
  • 有没有适用于 Android 的精简版 SVG 查看器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Android 是否支持查看 SVG 文件 或者是否有适用于 Android 平台的第 3 方 SVG
  • 移动浏览器上带有阴影模糊的 SVG

    我正在努力在尽可能多的平台上制作带有阴影的 SVG 图标 我为此使用以下简单的 CSS test width 14px height 14px background image url images test svg background
  • 动画 SVG 在页面加载之前不会显示动画

    我的网站包含大量广告 加载需要一段时间 确切地说 这并不是一个问题 但我注意到任何 SVG 动画都会立即绘制第一帧 但动画只有在页面上的所有加载完成后才会出现 SVG 动画通常指示旋转器 加载图标 有没有办法立即启动SVG动画 或者如果我将
  • Android和播放SVG动画

    我正在编写一个 Android 应用程序 我想播放一个简单的 SVG 动画 我知道 Android 不提供 SVG 支持 我在这里有什么选择 从 Android Lollipop API 级别 21 开始 可以使用动画矢量Drawable
  • Three.js - 如何使用姿势估计数据为 3D 模型制作动画

    我正在尝试使用姿势估计坐标来对 Three js 中的装配模型进行动画处理 我正在使用的姿势估计技术提供了视频源中人物的实时 x y z 坐标 我正在尝试使用这些坐标相应地移动 3D 模型 我使用下面的代码 其中一些代码是我在相关问题的答案
  • 自 JRE 1.7.0_25 起,Batik 无法进行转换

    自从我更新到 JAVA 1 7 0 25 以来 蜡染在应用转换时会抛出异常 堆栈跟踪是 java awt image ImagingOpException Unable to transform src image at java awt
  • Android 上的 SVG 支持

    Android 支持 SVG 吗 有什么例子吗 最完整的答案是这样的 Android 2 x 默认浏览器本身不支持 SVG Android 3 默认浏览器支持 SVG 要将 SVG 支持添加到 2 x 版本的平台 您有两个基本选择 安装功能
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • 使用 jspdf 将 Svg 渲染为 Pdf

    我在使用 jspdf 将 svg 元素渲染为 pdf 时遇到问题 我正在使用插件https github com CBiX svgToPdf js https github com CBiX svgToPdf js 去做这个 下面是我的代码
  • SVG 动画不适用于 Chrome 中的 favicon

    In the SVG 图标已设置 这是旋转内圆的SVG文件的内容 Favicon 动画在 Chrome 中根本不起作用 如何让它在 Chrome 中工作 在 Firefox 中可以正常工作 在 Edge 中则不行 但 Chrome 是最重要

随机推荐

  • User.config是如何创建以及如何使用的

    我开始阅读有关配置文件的内容 并阅读有关 user config 的内容 谷歌搜索了一下 但找不到它是如何创建以及如何使用的 另请注意 将为每个用户创建一个单独的 user config 甚至阅读 StackOverflow 中的问题 但它
  • iOS10应用关闭时如何响应本地通知?

    当应用程序完全关闭 不在后台 时如何响应本地通知 当应用程序在后台或前台运行时 一切正常 但是当应用程序关闭并且我试图回复通知时 仅 application didFinishLaunchingWithOptions 被呼叫 userNot
  • python中带注释的双向条形图plotly

    我有一个带有玩具版本的 pandas 数据集 可以用它创建 creating a toy pandas dataframe s1 pd Series dont have a mortgage 31 8 have mortgage 15 65
  • 从 Boost 多索引迭代器获取数字索引

    我正在存储以下一堆内容 struct Article std string title unsigned db id id field in MediaWiki database dump 在 Boost MultiIndex 容器中 定义
  • 如何将图像旁边的文本垂直居中

    无论我做什么 我都无法使镜头在图像旁边垂直居中 有什么想法吗 我已经搜索过但没有结果 任何帮助将不胜感激 谢谢 您可能需要扩大结果窗口才能看到我在说什么 FIDDLE http jsfiddle net mbM7C 4 HTML div c
  • 使用 Twilio 发送群组消息

    有没有办法使用 twilio 向群组线程发送消息 我不希望每个收件人都有一个单独的线程 其中包含发送消息的 twilio 号码 感谢您的任何建议 来自 Twilio 的 Ricky 在这里 您无法按照您所描述的方式进行设置 但我们确实有一篇
  • 如何在 IIS 10 上配置缓存?

    我有一个网站 并且启用了缓存 如下所示 为服务器启用缓存 为我正在测试的网站启用缓存 在响应标头中 我将整个网站的网页内容过期时间设置为 30 天 没有针对任何特定文件夹的设置 为文件 css js png woff2 启用缓存 在 Chr
  • 在 Kotlin 中为 API 级别小于或等于 16 创建 Date 对象

    这听起来可能非常有趣和基本 但我正在努力通过将纪元到它的秒数传递给 Kotlin 来创建 DateTime 类型的对象 我得到的示例要么是需要 API 级别 26 的库 要么只是讨论从 DD MM YYYY 字符串到其他字符串的格式转换 到
  • 使用单元格按钮操作传递多个参数

    NOTE 我不需要任何关于使用 UITableview 的 didselect 委托发送数据的建议 myButton h import
  • 在 UITableView 中保留占位符单元格

    我有一个 UITableView 我永远不想低于 1 个单元格 它是一个目录读数 如果目录中没有文件 它有一个单元格显示 无文件 在编辑模式下 有一个用于创建文件的奖励单元格 因此编辑模式永远不会低于两个单元格 可能只是睡眠不足让我现在无法
  • 避免在 sweave/pgfsweave 编译期间显示数字

    使用 sweave pgfsweave 进行编译时 每次在 R 中创建图形时 它都会显示在图形窗口中 在 sweave 编译过程中 这在许多情况下很有帮助 因为我可以在编译文档时看到图形的样子 但是当我通过 ssh 编译一个大文档时 这可能
  • Marshal.GenerateGuidForType(Type) 和 Type.GUID 有什么区别?

    Type classType typeof SomeClass bool equal Marshal GenerateGuidForType classType classType GUID 我还没有发现不符合这个条件的案例 So 为什么以
  • 从程序内调用 daemon(0,0) 和在后台启动程序并重定向其输出有区别吗

    在程序 progX 开头使用以下代码有什么区别 if daemon 0 0 1 printf daemon error s strerror errno 或通过以下命令运行 progX progX 2 gt dev null 1 gt de
  • 无法加载 C++/CLI DLL 资源

    我只是想查看资源名称 但什么也没有出现 我在 Visual Studio 2010 中制作并编译了一个 C CLI 托管 DLL 并添加了一些资源文件作为测试 一个图标和一个位图 我已经检查过 PE Explorer 资源肯定在那里 我的简
  • Grails - 按域关系属性排序(使用 createCriteria())

    我有两个具有 1 n 关系的域类 import Action class Task Action actionParent String taskName and class Action String actionName 我有一个任务列
  • 如何获取每个 Kotlin 的当前索引

    如何在foreach循环中获取索引 我想打印每第二次迭代的数字 例如 for value in collection if iteration no 2 do something 在java中 我们有传统的for循环 for int i 0
  • 新的 Clang Objective-C 文字可以重定向到自定义类吗?

    虽然超载 开始踏上危险的领域 我喜欢在 Clang 3 1 中添加新的 Objective C 文字 不幸的是 新的文字对我来说用处有限 除了代码需要与 AppKit 交互的情况外 我大多放弃使用基础类 转而使用我自己的自定义框架 出于多种
  • 在请求正文中发送数组不起作用:使用改造 2.1.0

    将 CustomDishItems 作为数组发送时给出结果 服务器在处理请求时遇到错误 它适用于 CustomDishItems 以下是我使用 PHP Web 服务在服务器上 POST 所需的数据 服务网址 http saavorapi p
  • iPad - 获取纵向和横向屏幕尺寸

    我使用以下代码来获取屏幕尺寸宽度 CGFloat width UIScreen mainScreen bounds size width 100 但其纵向和横向的宽度均为 668 0 如何根据设备的方向获得不同的宽度 我遇到了与您相同的问题
  • SVG - 调整以一定角度放置的矩形的大小

    All 我的应用程序中有一个 SVG 矩形 可以通过拖动矩形两侧的结束栏 左和右 来水平拉伸它 矩形可以是 1 调整大小 通过如上所述拉伸 2 拖动 3 并旋转 一切工作正常 但是 一个奇怪的经历是 当我将矩形旋转到接近 90 度 然后尝试