如何使用GDI将鼠标坐标转换为世界坐标?
或者使用GDI绘制SVG形状的边框(甚至更好)旧的Skool区域?

无论如何。我一直在寻找SVG代码,发现:
http://development.mwcs.de/svgimage.html
这是第一个实际上适用于SVG的Delphi组件,但我离题。

该组件使用GDI显示圆,曲线等
GDI使用矩阵将世界坐标,旋转和失真转换为屏幕坐标。
这部分我明白了您使用矩阵乘法进行翻译。

问题是这个
如果我将鼠标光标指向一个闭合的形状:

>我从哪里可以得到矩阵将我的鼠标的屏幕点翻译成一个世界点,我可以在我在屏幕上绘制的圈子中进行测试。
在所有这些GDI对象中有很多矩阵可供选择。
>请不要给我关于绘制位图和测试光标下的魔术颜色的东西,这不是我要找的。
>如果有一个矩阵链,我如何以正确的(倒置的)顺序遍历它们,以便我的屏幕坐标被正确地引导到世界坐标?

换一种说法
从SVG图像中读取的形状是由矩阵变成屏幕坐标的原语。
如何从屏幕坐标反转到坐标,我可以使用它来查看我是否在一个形状或不是一个形状。

请注意
我需要知道我的形状。
由于SVG图像的设置方式,每个形状都有一个id,我想使用它来查看我用鼠标命中的区域。

编辑

另外

>我可以在屏幕坐标中得到一个边框的每个形状,所以我可以检查我的鼠标坐标。
>我可以得到一个旧的Skool GDI区域,我可以在屏幕坐标中做一个PtInRegion。

希望你能帮助我找到所有这些扭曲的路径:-)。

解决方法

我没有挖掘代码,但是我可以用矩阵帮助一点(点3)。

我猜,使用三个基本的变换矩阵:旋转,缩放和平移矩阵。我们分别叫他们R,S和T。

关于应用矩阵有一个棘手的部分。说,你想翻译点,然后围绕原点中心旋转。换句话说,您要将旋转应用于点的翻译效果。因此,矩阵将以以下方式应用:

R(T(P))= R * T * P = S

其中*是矩阵乘法。请注意,相乘矩阵的顺序与您的意图相反。

但是,如果要进行逆变换,除了反转矩阵的顺序之外,还必须评估它们的反转。我们翻译了点,然后旋转 – 所以现在我们将它旋转回来,然后翻译回来:

T ^ -1(R ^ -1(S))= T ^ -1 * R ^ -1 * S = P

请注意,您不必计算每个矩阵的倒数,显然T ^ -1(x)= T(-x),R ^ -1(角度)= R( – 角)等。然而,您必须推导出转换的论点,如果您只能访问转换矩阵,这可能并不容易。

我猜,世界坐标是通过翻译和比例矩阵的组合转换为屏幕坐标。相对于整个场景的缩放因子(以及可能的显示器的DPI),最后一个负责从世界坐标到像素的“改变单位”。另一方面,翻译矩阵反映了场景平移,并且可以在比例矩阵之前或之后应用。在第一种情况下,平移存储在世界坐标中,在第二次平移中存储在屏幕坐标中。

我也会猜测,所有的对象变换都在世界坐标中完成(对于我来说听起来比在屏幕坐标中这样做更方便)。所以,您可能会期望每个对象的观点都受到以下转换:

W(S(R(T(P))))= W * S * R * T * P,

其中W是世界到屏幕转换,S是scale,R是rotation,T是translation。

希望我至少帮助了一点…

更新于17-04-2011

好的,我现在看了代码。 SVG对象的PaintTo方法如下所示:

procedure TSVG.PaintTo(Graphics: TGPGraphics; Bounds: TGPRectF;
  Rects: PRectArray; RectCount: Integer);
var 
  M: TGPMatrix;
  MA: TMatrixArray;
begin
  M := TGPMatrix.Create;
  try
    Graphics.GetTransform(M);
    try
      M.GetElements(MA);

      FInitialMatrix.Cells[0,0] := MA[0];
      FInitialMatrix.Cells[0,1] := MA[1];
      FInitialMatrix.Cells[1,0] := MA[2];
      FInitialMatrix.Cells[1,1] := MA[3];
      FInitialMatrix.Cells[2,0] := MA[4];
      FInitialMatrix.Cells[2,1] := MA[5];
      FInitialMatrix.Cells[2,2] := 1;

      SetBounds(Bounds);

      Paint(Graphics,Rects,RectCount);
    finally
      Graphics.SetTransform(M);
    end;
  finally
    M.Free;
  end;
end;

