我正在尝试开发一种算法,将一个“形状”变成另一个“形状”。两种形状都是任意的,甚至可能有更小、不连贯的形状。
到目前为止,我的基本想法如下:定位形状的边缘,沿着这些边缘放置点,然后对目标图像执行相同的操作,然后将这些点移动到它们的目标。
这是一个例子:
我只是不知道从哪里开始。上图是一种简化,实际用例具有更复杂的形状/轮廓。我的主要问题是:如何处理不相交的形状?我能想到的最好办法是找出两部分之间最近的点,并将它们连接在一起作为路径的一部分。但我将如何实现呢?
我还没有任何代码,我还在计划阶段。我想我要问的是,是否有人可以将我链接到任何可能有帮助的资源,或提供任何指示。搜索谷歌已经产生了一些有趣的变形算法,但它们都处理完整的图像并涉及将图像分解成碎片以 reshape 它们,这不是我想要的。
请注意,这将在 JavaScript 中使用,但如果更容易,也可以在 PHP 中预先计算。
最佳答案
最好将问题分解成多个可以独立解决的小问题。这样你在解决这个问题后也拥有独立的功能,可以添加到一些全局模块集合中。
首先我们需要弄清楚 from_shape 中的哪个像素到 to_shape 中的哪个像素。
我们可以用以下方法计算:
将 to_shape 放在 from_shape 上。
对于 from_shape 中的每个像素,找到其最接近的 to_shape 像素。
形状中的每个像素都必须有一个唯一的 ID,例如,该 ID 可以是它的 xy 位置。
现在您可以记录 from_shape 中的每个唯一像素,以及它在 to_shape 中到达的唯一像素。
删除重叠的形状,回到原来的形状,
现在 from_shape 中的每个像素都知道它在 to_shape 中的目的地。
我们还需要知道每个像素有哪些“ sibling ”。
兄弟是紧挨着另一个像素的像素。
要找到它,请转到给定像素,从它收集半径为 1 的所有像素,所有这些像素都是黑色的……是来自像素的 sibling 。当像素行进到目的地时,此信息对于将形状保持为一个单元是必需的。跳过 sibling 会大大加快和简化变形,但如果没有它们,变形过程中形状可能会变得支离 splinter 。可能想从无兄弟版本开始,看看结果如何。
最后我们实现变形:
有 morph_time_duration。
对于 from_shape 中的每个像素,在 to_shape 中找到它到目的地的距离。
该距离除以 morph_time_duration,就是变形期间像素的速度。
此外,朝向目的地的 Angular 是行进的 Angular 。
所以现在你有了速度和 Angular 。
因此在变形过程中的每一帧,给定的 from_pixel 现在知道行进的方向、速度,并且它也知道它的 sibling 。因此,在每一帧中,在以其速度沿其方向行进后,只需在其新位置绘制像素。然后为所有这些像素兄弟画一条线。
这将显示您的变形。
关于php - 将一种形状变形为另一种形状的算法。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13576746/
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],
我写了很多initialize代码,将attrs设置为参数,类似于:classSiteClientattr_reader:login,:password,:domaindefinitialize(login,password,domain='somedefaultsite.com')@login=login@password=password@domain=domainendend有没有更像Ruby的方式来做到这一点?我觉得我在一遍又一遍地编写相同的样板设置代码。 最佳答案 您可以使用rubyStruct:classMyClass或
在使用rails4和https://github.com/globalize/globalize的情况下,我应该如何为我的模型编写表单?用于翻译。我想以一种形式显示所有翻译,如下例所示。我在这里找到了解决方案https://github.com/rilla/batch_translations但我不知道如何实现它。这个“批量翻译”是一个gem还是什么?以及如何安装它。EditingpostEnglish(defaultlocale)SpanishtranslationFrenchtranslation 最佳答案 批处理翻译gem很旧
我使用Ruby编程已经有一段时间了,现在只使用Ruby的标准MRI实现,但我一直对我经常听到的其他实现感到好奇。前几天我在读有关Rubinius的文章,这是一个用Ruby编写的Ruby解释器。我试着在不同的地方查找它,但我很难弄清楚这样的东西到底是如何工作的。我在编译器或语言编写方面从来没有太多经验,但我真的很想弄明白。一门语言究竟如何才能被自己解释?编译中是否有一个我不明白这有意义的基本步骤?有人可以像我是个白痴一样向我解释这个吗(因为无论如何这都不会太离谱) 最佳答案 它比你想象的要简单。Rubinius并非100%用Ruby编
Ruby是完全面向对象的语言。在ruby中,一切都是对象,因此属于某个类。例如5属于Objectclass1.9.3p194:001>5.class=>Fixnum1.9.3p194:002>5.class.superclass=>Integer1.9.3p194:003>5.class.superclass.superclass=>Numeric1.9.3p194:005>5.class.superclass.superclass.superclass=>Object1.9.3p194:006>5.class.superclass.superclass.superclass.su
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它