- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
将平行四边形((RGB)点的二维数组)投影到三角形((RGB)点的二维数组)(在我的特定情况下,将矩形投影到具有相同边长的直角三角形)的伪代码算法是什么(等腰),在我的例子中,斜边的大小与矩形的最大边相同)质量可能会丢失。那么如何在伪代码中执行这样的操作呢?
所以通常我们有例如 300x200
我们想把它扭曲成 150 高和 200 宽的三角形
烟花 CS5 - 对我来说不是正确的结果
使用 photoshop CS5 正确结果
所以我想知道 photoshop 进行转换的伪代码是什么?
最佳答案
我不确定我是否误解了您的问题,但这是我的想法。我假设投影将使得三角形的斜边与矩形的最长边的方向相同,因为你说它们的大小相同。一些粗略的图片(不按比例):
矩形 H=4,W=10
---------
| |
| |
---------
三角形 Hyp=10,S1=8,S2=6
.
. |
. |
--------
所以我的建议是进行映射,使矩形的“ block ”等同于带有三角形的点,并且每个三角形点是相关矩形 block 的 RGB 平均值,注意 block 可能会重叠,具体取决于原始对象的比例。
更具体一点,回到上面的例子,首先是比率,高度比率是固定的,矩形是4高,三角形是6高,所以对于三角形垂直方向的每个像素考虑6/4,或者1.5矩形。现在有两个选项来处理“.5”,您可以考虑向上或向下舍入并仅使用整 block ,或者您可以对小数部分使用权重。由于后一种情况不那么微不足道,我们将进一步研究它。
当我们垂直移动时,任何小数部分都将转换为该行像素的小数权重,因此如果我们垂直平均并且我们的像素为 128 和 137(为简单起见仅查看一个分量),那么我们的平均值将是
(128+(0.5*137))/1.5 = (128+68.5)/1.5 = 196.5/1.5 = 131
现在,由于我们正在查看小数部分,因此我们需要跟踪我们未使用的小数部分,因此如果上面的下一个像素是 100,我们将要查看
((137*0.5)+100)/1.5 = (68.5+100)/1.5 = 168.5/1.5 = 112.3
现在我们遵循类似的策略,逐行垂直向上移动三角形,随着三角形宽度的减小调整比率,因此对于 hypotenuse=rectangle 的底边,这通常是 1。再往上你可能会有这样的比率为 1.23,可以进行上述计算。
最后是一些粗略的伪代码:
map(rectangle, triangle) {
decimal yRatio = triangle.height / rectangle.height
decimal lastY = 0;//we need decimal indeices for fractional averages
for each line in dest height (yIndex, 0 based) {
//here you could even find the average width of the rectangle
//over the block height, but we won't bother
decimal xRatio = triangle[yIndex].width / rectangle[floor(yIndex*yRatio)].width
decimal lastX = 0; //again a decimal for fractional averages
for each pixel in dest line width (xIndex, 0 based) {
decimal pixelAverage = 0;
decimal tempYRatio = yRatio;
decimal destY = yRatio * yIndex;
//Here we calculate the source pixel block average
while(tempYRatio > 0) {
//the portion of this row of pixels we use is the minimum
//of the distance to the next integer, and what we need
decimal yFraction = minimum(tempYRatio, nextInt(destY) - destY);
decimal tempXRatio = xRatio;
decimal destX = xRatio * xIndex;
while(tempXRatio > 0) {
decimal xFraction = minimum(tempXRatio, nextInt(destX) - destX);
//now add the weighted pixel to the average
average += rectangle[floor(destY)][floor(destX)]*xFraction*yFraction;
tempXRatio -= xFraction; //reduce the block size
destX += xFraction; //and shift the source index
}
tempYRatio -= yFraction; //reduce the block size
destY += yFraction; //and shift the source index
}
destination[yIndex][xIndex] = average / (xRatio*yRatio);
}
}
}
//a helper function to find the next integer value
integer nextInt(decimal d) {
integer ret = ceiling(d);
return d == ret ? d+1 : ret;
}
这超出了我的想象,所以我不能保证它是完全正确的,但它至少应该是一个好的开始,对各个像素的每个 RGB 分量执行适当的平均。
关于algorithm - 从哪里获得用于将 RGB 平行四边形投影到 RGB 三角形的伪代码算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4632449/
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!