在任何绘图之前,该方法调用Graphics.GetTransform(M)。这一个反过来又称为GdipGetWorldTransform,它似乎是WinAPI的GetWorldTransform上的一个封装函数。

我猜,这可能是一个很好的地方开始:)

delphi – 使用世界坐标SVG图像中的屏幕坐标的Hittest的更多相关文章

  1. ios – 如何将CGAffineTransform应用于CGPoint

    如果我有一个转换矩阵,作为CGAffineTransform,一个点,作为CGPoint,我怎样才能得到矩阵矢量乘积?

  2. 在电力智能测量数据应用中的分层时间序列预测正则化Regularization in Hierarchical Time Series Forecasting with Application to

    电力需求数据经常呈现分层结构。在预测合计电量需求问题上有大量的文献。一层中的不同的时间序列可能会以一种变化的复杂的方式互相影响。特殊来说,不同层的时间序列可能包含完全不同的模式。最简单的预测分层数据的方法就是把底层的单独的序列预测加起来。然而在高维误差协方差矩阵中高维的非惩罚回归和预估误差可能导致调整预测的不确定性的增加,从而预测表现变差。

  3. 有没有一个很好的PHP库用于向量和矩阵?

    q=math&in=packages&x=0&y=0&p=1我不知道他们是否符合你的需要.你自己看.

  4. 系统学习机器学习之正则化二

    监督机器学习问题无非就是“minimizeyourerrorwhileregularizingyourparameters”,也就是在规则化参数的同时最小化误差。对机器学习也是一样,如果被我们人稍微点拨一下,它肯定能更快的学习相应的任务。OK,到这里,如果你在机器学习浴血奋战多年,你会发现,哎哟哟,机器学习的大部分带参模型都和这个不但形似,而且神似。没错,这就是这节的题目把L0和L1放在一起的原因,因为他们有着某种不寻常的关系。

  5. 压缩感知重构算法之正则化正交匹配追踪(ROMP)

    本篇将在上一篇《压缩感知重构算法之正交匹配追踪》的基础上给出正则化正交匹配追踪算法的MATLAB函数代码,并且给出单次测试例程代码、测量数M与重构成功概率关系曲线绘制例程代码。

  6. 机器学习中的范数规则化之一L0、L1与L2范数

    机器学习中的范数规则化之(一)L0、L1与L2范数今天我们聊聊机器学习中出现的非常频繁的问题:过拟合与规则化。监督机器学习问题无非就是“minimizeyourerrorwhileregularizingyourparameters”,也就是在规则化参数的同时最小化误差。个人理解一是因为L0范数很难优化求解,二是L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。所以大家才把目光和万千宠爱转于L1范数。

  7. 机器学习中的范数规则化

    我们先简单的来理解下常用的L0、L1、L2和核范数规则化。监督机器学习问题无非就是“minimizeyourerrorwhileregularizingyourparameters”,也就是在规则化参数的同时最小化误差。对机器学习也是一样,如果被我们人稍微点拨一下,它肯定能更快的学习相应的任务。OK,到这里,如果你在机器学习浴血奋战多年,你会发现,哎哟哟,机器学习的大部分带参模型都和这个不但形似,而且神似。

  8. ios – OpenGL ES屏幕投影矩阵和相机投影矩阵

    我有一个投影矩阵,来自增强现实应用程序中的相机校准,只要屏幕宽高比与相机图像宽高比匹配,一切都很好.当相机图像与屏幕边缘不匹配时,您将在跟踪中出现失真.问题场景:>iPad上的1280×720视频>iPhone5S上的640×480视频.工作场景:>iPad上的640×480视频>iPhone5S上的1280×720视频.目标:我想以一般方式处理此屏幕/相机宽高比不匹配.出现此问题是因为视图在屏幕

  9. delphi – 使用世界坐标SVG图像中的屏幕坐标的Hittest

    我一直在寻找SVG代码,发现:http://development.mwcs.de/svgimage.html这是第一个实际上适用于SVG的Delphi组件,但我离题。该组件使用GDI显示圆,曲线等GDI使用矩阵将世界坐标,旋转和失真转换为屏幕坐标。在所有这些GDI对象中有很多矩阵可供选择。换一种说法从SVG图像中读取的形状是由矩阵变成屏幕坐标的原语。由于SVG图像的设置方式,每个形状都有一个id,我想使用它来查看我用鼠标命中的区域。在第一种情况下,平移存储在世界坐标中,在第二次平移中存储在屏幕坐标中。

  10. javascript – 获取一个div的translate3d值?

    说一个div适用于它:如何使用jQuery检索这些值?解决方法取决于是否设置了z值,该值将被存储为矩阵或matrix3d.假设没有其他变换,对于2D矩阵,X和Y是最后两个值.对于3D矩阵,X,Y,Z,1是最后四位数.您可以使用正则表达式获取值:

