我必须向像素数组添加一个三角形。这是我所拥有的:
我可以用以下代码填充我的图像:
for (let i = 0; i < pixels.length; i+=4) {
pixels[i] = color.r;
pixels[i+1] = color.g;
pixels[i+2] = color.b;
pixels[i+3] = color.a;
}
Run Code Online (Sandbox Code Playgroud)
如何计算哪些像素需要填充颜色?
谢谢 !
编辑:也许我应该发展一点。我设法绘制了三角形的点,但我不知道如何填充该区域。我还想考虑性能,并避免查看每个像素。以下是我如何得出要点:
static getIndex(x, y, width) {
return 4 * (width * y + x);
}
static drawTriangle(triangle, img) {
for (let i = 0; i < triangle.points.length; i++) {
let point = triangle.points[i];
for (let a = -5; a …Run Code Online (Sandbox Code Playgroud) 任何人都知道如何加载 .AI 文件(Adobe Illustrator),然后将矢量光栅化/渲染为位图,这样我就可以生成例如。来自它的 JPG 还是 PNG?
如果可能的话,我想生成缩略图 + 在 PNG 中渲染具有透明背景的大版本。
如果您知道 .AI 的规格,那当然是“可能的”,但是有没有人可以分享任何知识或代码?或者只是一些组件的链接?
C# .NET 请:o)
代码最有趣,因为我对读取矢量点和绘制样条曲线一无所知。
Bresenham 的画线算法是众所周知的,而且很容易实现。
虽然有更高级的方法来绘制抗锯齿线,但我有兴趣编写一个基于浮点坐标绘制单个像素宽度的非抗锯齿线的函数。
这意味着虽然第一个和最后一个像素将保持不变,但它们之间绘制的像素将根据两个端点的子像素位置产生偏差。
原则上这不应该那么复杂,因为我假设可以使用子像素偏移来计算error绘制线条时使用的初始值,并且算法的所有其他部分保持不变。
无子像素偏移:
X###
###X
Run Code Online (Sandbox Code Playgroud)
假设右手点有一个靠近顶部的子像素位置,这条线可能如下所示:
以子像素偏移为例:
X######
X
Run Code Online (Sandbox Code Playgroud)
是否有一种经过验证的真实方法来绘制考虑亚像素坐标的线条?
笔记:
GL_LINE,但从快速搜索中我没有在网上找到任何答案 - 可能使用了错误的搜索词?如何根据给定示例中的以下条件重新分类(子集)栅格r1(与 具有相同的维度和范围r2)r2。
状况:
r2是>0.5,保留对应值和相邻的2个网格细胞旁0.5的值(即,具有值缓冲网格单元>0.5中r2,以在所有方向上环绕两个栅格)中r1并改变其它值为0。IE。我如何更改网格单元格的值,r1以便它给出对应于>0.5值网格单元格的值及其缓冲(环绕)中每个方向的两个网格单元格r2。
如果我只需要获取网格单元,>0.5我可以通过以下代码轻松获得,但是,我还想提取该>0.5值以及 2 个周围网格单元的值。
示例计算代码是:
set.seed(150)
r1 <- raster(ncol=10, nrow=5) #Create rasters
values(r1) = round(runif(ncell(r1),5,25))
r2 <- raster(ncol=10, nrow=5)
values(r2) = round(runif(ncell(r2),0.1,1))
selfun <- function(x,y) {
ifelse( x >0.5, y,0)
} # It works only for >0.5 gridcells, i need this gridcells and its adjacent
#two gridcells in each direction. …Run Code Online (Sandbox Code Playgroud) 我正在Rasterize (write over existing raster)QGIS 中使用该工具 - 但是,如果您从命令行或 python 调用 gdal,则会出现同样的问题。
我正在将矢量特征刻录到栅格中,其值基于属性表中的字段。
一切正常,工作正常,除非目标栅格大于 4GB BigTiff 而不是常规 geotiff。如何使用错误中提到的 bigtiff 选项?
错误是:
'ERROR 1: TIFFAppendToStrip:Maximum TIFF file size exceeded. Use BIGTIFF=YES creation option.
Run Code Online (Sandbox Code Playgroud)
代码如下:
gdal_rasterize -a burn_value -l shapefile_name C:/Users/Cate/Folder/shapefile_name.shp C:/Users/Cate/Folder/raster_name.tif
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 C++ 在 Windows 控制台上构建一个简单的 2D 应用程序来显示各种基元,所以我从最基本的一个开始:三角形。我可以正确显示三角形的轮廓和顶点,但在填充时遇到问题。我遇到了这里介绍的一些光栅化算法:http : //www.sunshine2k.de/coding/java/TriangleRasterization/TriangleRasterization.html并决定我会采用第一种方法。我复制了平底三角形案例的代码,但是这在我的应用程序上似乎无法正常工作,我不知道问题的原因是什么。
我的结果:
主要的()
screen.fillFlatBottomTriangle(30,10, 10, 140/4, 256/2, 140/4, block_char, FG_CYAN);
screen.drawTriangle(30,10, 10, 140/4, 256/2, 140/4, block_char, BG_DARK_GREY);
screen.drawPixel(30,10,block_char,FG_RED);
screen.drawPixel(10,140/4,block_char,FG_GREEN);
screen.drawPixel(256/2,140/4,block_char,FG_MAGENTA);
Run Code Online (Sandbox Code Playgroud)
填充平底三角形
//http://www.sunshine2k.de/coding/java/TriangleRasterization/TriangleRasterization.html
void Screen::fillFlatBottomTriangle(int x1, int y1, int x2, int y2, int x3, int y3, short character, short color)
{
float invslope1 = (x2 - x1) / (y2 - y1);
float invslope2 = (x3 - x1) / (y3 - y1);
float curx1 = x1;
float curx2 = x1;
for (int …Run Code Online (Sandbox Code Playgroud) 通常在计算机科学的时候我已经从一些a到b的间隔[a, b).在栅格化几何图元时这是真的吗?
例如,当我有开始于位置的线(0, 0)和结束于位置(0, 10)将所述线包含点(0, 10)使用平行投影时与1个GPU单元映射到屏幕上的1个像素?
编辑:相同条件下的相同问题,但纹理:
如果我有一个纹理2x2映射四从(0, 0)到(2, 2)使用(0, 0)到(1, 1)映射会是"像素完美",一个从纹理象素上的一个像素在屏幕上或将纹理缩放?如果间隔是[0, 2]四边形将是3x3并且纹理必须缩放...
LATER EDIT:这可能会有所帮助:http://msdn.microsoft.com/en-us/library/windows/desktop/bb219690%28v=vs.85%29.aspx
我一直在努力尝试用粘在网格上的鼠标画一条线。我正在使用 Bresenhams 线算法。
但是我需要它来保留顺序,因此如果用户向左绘制,它将按该顺序给我点数。
WorldTile 是一个在网格上充当节点的类。
WorldBoard 是一组 WorldTiles。
private static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
public static IEnumerable<WorldTile> GetWorldTilesOnLine(int x0, int y0, int x1, int y1)
{
bool steep = Mathf.Abs(y1 - y0) > Mathf.Abs(x1 - x0);
if (steep)
{
Swap<int>(ref x0, ref y0); // find out how this works
Swap<int>(ref x1, ref y1);
}
if (x0 > x1)
{
Swap<int>(ref x0, ref x1); …Run Code Online (Sandbox Code Playgroud)