使用 str() 查看“x”对象,您会看到以下内容:
..@ data :Formal class '.MultipleRasterData' [package "raster"] with 14 slots
.. .. ..@ values : num [1:2500, 1:3] 255 248 221 199 198 210 221 190 104 79 ...
.. .. .. ..- attr(*, "dimnames")=List of 2
.. .. .. .. ..$ : NULL
.. .. .. .. ..$ : chr [1:3] "red" "green" "blue"
....因此 1:50 x 1:50 值映射到三列。 X 值可能是0:2500 %% 50
y 值可能是0:2500 %/% 50
因此请记住,“原点”如果是栅格对象的左上角,但绘图函数的左下角,因此 20 的 y 值变为 50-20 或 30,这使您接近您所要求的(抱歉)将 y 序列放在第一位):
x@data@values[( ((1:2500 %/% 50 )- 30)^2 + ((1:2500 %% 50) - 20)^2 ) >=100, 1] <- 0
x@data@values[( ((1:2500 %/% 50 )- 30)^2 + ((1:2500 %% 50) - 20)^2 ) >=100, 2] <- 0
x@data@values[( ((1:2500 %/% 50 )- 30)^2 + ((1:2500 %% 50) - 20)^2 ) >=100, 3] <- 0
plotRGB(x)
draw.circle(20,20,10,border="blue")
逻辑是,标准的形式为 (x-dx)^2+(y-dy)^2 > r^2,其中 dx 和 dy 是圆的中心坐标,r 是半径 == 10。
问题改变后编辑:
对于每个颜色层,具有命名参数的代码将类似于使最暗的“红色”的代码。这给出了一个大致圆形的蒙版,尽管没有正确处理中心对齐的问题:
x@data@values[( ((1:(height*width) %/% (height*5/4) )- (height-circley*5/4) )^2 +
((1:(height*width) %% width) - circlex )^2 ) >= radius^2, 1] <- 0
进一步的实验表明,这看起来非常接近:
x@data@values[( ((1:(height*width) %/% (height) )- (height-circley) *5/4)^2 +
((1:(height*width) %% width) - circlex )^2 ) >= radius^2, 1] <- 0
plotRGB(x, asp=5/4, addfun=function() draw.circle(circlex,circley,radius,border="blue") )
显然你可以替换width/height
在 5/4 出现的任何地方,新宽高比的缩放因子。