随机推荐

  1. delphi – 主窗口按进程名称处理

    DelphiXe,Win7x64如何从进程名称(exe文件的完整路径)获取主窗口句柄,或至少一个类或窗口名称(如果该进程只有一个窗口).例:解决方法我同意Petesh的说法,你需要枚举顶级窗口并检查创建它的进程的模块文件名.为了帮助您开始枚举顶级窗口,这是一个delphi实现.首先,当你回调给你时,你需要一些与EnumWindows方法通信的方式.为此声明一条记录,该记录将保存您要查找的模块的文件

  2. 如何在Delphi中纯粹通过RTTI信息(即不使用任何实际对象实例)获取TObjectList的子项类型?

    我正在使用RTTI实现用于流式传输任意Delphi对象的通用代码,并且为了使其工作(更具体地说,为了使加载部分工作),我需要以某种方式获得TObjectList的子项类型<T>不使用任何实际对象实例的字段.要求不使用任何实际对象实例的明显原因是,在从流加载对象的情况下(仅基于要加载的对象的类类型的知识),我将不会有任何实例在加载完成之前完全可用–我宁愿只能访问相关类的纯RTTI数据.我希望能

  3. inno-setup – Inno Setup – 安装程序背景图片

    图像作为安装程序背景如何用inno5.5.9做到这一点?

  4. inno-setup – Inno Setup – 如何添加多个arc文件进行解压缩?

    使用InnoSetup解压缩弧文件.我希望有可能解压缩多个arc文件以从组件选择中安装文件(例如).但仍然显示所有提取的整体进度条.这可能吗?的回答的修改预备是相同的,参考其他答案.在ExtractArc中,为要提取的每个存档调用AddArchive.

  5. delphi – 如何在DataSet的帮助下在TAdvStringGrid中显示数据库中的BLOB图像

    解决方法CreateBlobStream正在创建一个TStream对象,而不是TMemoryStream.由于您不想将JPG写入数据库,因此应使用bmRead而不是bmReadWrite.我不习惯sqlite,但你必须确保使用合适的二进制日期类型.为了确保存储的图像真的是JPG,您应该编写JPG以进行测试,例如:

  6. inno-setup – 在Inno Setup的Code部分下载程序后运行程序

    如何运行我通过Internet下载的应用程序,在代码部分中使用,并等待该应用程序完成运行.我有,使用InnoTools下载程序,下载这两个文件,我想,在第二个完成下载后运行该下载,或jdk-8u111-windows-x64.exe,然后继续安装.解决方法使用其他下载插件,而不是ITD(请参阅下面的原因).例如,InnoDownloadPlugin.当您包含idp.iss时,它定义了一个全局IDP

  7. progress-bar – Inno Setup Run部分的简单进度页面

    我的安装程序非常简单,它基本上是:>欢迎页面>进展页面>最终页面欢迎页面和最终页面是标准页面.在Progress页面,我正在静默安装一堆其他程序.实际的脚本是在[Run]部分中安装每个程序.问题是酒吧达到100%然后停留在那里.我只能更改消息文本.我想要实现的是使用Pascal脚本显示进度,例如:这样我就可以显示更准确的进度条.这就是我所拥有的:问题是,当我构建安装程序时,它不显示欢迎页面.我做错了什么?

  8. delphi – 如何使“显示/隐藏桌面图标”设置生效?

    下面的代码调用SHGetSetSettings函数来隐藏桌面图标但它只是从视图菜单中取消选中“显示桌面图标”.我打电话给SHChangeNotify;更新桌面,但这不起作用?解决方法isa,要刷新桌面,您可以将F5键发送到progman窗口隐藏桌面图标的另一种方法是再次显示

  9. inno-setup – Inno Setup – 避免显示子安装程序的文件名

    我试图使用InnoSetup–Howtohidecertainfilenameswhileinstalling?(FilenameLabel)的想法Theonlysuresolutionistoavoidinstallingthefiles,youdonotwanttoshow,usingthe[Files]section.Installthemusingacodeinstead.UsetheEx

  10. inno-setup – Inno Setup磁力链接下载实施

    我目前正在使用InnoDownloadPlugin为我的安装程序下载文件,这个问题最大的问题是faila正确下载文件.因为连接不良等诸多原因.我想添加一种替代方法来下载文件,因此用户可以选择是否需要常规方式或torrent方式.我知道我可以使用aria2c.exe应用程序(https://aria2.github.io/),有人可以帮我实现它的inno设置代码吗?我需要的是使用torrent(ar

返回
顶部