我已经生成了一个类似的情节
figure; hold;
axis([0 10 0 10]);
fill([ 1 1 5 5], [5 1 1 5],'b')
Run Code Online (Sandbox Code Playgroud)
现在我想将这个情节作为一个矩阵,以便我可以用高斯过滤博客.谷歌我发现这个线程在MATLAB Central上用Rasterizing Plot to Image.我试过了,但我只能让它适用于线条或功能图.
你有什么想法?
对于碰撞测试,我需要光栅线.bresenham算法几乎按照预期的方式工作,但有一个缺陷就是产生一条线:
![]()
我需要:

我目前的实现(基于http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#Simplification):
public boolean isInsideLine(int x1, int y1, int x2, int y2) {
final int dx = abs(x2 - x1), dy = abs(y2 - y1);
final int sx = x1 < x2 ? 1 : -1, sy = y1 < y2 ? 1 : -1;
int err = dx - dy;
while (true) {
if (isInside(x1, y1)) //Lookup in pixel array
return true;
if (x1 == x2 && y1 == y2)
break;
final int e2 = err …Run Code Online (Sandbox Code Playgroud) 我正在光栅化以下简单的html + svg + foreignObject html
<html>
<head>
<meta charset="UTF-8">
<!--reset stylesheet -->
<link rel="stylesheet" type="text/css" href="https://phantomjs.googlecode.com/git-history/cbdd80e98ea1eb29d5d3a9c65c84798b472b59b1/website/reset.css" />
<style>
p {
border: 1px solid red;
font-size: 15px !important;
}
svg {
outline: 1px solid purple;
}
</style>
</head>
<body style="height: 1050px; width: 1050px; max-width: 1050px; max-height: 750px;">
<svg style="width: 1050px; height: 750px;">
<foreignobject height="40" requiredfeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" width="45" x="45" y="45">
<body xmlns="http://www.w3.org/1999/xhtml">
<p>Oh when the sun begins to shine.</p>
</body>
</foreignobject>
</svg>
</body>
</html>Run Code Online (Sandbox Code Playgroud)
使用这个简单的光栅化脚本:
webPage = require 'webpage'
args = (require …Run Code Online (Sandbox Code Playgroud) 我正在使用Paper.js来绘制图像,添加文本等.然后我需要对图像进行所有草图绘制并将其全部发送回服务器.具体来说,我遇到路径栅格化的问题.我正在尝试使用
paper.project.layers[0].rasterize();
Run Code Online (Sandbox Code Playgroud)
但是当我在图像上执行此操作时,我没有让线条进行栅格化.我结束了
data:,
Run Code Online (Sandbox Code Playgroud)
而不是以"data:image/png; base64"为前缀的base64编码图像.这是一个Paper.js 草图,我有这个工作.要使用它,请在kitty周围单击几次以绘制几行.一旦有两行,就会打开一个新窗口,显示带有红线的光栅化图像.
它适用于草图,但不适用于我自己的代码.
这是我管理绘图的React类:
var DrawingTools = React.createClass({
componentDidUpdate: function() {
// Initial path object, will be reset for new paths after Alt is released
var path = this.newPath();
// On mousedown add point to start from
paper.project.layers[0].on('mousedown', function(event) {
if(event.event.altKey && !event.event.ctrlKey) { // Alt key to add a path, but disallow attempting to add text at the same time
if(path.lastSegment == null) {
path.add(event.point, event.point);
} else {
path.add(path.lastSegment.point, path.lastSegment.point)
}
} …Run Code Online (Sandbox Code Playgroud) 当使用Bresenham 线绘制算法绘制一条线时,该线可能不在所写入位图的边界内 - 裁剪结果以使它们适合所写入图像的轴对齐边界会很有用。
虽然可以先将线条剪裁到矩形,然后再绘制线条。这并不理想,因为它通常会给线条稍微不同的倾斜度(假设正在使用 int 坐标)。
由于这是一个如此原始的操作,是否有既定的方法可以在保持相同形状的同时剪切线?
如果有帮助,这里是该算法的参考实现- 它使用 int coords,避免在绘制线条时进行 int/float 转换。
我花了一些时间研究这个:
我使用 R 分析数据,使用 ggplot 创建绘图,使用 tikzDevice 打印它们,最后使用 Latex 来创建报告。问题是由于乳胶的内存限制,具有许多点的大图会失败。我在这里找到了https://github.com/yihui/tikzDevice/issues/103一个在打印 tikz 文件之前光栅化绘图的解决方案,它允许单独打印点和文本。
require(png)
require(ggplot2)
require(tikzDevice)
## generate data
n=1000000; x=rnorm(n); y=rnorm(n)
## first try primitive
tikz("test.tex",standAlone=TRUE)
plot(x,y)
dev.off()
## fails due to memory
system("pdflatex test.tex")
## rasterise points first
png("inner.png",width=8,height=6,units="in",res=300,bg="transparent")
par(mar=c(0,0,0,0))
plot.new(); plot.window(range(x), range(y))
usr <- par("usr")
points(x,y)
dev.off()
# create tikz file with rasterised points
im <- readPNG("inner.png",native=TRUE)
tikz("test.tex",7,6,standAlone=TRUE)
plot.new()
plot.window(usr[1:2],usr[3:4],xaxs="i",yaxs="i")
rasterImage(im, usr[1],usr[3],usr[2],usr[4])
axis(1); axis(2); box(); title(xlab="x",ylab="y")
dev.off()
## this works
system("pdflatex test.tex")
## now with ggplot
p …Run Code Online (Sandbox Code Playgroud) 我无法以可靠的方式制作出Matlab新的图形引擎(HG2)显示行和标记,这意味着在轴/屏幕中的每个地方都可以相同地显示/呈现.
为了证明这个问题,我编写了一个简单的脚本(参见文章末尾),并将R2014a(使用Matlab旧HG1引擎)与R2016b(因此使用Matlab新HG2引擎)下的结果进行了比较,两者均用于画家和opengl渲染器.
(您可能会在脚本中注意到我已经尝试停用我所知道的任何类型的HG2平滑.尽管这确实会改变一些事情,但是描述的一般问题行为是否会发生平滑处理.)

(我担心这样会调整图像的大小,从而导致图像失败,所以这里是图像本身的直接链接)
R2014a(HG1)和画家渲染器:如果你放大图像,你可以检查每个标记都是像素完美的 - 无论它们在哪里被绘制,它们都是完全相同的.每条绿线正好是1像素宽.
R2014a(HG1)&opengl渲染器:每条绿线正好是1像素宽,但标记不显示/绘制彼此相同.
R2016b(HG2)&painters renderer:奇怪的是,与HG1和opengl的结果相似.线是正确的宽度(显示与HG1略有不同,但至少它们是一致的),但标记在整个轴上不同.
R2016b(HG2)和opengl渲染器:标记都是相同的(尽管我喜欢它们较少,这是一个主观问题,重要的是它们都是相同的),但你可以看到三条绿线并非所有预期的宽度1像素:顶部和底部宽度为2像素,仅绘制中间宽度为1像素的像素.
关于如何使两个渲染器中的任何一个在HG2中表现正确(即在图像中的任何位置绘制相同的东西)的任何想法?
其他注意事项:
如果可能的话,我更愿意使用opengl,因为出于某种原因,画家看起来非常慢(至少是相机控制)甚至是"合理"数量的数据点(即数千)与HG2.当然,除非你也知道如何使画家在HG2一样快,因为它在HG1.
虽然测试代码很简单,但实际上我需要在非常精细的GUI(自定义uimenu,uicontrols,面板,回调等)中使用它.虽然我不知道这可能很重要,但显然,例如,使用uifigure而不是图形的潜在解决方案对我来说是不可行的.
有关信息,这是我输入时得到的opengl('info'):
在Matlab R2014a中:
Version = 4.0.0 - Build 9.18.10.3131
Vendor = Intel
Renderer = Intel(R) HD Graphics 4600
MaxTextureSize = 8192
Visual = 05 (RGB 32 bits(08 08 08 08) zdepth 24, Hardware Accelerated, Opengl, Double Buffered, Window)
Software = false
# of Extensions = 139
Driver Bug Workarounds:
OpenGLBitmapZbufferBug = …Run Code Online (Sandbox Code Playgroud) 我一直在努力构建一个简单的3D图形引擎,我正在尝试找到一个好的基于整数的线光栅化算法.(我不是想重新发明轮子,我试图更深入地了解轮子).
是否有任何线光栅化算法不依赖于任何浮点数学?
谢谢.
有没有人知道一些免费或不免费的库,用于将svg转换为光栅图像(最好是png).
我看到有ImageMagic,GraphicMagic,librsvg.但我无法弄清楚如何使用它们或适合我的问题.我需要从我的代码中以编程方式进行转换.
我正在尝试以正常填充模式渲染基元,然后作为线框.
渲染代码:
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.9f, 0.9f, 0.9f, 1);
// reset matrix
glLoadIdentity();
// fill display list
glColor3c(150, 255, 255);
glCallList(lDList);
// wireframe display list
glColor3f(0, 0, 0);
glLineWidth(10);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINES);
glCallList(lDList);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
Run Code Online (Sandbox Code Playgroud)
显示列表创建代码:
lDList = glGenLists(1);
glNewList(lDList, GL_COMPILE);
glBegin(GL_QUADS);
glVertex3i(-1, -1, 0);
glVertex3i(1, -1, 0);
glVertex3i(1, -1, -25);
glVertex3i(-1, -1, -25);
glEnd();
glEndList();
Run Code Online (Sandbox Code Playgroud)
glColor3c宏:
#define glColor3c(r, g, b) glColor3f(r / 255, g / 255, b / 255)
Run Code Online (Sandbox Code Playgroud)
我希望得到一个青铜色的平面,周围有一个黑色的框架,但所有这一切都发生在我第二次渲染显示列表时,它只是填充和绘制整个事物,覆盖另一个图元的像素.我最终得到了我想要绘制的平面,但它只是黑色(我为"版本"行指定的颜色).
任何其他可能有用的信息都是我使用SDL,在Windows 7上使用MSVC++ 2010.我没有对glEnable 进行任何调用,因此我没有启用任何奇怪的设置会弄乱它,或者,也许解决问题.我唯一的OpenGL设置代码设置了投影和模型视图矩阵,然后创建了显示列表.
显然我的问题是为什么我第二次绘制显示列表是填充原语而不是创建行?我该如何解决?